tüm zfs havuzunu başka bir zfs havuzuna tek yönlü yansıtma


16

Birkaç zvols ve bazıları da iç içe veri kümeleri içeren bir zfs havuzu var. Tüm veri kümeleri ve zvoller, düzenli olarak zfs-auto-snapshot ile anlık olarak çekilir. Tüm veri kümeleri ve zvollerde manuel olarak oluşturulan bazı anlık görüntüler de vardır.

Ben zaman eksikliği nedeniyle, yerel yüksek hızlı ağ üzerinden zfs gönderme -R üzerinden ilk kopyalama (bazı veri kümeleri eksik, bazı veri setleri eski veya eksik anlık görüntüleri) nedeniyle hangi uzak bir havuz kurduk.

Şimdi havuz yavaş hızlı bir bağlantı üzerinden fiziksel olarak uzak ve uzak havuzu düzenli olarak yerel havuzla eşitlemem gerekiyor, yani yerel havuzda bulunan veriler uzak havuza kopyalanmalı, yerel havuzdan alınan veriler uzak havuzdan silinmeli ve uzak havuzda bulunan ancak yerel havuzda bulunmayan veriler uzak havuzdan, 'zvols', 'veri kümeleri' veya 'anlık görüntüler' anlamına gelen verilerle silinmelidir.

Bunu rsync kullanan iki normal dosya sistemi arasında yapsaydım, "-axPHAX --delete" olurdu (bazı sistemleri yedeklemek için yaptığım şey budur).

Uzak havuz zvols ve veri kümelerinin (anlık görüntüleri dahil) yerel zvols, veri kümeleri ve anlık görüntülerle senkronize olabilmesi için bir senkronizasyon görevi nasıl ayarlarım?

Ssh'ın düşük iş performansı nedeniyle ssh üzerinden aktarım yapmak istemiyorum; Bunun yerine mbuffer veya iscsi'yi tercih ederim.


İlk adınızı nasıl yaptınız zfs send -R ...? Çıkışı yoluyla yönlendirdiyseniz, çıkış sshkarakterlerini ile devre dışı bıraktınız zfs send -R ... | ssh -e none ...mı?
Andrew Henle

Ayrıca, yavaş bağlantınızın uzak kopyayı güncel tutmak için yeterli bant genişliğine sahip olduğundan emin olmanız gerekir. Yerel sistemde uzaktaki sisteme gönderebileceğinizden daha fazla değişiklik alıyorsanız, uzak kopyayı hiçbir zaman güncel tutamazsınız. Artımlı bir zfs çoğaltma akışı alın ve bunu bir dosyaya kaydedin. Dosya, anlık görüntüler arasındaki süre içinde uzak siteye gönderebileceğiniz veri miktarından büyükse, hiçbir zaman devam etmezsiniz. zfs send -R -i pool@snap1 pool@snap2 | gzip --fast > /output/file.gz
Andrew Henle

Ayrıca otomatik olarak yapmak için bu komut dosyasını kullanmayı deneyebilirsiniz: github.com/psy0rz/zfs_autobackup/blob/master/README.md
edwin eefting

Yanıtlar:


12

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:

  1. 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.
  2. Liste komutunu yavaşlatan birçok ek anlık görüntünüz olacaktır (bunun düzeltildiği Oracle Solaris 11 hariç).
  3. 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 bookmarkOpenSolaris / 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!


Bu ayrıntılı cevap için çok teşekkür ederim. ben sadece gönderiyorum .. al-ing a zpool.
jitter

1
güzel senaryo. Ben eklemek istiyorum -d 1ikisine de zfs list(havuz adının altında arama yapmak gerek yoktur) Arama derinliğini sınırlamak için komutlar. Bu, çok sayıda anlık görüntüye sahip havuzlarda uzun gecikmeleri önler (örn. "Yedek" havuzum 320000 anlık görüntüye sahiptir ve zfs list -r -t snapshot backupçalışması 13 dakika sürer. Yalnızca 0,06 saniye sürer -d 1). zfs destroyDöngü komut sonra ihtiyacı -ryinelemeli aynı snapname tüm anlık silme seçeneği.
cas

5

Şahsen, uzak sunucuda güncel anlık görüntülere sahip olmayan bir zvols, veri kümeleri vb. Listesi oluştururdum ve daha sonra zfs sendbu zaman alıcı olsa da ve çok fazla kullanıyor olsa bile bu anlık görüntüleri güncellerim bant genişliği.

O zfs sendzamandan sonra kullanmaya devam edebilirim ve kendi senkronizasyon kodumu yazarak tekerleği yeniden icat etmek zorunda kalmazdım. rsynceski dosya sistemleri zfs sendiçin güzeldir, ancak zfs için çok daha iyidir - anlık görüntüde hangi blokların değiştiğini tam olarak bilir ve yalnızca bunları gönderirken , rsync yerel ve uzak sunucular arasında tek tek dosyaları ve / veya zaman damgalarını karşılaştırmak zorundadır. Aynı şey btrfs sendbtrfs havuzları için de geçerlidir .

Güncel hale getirilmesi gereken az sayıda anlık görüntünüz varsa, bu manuel olarak yapılabilir. Aksi takdirde, otomatik olarak yapmak için, uzak anlık görüntülere karşı en son yerel anlık görüntülerin bir listesine zfs sendve rmeote sunucusundaki güncel olmayan yerel anlık görüntüleri ve ardından yerel anlık görüntüleri karşılaştırmak için bir komut dosyasına ihtiyacınız vardır.

Her veri kümesi için yalnızca en son anlık görüntüyü önemsiyorsanız bu yeterli olacaktır. Önceki tüm anlık görüntüleri önemsiyorsanız, betiğiniz de onları işlemek zorunda kalacak ... ve bu çok daha karmaşık hale geliyor. Bazı durumlarda, ara / eksik anlık görüntüleri yeniden gönderebilmeniz için uzak sunucuda geri almanız gerekebilir.

Uzak sunucuya güvenli bir bağlantı istiyorsanız, kullanmaktan çok az seçeneğiniz vardır ssh- ya da belki bir openvpnşeyle veya bir şeyle tünel kurup kullanmaktan başka bir şey yoktur netcat.


Zrep kullanmaya ne dersiniz? bolthole.com/solaris/zrep
xdg

dunno, hiç kullanmadı. iyi bir cevap verecek gibi görünüyor, ama eğer birisi biraz araştırma ve test yapıp yazacaksa (bu bir ipucu).
cas

Ben Ubuntu üzerinde test ettik (Linux üzerinde ZFS) ve daha derin veri kümeleri (tank / bir şey / someother) üzerinde çalışmıyordu. Bu bağlantı noktasını kabuk - bağlantı için kullanıyordum . Özyinelemeli bayrak export ZREP_R=-Rhiç çalışmıyor. :(
Xdg

1

FreeBSD'de hayatınızı kolaylaştırabilecek zrepl'e bir bakın ve herkes bu konuda çok daha kolay. Birkaç gün önce Ottawa'da BSDCan2018 sırasında sunuldu. Umut verici görünüyor ve sorunlarınıza bir çözüm olabilir



Sorudaki soru şudur: "Uzak havuz zvols ve veri kümelerinin (anlık görüntüleri dahil) yerel zvols, veri kümeleri ve anlık görüntülerle senkronize olabilmesi için senkronizasyon görevini nasıl ayarlarım?"
Jeff Schaller

0

zrep, hepsi bir arada güzel bir çözümdür ve basit SSH aktarımlarından daha hızlı aktarım elde etmek için belgelere + kancalara sahiptir

https://github.com/bolthole/zrep

aynı zamanda çapraz platform: linux, freebsd ve solaris / illumos'ta desteklenir



1
Sorudaki soru şudur: "Uzak havuz zvols ve veri kümelerinin (anlık görüntüleri dahil) yerel zvols, veri kümeleri ve anlık görüntülerle senkronize olabilmesi için senkronizasyon görevini nasıl ayarlarım?"
Jeff Schaller

Jeff, en iyi "cevabın", sadece zrep'e referans vermek yerine bitleri zrep belgelerinden kesip yapıştırmak olacağını mı düşünüyorsunuz?
Philip Brown

1
En iyi cevabın ne olacağını bilmiyorum, ancak yazılıma bağlantı bir çözüm değil. Aslında zaten bahsedildi. Soru soruyor: “Uzak havuz zvols ve veri kümelerinin (anlık görüntüleri dahil) yerel zvols, veri kümeleri ve anlık görüntülerle senkronize olabilmesi için senkronizasyon görevini nasıl ayarlarım?”
Jeff Schaller

evet soru bu. Ancak, WELL görevini yerine getirmek için, burada bir web sayfasında küçük bir yazıdan çok daha fazlasını gerektirir. Zrep'in 2000 satırlık bir kabuk betiği olmasının nedeni budur. Orijinal sorunun hiç ihtiyaç duymadığı tüm parçaları kaldırmak olsa bile, yine de bunu yapmak için birkaç yüz satırlık komut dosyası olurdu.
Philip Brown
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.