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 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:
- 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.
- Anda akan memiliki banyak snapshot tambahan, yang memperlambat perintah daftar (kecuali pada Oracle Solaris 11, di mana ini diperbaiki).
- 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!
zfs send -R ...
? Jika Anda menyalurkan output melaluissh
, apakah Anda menonaktifkan karakter escape denganzfs send -R ... | ssh -e none ...
?