Bagaimana cara mengganti disk yang belum gagal dengan aman dalam array Linux RAID5?


26

Saya memiliki array perangkat lunak RAID5 (Linux md) pada 4 disk.

Saya ingin mengganti salah satu disk dengan yang baru, tanpa meletakkan array dalam keadaan rusak , dan jika mungkin, online. Bagaimana itu mungkin?

Ini penting karena saya tidak ingin:

  • mengambil risiko menekankan disk lain sehingga orang mungkin crash saat membangun kembali,
  • mengambil risiko berada dalam "negara tanpa paritas" jadi saya tidak memiliki jaring pengaman untuk beberapa waktu.

Saya kira melakukannya secara online adalah terlalu banyak bertanya dan saya harus menyalin mentah-mentah ( dd) data dari disk lama ke yang baru offline dan kemudian menggantinya, tapi saya pikir secara teori itu mungkin ...

Beberapa konteks : Semua disk itu telah berputar hampir terus menerus selama lebih dari 5,5 tahun. Mereka masih bekerja dengan sempurna untuk saat ini dan mereka semua lulus dari swa-uji SMART (panjang). Namun, saya punya alasan untuk berpikir bahwa salah satu dari 4 disk itu tidak akan bertahan lebih lama (dugaan kegagalan prediksi).

Jawaban:


36

Menggunakan mdadm 3.3

Sejak mdadm3.3 (dirilis 2013, 3 September), jika Anda memiliki kernel 3.2+ , Anda dapat melanjutkan sebagai berikut:

# mdadm /dev/md0 --add /dev/sdc1
# mdadm /dev/md0 --replace /dev/sdd1 --with /dev/sdc1

sdd1adalah perangkat yang ingin Anda ganti, sdc1adalah perangkat yang disukai untuk melakukannya dan harus dinyatakan sebagai cadangan pada array Anda.

The --withpilihan adalah opsional, jika tidak ditentukan, setiap cadangan yang tersedia akan digunakan.

Versi mdadm yang lebih lama

Catatan: Anda masih membutuhkan kernel 3.2+ .

Pertama, tambahkan drive baru sebagai cadangan (ganti md0dan sdc1dengan perangkat RAID dan disk Anda, masing-masing):

# mdadm /dev/md0 --add /dev/sdc1

Kemudian, lakukan operasi penggantian salinan seperti ini ( sdd1menjadi perangkat yang gagal):

# echo want_replacement > /sys/block/md0/md/dev-sdd1/state 

Hasil

Sistem akan menyalin semua blok yang dapat dibaca dari sdd1ke sdc1. Jika sampai pada blok yang tidak terbaca, itu akan merekonstruksi dari paritas. Setelah operasi selesai, cadangan sebelumnya (di sini sdc1:) akan menjadi aktif, dan drive yang gagal akan ditandai sebagai gagal (F) sehingga Anda dapat menghapusnya.

Catatan: kredit diberikan kepada frostschutz dan Ansgar Esztermann yang menemukan solusi asli (lihat pertanyaan rangkap ).

Kernel yang lebih tua

Jawaban lain menyarankan:

  • Johnny 's pendekatan : mengkonversi array untuk RAID6, "ganti" disk, kemudian kembali ke RAID5,
  • Hauke Laging 's pendekatan : sebentar menghapus disk dari array RAID5, menjadikannya bagian dari RAID1 (cermin) dengan disk baru dan menambahkan bahwa cermin perjalanan kembali ke array RAID5 (teoritis) ...

2
mdadm --addmasih dibutuhkan sebelum --replaceakan bekerja. ( mdadm3.3, Ubuntu 15.10). Jika Anda melakukan --addsetelahnya --replace, penyalinan akan dimulai segera setelah cadangan ditambahkan. (Perangkat tetap ditandai sebagai "ingin penggantian").
Peter Cordes

3

Ini mungkin memenuhi persyaratan

  1. on line
  2. jangan menekankan disk apa pun kecuali yang harus diganti

Tetapi bahkan jika yang berikut ini mungkin berhasil Anda mungkin tidak akan menemukan rekomendasi semacam itu "di dalam buku" ...

Ide:

  1. Keluarkan disk OLD dari array (sebentar): mdadm --manage /dev/raid5 --fail /dev/OLD
  2. Buat perangkat md baru (RAID-1) dari disk TUA dan BARU: mdadm --build /dev/md42 --level=mirror --raid-devices=2 /dev/OLD /dev/NEW
  3. Pasang kembali RAID-1 dalam array (bukan / dev / OLD): mdadm --manage /dev/raid5 --re-add /dev/md42

Apa yang harus :-) terjadi:

  1. RAID-5 membuat / dev / md42 sinkron. Ini seharusnya tidak butuh waktu lama.
  2. RAID-5 biasanya beroperasi kembali (tetapi lebih lambat).
  3. / dev / NEW disinkronkan dengan / dev / OLD.

Tonton kemajuan sinkronisasi ( cat /proc/mdstatatau mdadm --monitor). Jika sinkronisasi selesai, keluarkan RAID-1 dari RAID-5, hentikan RAID-1, tambahkan kembali / dev / NEW ke RAID-5. Jika semuanya baik-baik saja, timpa superblok kunci mdraid pada / dev / OLD untuk menghindari masalah:mdadm --zero-superblock

Peringatan: Sinkronisasi RAID-5 cepat hanya dapat berfungsi jika Anda menggunakan bitmap. Jika Anda tidak memilikinya maka lebih baik lakukan tes dengan dummy RAID-5 (tanpa bitmap) terlebih dahulu. Atau tambahkan satu. Setidaknya menambahkan yang eksternal harus dimungkinkan. Kalau tidak, mungkin perlu untuk menghentikan RAID-5 sebelum mengubah perangkat. Jika Anda mem-boot dari RAID-5, ini akan menjadi sedikit rumit.


3

Jika Anda tidak keberatan menjalankan RAID-6 (2 disk paritas daripada 1), dan jika Anda menjalankan mdadmin 3.1.x atau lebih tinggi, Anda bisa mengonversi array RAID-5 ke RAID-6 untuk menambahkan disk paritas tambahan . Ini akan menempatkan array di bawah tekanan selama pembangunan kembali. Dan itu memiliki beberapa implikasi kinerja karena ada lebih banyak disk paritas untuk diperbarui selama penulisan.

Tetapi jika selesai dengan sukses, maka Anda dapat menyimpan disk yang gagal di tempatnya dan ketika akhirnya gagal, Anda masih memiliki perlindungan paritas untuk array. Saya pikir Anda dapat mengubah array dari RAID6 kembali ke RAID5 jika Anda tidak menunggu untuk menyimpannya sebagai RAID6.

Saya tidak tahu cara online untuk mempertahankan array sebagai RAID-5 dan mengganti disk tanpa meletakkan array dalam mode terdegradasi, karena saya pikir Anda harus menandainya sebagai gagal untuk menggantinya. Gagasan menyalin dd Anda mungkin merupakan cara untuk melakukannya.


@haukelaging FYI sekarang dimungkinkan karena kernel 3.2, lihat jawaban saya .
Totor
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.