cara mirror satu arah seluruh zfs pool ke zfs pool lainnya

15

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.

Costin Gușă
sumber
Bagaimana Anda melakukan inisial Anda zfs send -R ...? Jika Anda menyalurkan output melalui ssh, apakah Anda menonaktifkan karakter escape dengan zfs send -R ... | ssh -e none ...?
Andrew Henle
Selain itu - Anda perlu memastikan koneksi Anda yang lambat memiliki bandwidth yang cukup untuk membuat salinan jarak jauh tetap terkini. Jika Anda mendapatkan lebih banyak perubahan pada sistem lokal daripada yang dapat Anda kirim ke sistem jarak jauh, Anda tidak akan pernah bisa menjaga salinan jarak jauh. Ambil aliran replikasi zfs tambahan dan simpan ke file. Jika file tersebut lebih besar dari jumlah data yang dapat Anda kirim ke situs jarak jauh dalam jumlah waktu di antara snapshot, Anda tidak akan pernah mengikuti. zfs send -R -i pool@snap1 pool@snap2 | gzip --fast > /output/file.gz
Andrew Henle
Anda juga dapat mencoba menggunakan skrip ini untuk melakukannya secara otomatis: github.com/psy0rz/zfs_autobackup/blob/master/README.md
edwin eefting

Jawaban:

11

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 recvakan 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 tujuan

Jika Anda lebih suka contoh lengkap, berikut ini skrip kecil:

#!/bin/sh

# Setup/variables:

# Each snapshot name must be unique, timestamp is a good choice.
# You can also use Solaris date, but I don't know the correct syntax.
snapshot_string=DO_NOT_DELETE_remote_replication_
timestamp=$(/usr/gnu/bin/date '+%Y%m%d%H%M%S')
source_pool=tank
destination_pool=tank
new_snap="$source_pool"@"$snapshot_string""$timestamp"
destination_host=remotehostname

# Initial send:

# Create first recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Initial replication via SSH.
zfs send -R "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"

# Incremental sends:

# Get old snapshot name.
old_snap=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$source_pool"@"$snapshot_string" | tail --lines=1)
# Create new recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Incremental replication via SSH.
zfs send -R -I "$old_snap" "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
# Delete older snaps on the local source (grep -v inverts the selection)
delete_from=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$snapshot_string" | grep -v "$timestamp")
for snap in $delete_from; do
    zfs destroy "$snap"
done

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

cannot send 'pool/fs@name': not an earlier snapshot from the same fs

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:

  1. Anda tidak dapat menghapus snapshot replikasi sampai snapshot replikasi baru berhasil ditransfer. Karena snapshot replikasi ini mencakup keadaan semua snapshot lainnya (yang lebih lama), ruang kosong dari file dan snapshot yang dihapus hanya akan direklamasi jika replikasi selesai. Ini dapat menyebabkan masalah ruang sementara atau permanen pada kumpulan Anda yang hanya dapat Anda perbaiki dengan memulai kembali atau menyelesaikan prosedur replikasi lengkap.
  2. Anda akan memiliki banyak snapshot tambahan, yang memperlambat perintah daftar (kecuali pada Oracle Solaris 11, di mana ini diperbaiki).
  3. Anda mungkin perlu melindungi snapshot terhadap penghapusan (tidak disengaja), kecuali oleh skrip itu sendiri.

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!

pengguna121391
sumber
terima kasih banyak atas jawaban terinci ini. Saya baru saja mengirim ... menerima a zpool.
Jitter
1
naskah yang bagus. Saya akan menambahkan -d 1kedua zfs listperintah 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, dan zfs list -r -t snapshot backupmembutuhkan waktu 13 menit untuk berjalan. Hanya butuh 0,06 detik dengan -d 1). The zfs destroyperintah dalam untuk loop maka membutuhkan -rpilihan untuk secara rekursif menghapus semua snapshot dengan snapname yang sama.
cas
5

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 sendsejak saat itu dan tidak harus menemukan kembali roda dengan menulis kode sinkronisasi saya sendiri. rsyncbagus untuk filesystem lama tetapi zfs sendjauh 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 berlaku btrfs senduntuk 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 sendsnapshot 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 dengan openvpnatau sesuatu dan menggunakan netcat.

cas
sumber
Bagaimana dengan menggunakan Zrep? bolthole.com/solaris/zrep
Xdg
tidak tahu, tidak pernah menggunakannya. sepertinya itu akan menjadi jawaban yang baik, meskipun jika seseorang harus melakukan sedikit riset dan pengujian dan menuliskannya (itu petunjuk).
cas
Saya sudah mengujinya di Ubuntu (ZFS di linux) dan tidak bekerja pada dataset yang lebih dalam (tank / sesuatu / orang lain). Saya menggunakan port ini untuk shell - link . Bendera rekursif export ZREP_R=-Rtidak berfungsi sama sekali. :(
Xdg
1

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

fd0
sumber
Pertanyaan dalam Pertanyaan adalah: "Bagaimana cara saya mengatur tugas sinkronisasi sehingga zvols & dataset kumpulan jarak jauh (termasuk snapshot mereka) dapat disinkronkan dengan zvols, dataset & snapshots lokal?"
Jeff Schaller
0

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

Philip Brown
sumber
1
Pertanyaan dalam Pertanyaan adalah: "Bagaimana cara saya mengatur tugas sinkronisasi sehingga zvols & dataset kumpulan jarak jauh (termasuk snapshot mereka) dapat disinkronkan dengan zvols, dataset & snapshots lokal?"
Jeff Schaller
Jeff, apakah Anda menyarankan bahwa "jawaban" terbaik, adalah memotong-n-tempel bit dari dokumentasi zrep, daripada hanya memberikan referensi ke zrep?
Philip Brown
1
Saya tidak tahu apa jawaban terbaiknya, tetapi tautan ke perangkat lunak bukanlah solusi. Sudah disebutkan, sebenarnya. Pertanyaannya bertanya: "Bagaimana cara saya mengatur tugas sinkronisasi sehingga zvols & dataset kumpulan jarak jauh (termasuk snapshot mereka) dapat disinkronkan dengan zvols, dataset & snapshots lokal?"
Jeff Schaller
ya itu pertanyaannya. Namun, untuk menyelesaikan tugas dengan BAIK, membutuhkan banyak lebih dari sedikit langganan pada halaman web di sini. Itu sebabnya zrep adalah shellscript 2000 baris. Bahkan jika seseorang harus menghapus semua bagian yang tidak diperlukan masalah asli, masih akan ada beberapa ratus baris script yang diperlukan untuk melakukannya BAIK.
Philip Brown