Yasal Uyarı: Zvols'u hiç kullanmadığım için, çoğaltmada normal dosya sistemlerinden veya anlık görüntülerden farklı olup olmadıklarını söyleyemem. Öyle olduklarını sanıyorum, ama benim sözüme inanmıyorum.
Sorunuz aslında birden fazla soru, bunları ayrı olarak cevaplamaya çalışıyorum:
Havuzun tamamını uzak konuma çoğaltma / yansıtma
Görevi iki bölüme ayırmanız gerekir: ilk olarak, ilk çoğaltmanın tamamlanması gerekir, daha sonra çoğaltma anlık görüntülerinizle uğraşmadığınız sürece artımlı çoğaltma mümkündür . Artımlı çoğaltmayı etkinleştirmek için, en son çoğaltma anlık görüntülerini korumalısınız, bundan önce her şey silinebilir. Önceki görüntüyü silerseniz zfs recv
, çoğaltma şikayet ve iptal. Bu durumda baştan başlamanız gerekir, bu yüzden bunu yapmamaya çalışın.
Sadece doğru seçeneklere ihtiyacınız varsa, bunlar:
zfs send
:
-R
: verilen havuzun veya veri kümesinin altındaki her şeyi gönderir (yinelenen çoğaltma, her zaman gerekli, içerir -p
). Ayrıca, alınırken, silinen tüm kaynak anlık görüntüler hedefe silinir.
-I
: son çoğaltma anlık görüntüsü ile geçerli çoğaltma anlık görüntüsü arasındaki tüm ara anlık görüntüleri dahil et (yalnızca artımlı gönderimlerde gereklidir)
zfs recv
:
-F
: kaynakta silinmiş mevcut veri kümelerinin silinmesi de dahil olmak üzere hedef havuzunu genişlet
-d
: kaynak havuzun adını atın ve onu hedef havuz adıyla değiştirin (dosya sistemi yollarının geri kalanı korunur ve gerekirse de oluşturulur)
-u
: dosya sistemini hedefe bağlama
Tam bir örnek tercih ederseniz, küçük bir komut dosyası aşağıdadır:
#!/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
SSH'den daha hızlı bir şey kullanın
Yeterince güvenli bir bağlantınız varsa, örneğin IPSec veya OpenVPN tüneli ve yalnızca gönderen ve alıcı arasında var olan ayrı bir VLAN varsa, SSH'den burada açıklandığı gibi mbuffer gibi şifrelenmemiş alternatiflere geçebilir veya zayıf / şifrelemesiz SSH kullanabilirsiniz ve burada ayrıntılı olarak açıklanan engelli sıkıştırması . Ayrıca SSH'nin çok daha hızlı olmasını öneren bir web sitesi vardı, ancak ne yazık ki URL'yi hatırlamıyorum - bulursam daha sonra düzenleyeceğim.
Çok büyük veri kümeleri ve yavaş bağlantılar için, sabit disk yoluyla ilk iletim için de yararlı olabilir (zpool'u saklamak ve kurye, posta veya şahsen mühürlü pakette iletmek için şifreli disk kullanın). İletim yöntemi gönderme / recv için önemli olmadığından, her şeyi diske bağlayabilir, havuzu dışa aktarabilir, diski hedefine gönderebilir, havuzu içe aktarabilir ve daha sonra tüm artımlı gönderimleri SSH yoluyla iletebilirsiniz.
Anlık görüntülerle ilgili sorun
Daha önce belirtildiği gibi, çoğaltma anlık görüntülerinizi silerseniz / değiştirirseniz, hata iletisini alırsınız.
cannot send 'pool/fs@name': not an earlier snapshot from the same fs
Bu, komutunuzun yanlış olduğu veya anlık görüntüleri kaldırmanız ve baştan başlamanız gereken tutarsız bir durumda olduğunuz anlamına gelir.
Bunun birkaç olumsuz etkisi vardır:
- Yeni çoğaltma anlık görüntüsü başarıyla aktarılana kadar çoğaltma anlık görüntüsünü silemezsiniz. Bu çoğaltma anlık görüntüleri diğer tüm (eski) anlık görüntülerin durumunu içerdiğinden, silinen dosyaların boş alanları ve anlık görüntüler yalnızca çoğaltma tamamlandığında geri kazanılır. Bu, havuzunuzda yalnızca tüm çoğaltma yordamını yeniden başlatarak veya tamamlayarak giderebileceğiniz geçici veya kalıcı alan sorunlarına yol açabilir.
- Liste komutunu yavaşlatan birçok ek anlık görüntünüz olacaktır (bunun düzeltildiği Oracle Solaris 11 hariç).
- Anlık görüntüleri, komut dosyasının kendisi dışında (yanlışlıkla) kaldırmaya karşı korumanız gerekebilir.
Bu sorunlara olası bir çözüm var, ama kendim denemedim. zfs bookmark
OpenSolaris / illumos'ta bu görev için özel olarak oluşturulmuş yeni bir özellik kullanabilirsiniz . Bu sizi anlık görüntü yönetiminden kurtarır. Tek dezavantajı şu anda, sadece tek veri kümeleri için çalışıyor, özyinelemeli değil. Tüm eski ve yeni veri kümelerinizin bir listesini kaydetmeniz ve ardından bunları işaretlemeniz, yer imi koyma, gönderme ve alma ve ardından listeyi (veya isterseniz küçük veritabanını) güncellemeniz gerekir.
Yer işareti rotasını denerseniz, sizin için nasıl çalıştığını duymak isterim!
zfs send -R ...
? Çıkışı yoluyla yönlendirdiyseniz, çıkışssh
karakterlerini ile devre dışı bıraktınızzfs send -R ... | ssh -e none ...
mı?