Aynı filelist kullanarak birden çok hedefe rsync?


22

Rsync'in bir dizini aynı anda birden fazla uzak noktaya, hatta aynı anda kopyalamasının mümkün olup olmadığını merak ediyorum. (gerekli değil, ancak yararlı olacaktır.)

Normalde, aşağıdakine benzer bir şey işe yarayabilir:

$ rsync -Pav /junk user@host1:/backup
$ rsync -Pav /junk user@host2:/backup
$ rsync -Pav /junk user@host3:/backup

Ve tek seçenek buysa, onu kullanacağım. Bununla birlikte, / önemsiz, oldukça az sayıda dosya içeren yavaş bir sürücüde bulunur ve her seferinde ~ 12.000 dosyadan oluşan bir dosya listesinin yeniden oluşturulması, gerçek aktarma / güncelleme işlemine kıyasla acı verici şekilde yavaş (~ 5 dakika) olur. Böyle bir şeyi yapmak, aynı şeyi yapmak mümkün mü:

$ rsync -Pav /junk user@host1:/backup user@host2:/backup user@host3:/backup 

Baktığın için teşekkürler!

Yanıtlar:


12

İşte toplu iş moduyla ilgili rsync sayfasındaki bilgiler.

TOPLU MODU

Toplu mod, aynı güncelleme setini birçok özdeş sisteme uygulamak için kullanılabilir. Birinin birkaç ana bilgisayara çoğaltılmış bir ağacı olduğunu varsayalım. Şimdi bu kaynak ağacında bazı değişiklikler yapıldığını ve bu değişikliklerin diğer ana bilgisayarlara yayılması gerektiğini varsayalım. Toplu iş modunu kullanarak bunu yapmak için rsync, kaynak ağaca yapılan değişiklikleri hedef ağaçlardan birine uygulamak için write-batch seçeneğiyle çalıştırılır. Yazma toplu iş seçeneği, rsync istemcisinin, bu işlemi diğer, aynı hedef ağaçlara karşı yinelemek için gereken tüm bilgileri bir "toplu iş dosyasında" depolamasına neden olur.

Toplu iş dosyasını bir kez oluşturmak, birden çok hedef ağacı güncellerken dosya durumunu, sağlama toplamını ve veri bloğu oluşturmayı birden fazla kez gerçekleştirmek zorunda kalmaz. Çok noktaya yayın aktarım protokolleri, toplu güncelleme dosyalarını aynı anda her ana bilgisayara tek tek göndermek yerine birçok ana bilgisayara paralel olarak aktarmak için kullanılabilir.

Kaydedilen değişiklikleri başka bir hedef ağaca uygulamak için, aynı toplu iş dosyasının adını ve hedef ağacın adını belirterek, okuma toplu iş seçeneğiyle rsync'i çalıştırın. Rsync, toplu iş dosyasında depolanan bilgileri kullanarak hedef ağacı günceller.

Size kolaylık sağlamak için, yazma toplu iş seçeneği kullanıldığında bir komut dosyası da oluşturulur: ".sh" eklenmiş olan toplu iş dosyasıyla aynı olarak adlandırılır. Bu komut dosyası, ilişkili toplu dosyayı kullanarak bir hedef ağacı güncellemek için uygun bir komut satırı içerir. İsteğe bağlı olarak orijinal hedef yolu yerine kullanılan alternatif bir hedef ağaç yolundan geçen bir Bourne (veya Bourne benzeri) kabuğu kullanılarak yürütülebilir. Bu, mevcut ana bilgisayardaki hedef ağaç yolu, toplu iş dosyasını oluşturmak için kullanılandan farklı olduğunda yararlıdır.

   Examples:

          $ rsync --write-batch=foo -a host:/source/dir/ /adest/dir/
          $ scp foo* remote:
          $ ssh remote ./foo.sh /bdest/dir/

          $ rsync --write-batch=foo -a /source/dir/ /adest/dir/
          $ ssh remote rsync --read-batch=- -a /bdest/dir/ <foo

Bu örneklerde, / adest / dir / from / source / dir / dizinini güncellemek için rsync kullanılır ve bu işlemi tekrarlayan bilgiler "foo" ve "foo.sh" içinde saklanır. "Remote" ana bilgisayarı daha sonra / bdest / dir dizinine giren toplu verilerle güncellenir. İki örnek arasındaki farklar, partilerle nasıl başa çıkacağınız konusundaki esnekliğin bir kısmını ortaya koyuyor:

  • İlk örnek, ilk kopyanın yerel olması gerekmediğini gösterir - istediğiniz gibi uzak kabuk sözdizimini veya rsync daemon sözdizimini kullanarak uzaktaki bir ana bilgisayara veri iletebilir veya çekebilirsiniz.

  • İlk örnek, uzak ana bilgisayardaki read-batch komutunu çalıştırırken doğru rsync seçeneklerini elde etmek için oluşturulan "foo.sh" dosyasını kullanır.

  • İkinci örnek, parti verilerini standart girdiyle okur, böylece parti dosyasının önce uzaktaki makineye kopyalanması gerekmez. Bu örnek, foo.sh betiğini değiştirdi, çünkü modifiye bir --read-batch seçeneği kullanması gerekiyordu, ancak kullanmak istiyorsanız, komut dosyasını düzenleyebilirsiniz (yalnızca başka bir seçeneğin standart kullanmaya çalışmadığından emin olun) "--exclude-from = -" seçeneği gibi girdiler).

    Uyarılar:

    Toplu iş seçeneği, güncelleştirdiği hedef ağacın, toplu güncelleştirme dosya kümesini oluşturmak için kullanılan hedef ağaçla aynı olmasını bekler. Hedef ağaçları arasındaki bir farkla karşılaşıldığında, güncelleme bir uyarıyla atılabilir (eğer dosya zaten güncel görünüyorsa) veya dosya güncellemesi denenebilir ve ardından dosya doğrulanamazsa , güncelleme bir hata ile atıldı. Bu, eğer komut kesilirse, bir toplu okuma işlemini tekrar çalıştırmanın güvenli olması gerektiği anlamına gelir. Toplu güncellemeyi, dosyanın boyutu ve tarihine bakılmaksızın her zaman denenmeye zorlamak istiyorsanız, -I seçeneğini kullanın (toplu okumayı okurken). Bir hata meydana gelirse, hedef ağaç muhtemelen kısmen güncellenmiş durumda olacaktır. Bu durumda,

    Tüm hedeflerde kullanılan rsync sürümü, en azından toplu iş dosyasını oluşturmak için kullanılan sürüm kadar yeni olmalıdır. Toplu iş dosyasındaki protokol sürümü toplu okuma rsync'in işlemesi için çok yeni olduğunda, Rsync bir hatayla ölecektir. Ayrıca, daha eski bir rsync'in anlayabileceği bir toplu iş dosyası oluşturma rsync oluşturmasını sağlamanın bir yolu için --protocol seçeneğine bakın. (Toplu iş dosyalarının sürüm 2.6.3'te değiştiğine dikkat edin, bu nedenle sürümlerinden daha eski sürümlerle daha yeni sürümlerin karıştırılması çalışmaz.)

    Bir toplu iş dosyasını okurken, rsync, toplu yazma komutuyla aynı şekilde ayarlamazsanız, toplu iş dosyasındaki verilerle eşleşmesi için belirli seçeneklerin değerini zorlar. Diğer seçenekler değiştirilebilir (ve gerekir). Örneğin --write-batch --read-batch olarak değişir, --files-from bırakılır ve --delete seçeneklerinden biri belirtilmedikçe --filter / - include / - exclude seçeneklerine gerek yoktur .

    BATCH.sh dosyasını oluşturan kod, herhangi bir filtreyi / include / exclude seçeneklerini kabuk komut dosyasına "burada" bir belge olarak eklenmiş tek bir listeye dönüştürür. İleri düzey bir kullanıcı --delete tarafından silinen şeyde bir değişiklik yapılması isteniyorsa, dışlama listesini değiştirmek için bunu kullanabilir. Normal bir kullanıcı bu ayrıntıyı yok sayabilir ve yalnızca kabuk komut dosyasını, toplu veriler için uygun - okuma-toplu iş komutunu çalıştırmanın kolay bir yolu olarak kullanabilir.

    Rsync'deki orijinal toplu iş modu "rsync +" 'ya dayanıyordu, ancak en son sürüm yeni bir uygulama kullanıyor.

Deneyebileceğini hayal ediyorum

rsync --write-batch=foo -Pav /junk user@host1:/backup
foo.sh user@host2:/backup
foo.sh user@host3:/backup

Önerilen komut çalışmıyor:remote destination is not allowed with --read-batch
kynan

Komutun tamamını göster. -Bir dosya adı için standart girdiden okumak anlamına gelir ve STDIN de fooörnekte yerel bir dosyadan okunuyor .
Chloe,

2
Bu, kullanmaya çalıştığım şey için en doğru çözüm olarak gözüküyor, ancak bunun için kullanım durumum uzun süredir buharlaştırıcıya atıldı. : D
Jessie

4

Unison kullanmayı deneyebilirsin . Dosya listesini oluştururken çok daha hızlı olması gerekir, çünkü dosyaların önbelleğini tutar.


2
Not: Unison, dosyaların 'önbelleğini' tutmaz. Yalnızca dosya adlarının, zaman damgalarının, sağlama toplamlarının bir veritabanını tutar. Hala dosya sistemini tarıyor ve uzaktan kumanda ile karşılaştırmak için bir sağlama toplamı oluşturuyor. Unison'un tek avantajı iki yönlü senkronizasyondur. Unison'u öneririm ama burada yardımı olmayacak.
Chloe,

4

Çok rsync --batch-modenoktaya yayın destekler. Ağınızda bu mümkün ise, bunu incelemeye değer olabilir.


2

dosya sistemlerini değiştirmeye ne dersiniz?

Bir süre önce multi-terabaytlık bir FS'yi ext3'ten XFS'ye değiştirdim. Dizinleri tarama zamanı (son kontrol ettiğimde yaklaşık 600.000 dosyayla), 15-17 dakikadan 30 saniyenin altına düştü!


1

Doğrudan bir cevap değil, ancak rsync sürüm 3+ kullanıyorsanız, dosya listesinin tamamını oluşturmadan önce aktarmaya başlayacaktır.

Yine de çok verimli olmayan bir başka seçenek, işleri bir arada çalıştırmak, aynı zamanda birkaçını çalıştırmak.

Ayrıca, sadece tar kullanarak sakıncası yoksa bu gariplik düşündüm:

tar cf - . | tee >(ssh localhost 'cat > test1.tar') >(ssh localhost 'cat > test2.tar') >/dev/null

Her bir yerel sunucunun tabii ki farklı sunucular olacağı yer (anahtar tabanlı giriş yapılacağını varsayar). Yukarıdakileri daha önce hiç kullanmadım.


Hmm! Garip bir şekilde, cwrsync (rsync 3.0.7) bunu yapmıyor gibi görünüyor. Bunun neden, bu devasa çalışma sürelerinin azaltılmasında büyük bir yardımcı olacağına bakmak zorundayım. Teşekkürler!
Jessie

İki taraftaki o sürüm?
Kyle Brandt

Hayır, aslında; yerel makine cwrsync 3.0.7 ve uzak ana bilgisayar (yani, şu an üzerinde çalışıyorum) Debian Lenny'de rsync 3.0.3. Yaramazlık için çok büyük bir sürüm farkı gibi görünmüyor, ama bilmiyorum .. Debian tarafını yükseltmeye bakacağım.
Jessie

1
Ne garip bir küçük astar. Bu muhtemelen işe yarar, eğer rsync'in en fazla sadece birkaç yüz kb değiştiğinde birkaç yavaş bağlantı üzerinden birkaç gig veriyi çoğaltması gerekmediği gerçeğinden faydalanmasaydım. Ayrıca, her iki sona (cw) rsync 3.0.7 almak yine de dosya listesi oluşturma ve seri olarak aktarma işlemlerini gerçekleştirdi. Yine de bu konuda endişeli değil.
Jessie

"Katran cf -" değil. "katran c" ile aynı ?
Johan Boulé,

1

Rsync işlerini host1, host2 ve host3'ten çalıştırmaya ne dersiniz? Veya, host1'e kopyalamak için bir iş çalıştırın ve ardından host1'den almak için host2 ve host3'te çalıştırın.


1

Daha iyi bir çözüm, git ile bir depo oluşturmak ve sadece 3 toplantı sahibine basmak olacaktır. Daha hızlı, dosya listesi kısmına ihtiyacınız olmaz ve daha az kaynak tüketir.

İyi şanslar
João Miguel Neves


10
git, değişiklik zamanlarını ve izinlerini (çalıştırma biti hariç) korumaz ve verinin .git/çoğunu daha hızlı olacak olan uzaktan kumandalara iterse de , verilerin ikinci bir kopyasını git nesneleri olarak saklamayı gerektirir . git rsync yerine değil.
Dan D.

Artı, git ödeme yapmazsanız, herkes tarafından görülebilir.
Chloe,

8
@Chloe, GitHub için gitmiş hata. Git'in kendisi açık kaynaklı dağıtık sürüm kontrol sistemidir ve herkes http, nfsve de dahil olmak üzere herhangi bir yolla git deposuna ev sahipliği yapabilir afp. GitHub, sizin için git repoları yaratıp sürdüren ve herkese açık yapan (ödemediğiniz sürece) herkese açık bir web sitesidir.
toriningen

1
@Chloe GitHub herkese açık olarak görüntülenebilir, ancak BitBucket özel depolar sunar.
sws

2
Ayrıca, Git boş dizinleri izlemez.
Flimm

1

Bu cevabı kendim ararken bs önce rsync'i kullanarak bir toplu iş yapıp ardından hepsini göndermeye ihtiyacınız olacağını düşünüyorum, bu da dosya listesinin sadece bir kez kırılması gerektiğini ve böylece tam da paralel olarak çalıştırmak için üç rsyncs arka plan.


1

Başka bir olası çözüm, sizin ana bilgisayarlarınız, yani çatallarınız gibi paralel olarak birçok rsync işlemi gerçekleştiriyor.

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.