Saya punya satu kumpulan zf yang berisi beberapa zvol dan dataset yang beberapa di antaranya juga bersarang. Semua dataset dan zvol secara berkala snapshotted oleh zfs-auto-snapshot. Semua dataset dan zvol juga memiliki beberapa snapshot yang dibuat secara manual.
Saya telah menyiapkan kolam terpencil yang karena kurangnya waktu, penyalinan awal melalui jaringan berkecepatan tinggi lokal melalui zfs send -R tidak lengkap (beberapa set data hilang, beberapa set data sudah ketinggalan jaman atau ada snapshots).
Sekarang pool secara fisik jauh melalui koneksi kecepatan lambat dan saya perlu secara berkala menyinkronkan pool jarak jauh dengan pool lokal, artinya data yang ada di pool lokal harus disalin ke pool jarak jauh, data yang hilang dari pool lokal harus dihapus dari pool jarak jauh, dan data yang ada di pool jarak jauh tetapi tidak di pool lokal harus dihapus dari kolam jarak jauh, dengan data yang berarti 'zvols', 'dataset' atau 'snapshots'.
Jika saya melakukan ini di antara dua sistem file biasa menggunakan rsync, itu akan menjadi "-axPHAX --delete" (itulah yang sebenarnya saya lakukan untuk membuat cadangan beberapa sistem).
Bagaimana cara menyiapkan tugas sinkronisasi sehingga zvols & dataset kumpulan jarak jauh (termasuk snapshot-nya) dapat disinkronkan dengan zvols, dataset & snapshots lokal?
Saya ingin menghindari transfer lewat ssh, karena kinerja throughput ssh yang rendah; Saya lebih suka mbuffer atau iscsi sebagai gantinya.
sumber
zfs send -R ...
? Jika Anda menyalurkan output melaluissh
, apakah Anda menonaktifkan karakter escape denganzfs send -R ... | ssh -e none ...
?zfs send -R -i pool@snap1 pool@snap2 | gzip --fast > /output/file.gz
Jawaban:
Penafian: Karena saya belum pernah menggunakan zvols, saya tidak bisa mengatakan apakah mereka berbeda dalam replikasi daripada sistem file atau snapshot normal. Saya berasumsi mereka, tetapi jangan mengambil kata saya untuk itu.
Pertanyaan Anda sebenarnya adalah beberapa pertanyaan, saya mencoba menjawabnya secara terpisah:
Cara mereplikasi / mirror pool lengkap ke lokasi terpencil
Anda harus membagi tugas menjadi dua bagian: pertama, replikasi awal harus lengkap, setelah itu replikasi tambahan dimungkinkan, selama Anda tidak mengacaukan snapshot replikasi Anda . Untuk mengaktifkan replikasi tambahan, Anda harus menyimpan snapshot replikasi terakhir, semuanya sebelum itu dapat dihapus. Jika Anda menghapus snapshot sebelumnya,
zfs recv
akan mengeluh dan membatalkan replikasi. Dalam hal ini Anda harus memulai dari awal lagi, jadi cobalah untuk tidak melakukan ini.Jika Anda hanya perlu opsi yang benar, mereka adalah:
zfs send
:-R
: kirim semuanya di bawah kumpulan atau dataset yang diberikan (replikasi berulang, diperlukan sepanjang waktu, termasuk-p
). Juga, saat menerima, semua snapshot sumber yang dihapus dihapus pada tujuan.-I
: sertakan semua snapshot menengah antara snapshot replikasi terakhir dan snapshot replikasi saat ini (hanya diperlukan dengan pengiriman inkremental)zfs recv
:-F
: perluas kumpulan target, termasuk penghapusan set data yang ada yang dihapus pada sumbernya-d
: buang nama kumpulan sumber dan gantilah dengan nama kumpulan tujuan (sisa jalur sistem file akan dipertahankan, dan jika perlu juga dibuat)-u
: jangan me-mount sistem file pada tujuanJika Anda lebih suka contoh lengkap, berikut ini skrip kecil:
Gunakan sesuatu yang lebih cepat dari SSH
Jika Anda memiliki koneksi yang cukup aman, misalnya IPSec atau OpenVPN tunnel dan VLAN terpisah yang hanya ada antara pengirim dan penerima, Anda dapat beralih dari SSH ke alternatif yang tidak dienkripsi seperti mbuffer seperti dijelaskan di sini , atau Anda dapat menggunakan SSH dengan enkripsi lemah / tidak ada enkripsi dan menonaktifkan kompresi, yang dirinci di sini . Ada juga situs web tentang mengatur ulang SSH menjadi lebih cepat, tetapi sayangnya saya tidak ingat URL - saya akan mengeditnya nanti jika saya menemukannya.
Untuk kumpulan data yang sangat besar dan koneksi yang lambat, mungkin juga berguna untuk transmisi pertama melalui hard disk (gunakan disk terenkripsi untuk menyimpan zpool dan mengirimkannya dalam paket tertutup melalui kurir, surat atau langsung). Karena metode pengiriman tidak masalah untuk mengirim / menerima, Anda dapat menyalurkan semuanya ke disk, mengekspor kumpulan, mengirim disk ke tujuannya, mengimpor kumpulan dan kemudian mengirimkan semua pengiriman tambahan melalui SSH.
Masalah dengan snapshot kacau
Seperti yang dinyatakan sebelumnya, jika Anda menghapus / memodifikasi foto replikasi Anda, Anda akan menerima pesan kesalahan
yang berarti perintah Anda salah atau Anda berada dalam kondisi tidak konsisten di mana Anda harus menghapus snapshot dan memulai dari awal.
Ini memiliki beberapa implikasi negatif:
Ada solusi yang mungkin untuk masalah-masalah itu, tetapi saya belum mencobanya sendiri. Anda dapat menggunakan
zfs bookmark
, fitur baru di OpenSolaris / illumos yang dibuat khusus untuk tugas ini. Ini akan membebaskan Anda dari manajemen snapshot. Satu-satunya downside adalah bahwa saat ini, hanya berfungsi untuk dataset tunggal, tidak secara rekursif. Anda harus menyimpan daftar semua dataset lama dan baru Anda dan kemudian memutarnya, membookmark, mengirim dan menerimanya, dan kemudian memperbarui daftar (atau database kecil, jika Anda mau).Jika Anda mencoba rute bookmark, saya akan tertarik untuk mendengar bagaimana hasilnya untuk Anda!
sumber
zpool
.-d 1
keduazfs list
perintah untuk membatasi kedalaman pencarian (tidak perlu mencari di bawah nama kumpulan). Ini menghindari penundaan lama pada kolam dengan banyak foto (mis. Kolam "cadangan" saya memiliki 320000 foto, danzfs list -r -t snapshot backup
membutuhkan waktu 13 menit untuk berjalan. Hanya butuh 0,06 detik dengan-d 1
). Thezfs destroy
perintah dalam untuk loop maka membutuhkan-r
pilihan untuk secara rekursif menghapus semua snapshot dengan snapname yang sama.Secara pribadi, saya akan membuat sendiri daftar zvols, dataset, dll di server jarak jauh yang tidak memiliki snapshot terkini, dan kemudian menjadikan snapshot tersebut mutakhir
zfs send
, walaupun ini memakan waktu dan banyak digunakan. bandwidth.Kemudian saya bisa terus menggunakan
zfs send
sejak saat itu dan tidak harus menemukan kembali roda dengan menulis kode sinkronisasi saya sendiri.rsync
bagus untuk filesystem lama tetapizfs send
jauh lebih baik untuk zfs - ia tahu persis blok mana yang telah berubah dalam snapshot dan hanya mengirimkannya , sementara rsync harus membandingkan file individual dan / atau cap waktu antara server lokal dan remote. hal yang sama berlakubtrfs send
untuk btrfs pools.Jika Anda hanya memiliki sedikit snapshot yang perlu dimutakhirkan, ini bisa dilakukan secara manual. Kalau tidak untuk melakukannya secara otomatis, Anda memerlukan daftar snapshot lokal terbaru vs snapshot jarak jauh, dan skrip untuk membandingkan versi dan kemudian
zfs send
snapshot lokal yang kedaluwarsa pada server rmeote.Itu akan cukup jika Anda hanya peduli dengan snapshot terbaru untuk setiap dataset. Jika Anda peduli dengan semua snapshot sebelumnya, jelas skrip Anda harus menanganinya juga .... dan itu menjadi BANYAK lebih rumit. Dalam beberapa kasus, Anda mungkin harus melakukan rollback pada server jarak jauh sehingga Anda dapat mengirim kembali snapshot menengah / yang hilang.
Jika Anda ingin koneksi yang aman ke server jarak jauh, Anda benar-benar punya banyak pilihan selain menggunakan
ssh
- atau mungkin membuat terowongan denganopenvpn
atau sesuatu dan menggunakannetcat
.sumber
export ZREP_R=-R
tidak berfungsi sama sekali. :(Lihat `zrepl ', di FreeBSD, yang bisa membuat hidup Anda, dan siapa pun yang ada di situ, jauh lebih mudah. Itu disajikan beberapa hari yang lalu selama BSDCan2018 di Ottawa. Itu terlihat menjanjikan dan mungkin menjadi solusi untuk masalah Anda
sumber
zrep adalah solusi all-in-one yang bagus, DAN memiliki dokumentasi + kait tentang cara mendapatkan transfer lebih cepat dari sekadar transfer SSH
https://github.com/bolthole/zrep
itu juga crossplatform: didukung di linux, freebsd, dan solaris / illumos
sumber