Dengan zfs, jika Anda memiliki copies=2
dan kemudian Anda kehilangan drive yang berisi beberapa salinan itu, bagaimana Anda memberi tahu sistem bahwa ia harus membuat salinan baru dari blok data untuk file yang terpengaruh? Atau apakah zfs mulai menambahkan blok data untuk salinan tambahan segera setelah mengetahui tentang blok data yang buruk?
Akankah scrub melakukan ini?
(v0.6.0.56-rc8, ZFS pool versi 28, ZFS filesystem versi 5, Ubuntu 11.10)
For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state).
Saya menganggap salinan = 2 atau 3 tidak dianggap sebagai konfigurasi yang berlebihan.copies=1
dan Anda telah menaikkannyacopies=2
, maka Anda mungkin ingin resilver / rescrub sesudahnya - yang akan membuat instance ini. Tapi @ jilliagre benar: blok ditto bukan merupakan konfigurasi yang berlebihan. Tidak ada jaminan bahwa blok ditetapkan pada perangkat lain, bahkan jika Anda memiliki beberapa perangkat dalam kumpulan.Saya menemukan pertanyaan ini sangat menarik, dan setelah menghabiskan satu jam menuangkan dokumentasi, saya menyelam ke dalam kode. Inilah yang saya temukan.
Pertama, beberapa terminologi. Blok Ditto (yang merupakan salinan-salinan ini, sebagai lawan dari mirror) secara otomatis dibuat pada penulisan tetapi mungkin atau mungkin tidak pada perangkat virtual yang sama (vdev) seperti salinan aslinya. Di sisi lain, blok cermin selalu tercermin ke perangkat virtual lain.
Namun, kode mengacu pada kedua jenis blok sebagai anak-anak. Anda akan melihat di sini bahwa blok hanya anak-anak dengan
io_vd == NULL
ini (ini ada dalam fungsi tulis). Untuk blok cermin,io_vd
akan diatur ke perangkat virtual yang sesuai (disk kedua Anda, misalnya).Dengan mengingat hal itu, ketika sampai ke bagian baca , itu memperlakukan semua anak (apakah mereka mencerminkan atau memblokir blok) sebagai berpotensi tidak aman jika tidak mengandung yang diharapkan
good_copies
, dan menulis ulang mereka sesuai kebutuhan . Jadi sepertinya jawaban untuk pertanyaan Anda adalah - ya, itu akan menulis ulang ketika Anda memiliki setidaknya satu salinan yang baik, dan salah satu dari yang berikut:Fiuh! Mungkin seseorang dapat menunjukkan kekurangannya, tapi saya senang belajar tentang ZFS melalui latihan kecil ini, dan saya harap ini membantu!
sumber
@ jlliagre dan lainnya yang tampaknya berpikir bahwa seluruh zpool akan mati jika salah satu disk (vdevs) mati tetapi kolam tidak berlebihan (mirror / raidz). Ini tidak benar; kolam multi-disk akan selalu bertahan kegagalan disk tunggal lengkap bahkan jika itu bukan cermin atau raidz.
ZFS Metadata selalu disalin setidaknya 2 kali sehingga total kegagalan dari disk lengkap (atau bagian dari itu) tidak akan menghapus sistem file. Selain itu, banyak file, terutama yang lebih kecil, tidak akan tersebar di semua disk dan karena itu tidak perlu disalahkan oleh kegagalan disk. OP bertanya tentang kasus kumpulan multi-disk menggunakan blok ditto (salinan data pengguna> 1). Di sini, kegagalan disk tunggal lengkap
harus tidak pernah menghasilkan hilangnya data.ZFS akan selalu mencoba untuk menempatkan blok-blok jauh jauh dari blok asli, dan untuk kumpulan dengan banyak vdev, ini selalu berarti pada vdev lain (pengecualian mungkin di mana satu vdev> 50% dari kumpulan, yang akan sangat tidak biasa) . Meta data sistem file juga selalu disalin +1 atau +2 kali lebih banyak dari level ditto, sehingga akan selalu selamat dari kegagalan disk. Selain itu, jika Anda memiliki kumpulan lebih dari tiga disk, Anda harus dapat kehilangan hingga setengahnya tanpa kehilangan data; ZFS menyimpan blok-blok ditto pada disk berikutnya agar selama Anda tidak pernah kehilangan dua disk yang berdekatan, Anda tidak akan pernah kehilangan data. (tiga kegagalan disk tambahan untuk ditto = 2).Ketika ada salinan data yang cukup untuk mengakses file (apakah salinan itu dari blok ditto, mirror, atau raidz), maka semua salinan data yang hilang diperbaiki ketika file diakses. Ini adalah tujuan dari scrub; baca semua data dan perbaiki yang salah dengan memanfaatkan salinan yang berlebihan. Jadi untuk menjawab pertanyaan OP secara langsung, Anda hanya perlu melakukan scrub setelah mengganti drive yang gagal, dan semua salinan akan dikembalikan.
Seperti biasa, Anda dapat dengan mudah bereksperimen dengan konsep-konsep dengan membuat kumpulan yang vdev-nya untuk mendukung penyimpanan hanya file jarang. Dengan menghapus atau merusak file vdev Anda dapat mensimulasikan segala jenis kegagalan, dan dapat memverifikasi integritas kumpulan, sistem file, dan data di sepanjang jalan.
EDIT: setelah bereksperimen, sepertinya zfs akan gagal pool jika disk gagal dalam multi-disk non-redundant pool dengan salinan> = 2. Korupsi data parital pada satu disk atau lebih harus tetap bertahan dan harus diperbaiki oleh scrub.
sumber