rsync ke beberapa tujuan menggunakan daftar file yang sama?

22

Saya bertanya-tanya apakah mungkin bagi rsync untuk menyalin satu direktori ke beberapa tujuan jarak jauh sekaligus, atau bahkan secara paralel. (tidak perlu, tetapi akan bermanfaat.)

Biasanya, sesuatu seperti yang berikut ini akan berfungsi dengan baik:

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

Dan jika itu satu-satunya pilihan, saya akan menggunakannya. Namun, / sampah terletak pada drive lambat dengan beberapa file, dan membangun kembali filelist sekitar ~ 12.000 file setiap kali sangat lambat (~ 5 menit) dibandingkan dengan transfer / pembaruan yang sebenarnya. Apakah mungkin untuk melakukan hal seperti ini, untuk mencapai hal yang sama:

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

Terima kasih telah melihat!

Jessie
sumber

Jawaban:

12

Berikut adalah informasi dari halaman manual untuk rsync tentang mode batch.

MODE BATCH

Mode batch dapat digunakan untuk menerapkan serangkaian pembaruan yang sama ke banyak sistem yang identik. Misalkan seseorang memiliki pohon yang direplikasi pada sejumlah host. Sekarang anggaplah beberapa perubahan telah dibuat untuk pohon sumber ini dan perubahan itu perlu disebarkan ke host lain. Untuk melakukan ini menggunakan mode batch, rsync dijalankan dengan opsi tulis-batch untuk menerapkan perubahan yang dibuat ke pohon sumber ke salah satu pohon tujuan. Opsi tulis-batch menyebabkan klien rsync untuk menyimpan dalam "file batch" semua informasi yang diperlukan untuk mengulangi operasi ini terhadap pohon tujuan lain yang identik.

Menghasilkan file batch sekali menyimpan harus melakukan status file, checksum, dan pembuatan blok data lebih dari sekali ketika memperbarui beberapa pohon tujuan. Protokol transport multicast dapat digunakan untuk mentransfer file pembaruan batch secara paralel ke banyak host sekaligus, alih-alih mengirim data yang sama ke setiap host secara individual.

Untuk menerapkan perubahan yang direkam ke pohon tujuan lain, jalankan rsync dengan opsi read-batch, tentukan nama file batch yang sama, dan pohon tujuan. Rsync memperbarui pohon tujuan menggunakan informasi yang disimpan dalam file batch.

Untuk kenyamanan Anda, file skrip juga dibuat ketika opsi menulis-batch digunakan: itu akan dinamai sama dengan file batch dengan ".sh" ditambahkan. File skrip ini berisi baris perintah yang cocok untuk memperbarui pohon tujuan menggunakan file batch terkait. Ini dapat dieksekusi menggunakan shell Bourne (atau mirip Bourne), secara opsional meneruskan pathname pohon tujuan alternatif yang kemudian digunakan sebagai ganti path tujuan asli. Ini berguna ketika path pohon tujuan pada host saat ini berbeda dari yang digunakan untuk membuat file batch.

   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

Dalam contoh-contoh ini, rsync digunakan untuk memperbarui / adest / dir / dari / source / dir / dan informasi untuk mengulangi operasi ini disimpan dalam "foo" dan "foo.sh". Host "remote" kemudian diperbarui dengan data batch masuk ke direktori / bdest / dir. Perbedaan antara kedua contoh ini mengungkapkan beberapa fleksibilitas yang Anda miliki dalam cara Anda menangani batch:

  • Contoh pertama menunjukkan bahwa salinan awal tidak harus lokal - Anda dapat mendorong atau menarik data ke / dari host jarak jauh menggunakan sintaks shell-jauh atau sintaks daemon rsync, seperti yang diinginkan.

  • Contoh pertama menggunakan file "foo.sh" yang dibuat untuk mendapatkan opsi rsync yang tepat saat menjalankan perintah read-batch pada host jarak jauh.

  • Contoh kedua membaca data batch melalui input standar sehingga file batch tidak perlu disalin ke mesin jarak jauh terlebih dahulu. Contoh ini menghindari skrip foo.sh karena diperlukan untuk menggunakan opsi --read-batch yang dimodifikasi, tetapi Anda dapat mengedit file skrip jika Anda ingin menggunakannya (pastikan tidak ada pilihan lain yang mencoba menggunakan standar input, seperti opsi "--exclude-from = -").

    Peringatan:

    Opsi read-batch mengharapkan pohon tujuan yang diperbarui itu identik dengan pohon tujuan yang digunakan untuk membuat kumpulan file pembaruan batch. Ketika perbedaan antara pohon tujuan ditemui pembaruan mungkin dibuang dengan peringatan (jika file tampaknya sudah up-to-date) atau file-pembaruan dapat dicoba dan kemudian, jika file gagal memverifikasi , pembaruan dibuang dengan kesalahan. Ini berarti bahwa harus aman untuk menjalankan kembali operasi read-batch jika perintahnya terputus. Jika Anda ingin memaksa pembaruan batched untuk selalu dicoba terlepas dari ukuran dan tanggal file, gunakan opsi -I (saat membaca batch). Jika kesalahan terjadi, pohon tujuan mungkin akan dalam keadaan sebagian diperbarui. Dalam hal itu,

    Versi rsync yang digunakan pada semua tujuan harus setidaknya sama baru dengan yang digunakan untuk menghasilkan file batch. Rsync akan mati dengan kesalahan jika versi protokol dalam file batch terlalu baru untuk ditangani oleh rsync pembacaan batch. Lihat juga opsi --protocol untuk mengetahui cara membuat rsync menghasilkan file batch yang dapat dimengerti oleh rsync yang lebih lama. (Perhatikan bahwa file batch berubah for-mat dalam versi 2.6.3, jadi mencampur versi yang lebih lama dari itu dengan versi yang lebih baru tidak akan berfungsi.)

    Saat membaca file batch, rsync akan memaksa nilai opsi tertentu untuk mencocokkan data dalam file batch jika Anda tidak mengaturnya sama dengan perintah penulisan batch. Opsi lain dapat (dan harus) diubah. Misalnya --write-batch perubahan ke --read-batch, --files-from dijatuhkan, dan opsi --filter / - include / - tidak diperlukan kecuali salah satu dari opsi --delete ditentukan .

    Kode yang membuat file BATCH.sh mengubah setiap filter / sertakan / kecualikan opsi menjadi satu daftar yang ditambahkan sebagai dokumen "di sini" ke file skrip shell. Pengguna mahir dapat menggunakan ini untuk mengubah daftar pengecualian jika perubahan apa yang akan dihapus oleh --delete diinginkan. Seorang pengguna normal dapat mengabaikan detail ini dan hanya menggunakan skrip shell sebagai cara mudah untuk menjalankan perintah --read-batch yang sesuai untuk data batch.

    Mode batch asli di rsync didasarkan pada "rsync +", tetapi versi terbaru menggunakan implementasi baru.

Saya akan membayangkan Anda bisa mencoba

rsync --write-batch=foo -Pav /junk user@host1:/backup
foo.sh user@host2:/backup
foo.sh user@host3:/backup
Chloe
sumber
Perintah yang disarankan tidak bekerja:remote destination is not allowed with --read-batch
kynan
Tampilkan perintah lengkap. -untuk nama file berarti membaca dari input standar, dan STDIN juga dibaca dari foodalam contoh, file lokal.
Chloe
2
Ini tampaknya menjadi solusi yang benar secara maksimal untuk apa yang saya coba lakukan, meskipun kasus penggunaan saya untuk ini telah lama menguap ke dalam ether. : D
Jessie
4

Anda dapat mencoba menggunakan secara bersamaan . Seharusnya lebih cepat dalam membangun daftar file karena menyimpan cache file.

Jason Axelson
sumber
2
Catatan: Serentak tidak menyimpan 'cache' file. Itu hanya menyimpan database dari nama file, cap waktu, checksum. Itu masih melakukan pemindaian sistem file dan membuat checksum untuk dibandingkan dengan remote. Satu-satunya keuntungan unison adalah sinkronisasi dua arah. Saya merekomendasikan Unison, tetapi tidak akan membantu di sini.
Chloe
4

The rsync --batch-modemulticast mendukung. Jika ini memungkinkan di jaringan Anda, mungkin ada baiknya Anda memeriksanya.

codecrank
sumber
2

bagaimana dengan mengubah filesystem?

Beberapa waktu lalu, saya mengganti FS multi-terabyte dari ext3 ke XFS. Waktu untuk memindai direktori (dengan sekitar 600.000 file terakhir kali saya periksa) berubah dari 15-17 menit menjadi kurang dari 30 detik!

Javier
sumber
1

Bukan jawaban langsung, tetapi jika Anda menggunakan rsync versi 3+, ia akan mulai mentransfer sebelum menghasilkan seluruh daftar file.

Pilihan lain, masih sangat tidak efisien, adalah menjalankannya sebagai pekerjaan sehingga beberapa dijalankan secara bersamaan.

Juga, saya hanya memikirkan keanehan ini jika Anda tidak keberatan menggunakan tar:

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

Di mana setiap localhost akan menjadi server yang berbeda tentunya (mengasumsikan login berbasis kunci). Namun, tidak pernah menggunakan di atas sebelumnya.

Kyle Brandt
sumber
Hmm! Anehnya, cwrsync (rsync 3.0.7) tampaknya tidak melakukan itu. Saya harus melihat mengapa itu, karena itu akan sangat membantu dalam mengurangi runtime besar ini. Terima kasih!
Jessie
Versi itu di kedua sisi?
Kyle Brandt
Tidak, sebenarnya; mesin lokal adalah cwrsync 3.0.7 dan remote host (yah, yang sedang saya kerjakan sekarang) adalah rsync 3.0.3 pada Debian Lenny. Sepertinya itu bukan perbedaan versi yang terlalu besar untuk disalahgunakan, tetapi saya tidak tahu .. Saya akan melihat ke dalam peningkatan sisi Debian.
Jessie
1
Benar-benar aneh. Itu mungkin akan bekerja, jika saya tidak memanfaatkan fakta bahwa rsync tidak perlu menggandakan kembali beberapa pertunjukan data melalui beberapa tautan lambat ketika, paling-paling, hanya beberapa ratus kb darinya telah berubah. Juga, mendapatkan kedua ujungnya ke (cw) rsync 3.0.7 masih melakukan pembuatan daftar file dan mentransfer secara serial. Tapi tidak terlalu peduli tentang itu.
Jessie
Bukankah "tar cf -." sama dengan "tar c." ?
Johan Boulé
1

Bagaimana menjalankan pekerjaan rsync dari host1, host2, dan host3? Atau, jalankan pekerjaan untuk menyalin ke host1, dan kemudian jalankan di host2 dan host3 untuk mendapatkannya dari host1.

mfinni
sumber
1

Solusi yang lebih baik adalah membuat repositori dengan git dan hanya mendorong ke 3 host. Lebih cepat, Anda tidak perlu bagian daftar file dan menghabiskan lebih sedikit sumber daya.

Semoga beruntung,
João Miguel Neves

jneves
sumber
10
git tidak mempertahankan waktu modifikasi atau izin (kecuali bit eksekusi) dan akan membutuhkan penyimpanan salinan data kedua sebagai objek git .git/meskipun mendorong ke remote yang sudah memiliki sebagian besar data akan lebih cepat. git bukan pengganti rsync.
Dan D.
Plus, git dapat dilihat oleh publik, kecuali Anda membayar.
Chloe
8
@ Chloe, Anda salah git untuk GitHub. Git sendiri adalah sistem kontrol versi terdistribusi opensource gratis, dan siapa pun dapat meng-host repositori git dengan cara apa pun, termasuk http, nfsdan afp. GitHub adalah situs web yang mengurus pembuatan dan pemeliharaan repositori git untuk Anda, dan menjadikannya publik (kecuali Anda membayar).
toriningen
1
@Chloe GitHub dapat dilihat oleh publik, tetapi BitBucket menyediakan repo pribadi.
sws
2
Juga, Git tidak melacak direktori kosong.
Flimm
1

Dalam mencari jawaban ini sendiri, saya pikir Anda harus membuat batch menggunakan rsync terlebih dahulu dan kemudian mengirimkannya kepada mereka semua, yang akan membuatnya jadi daftar file perlu dikelompokkan hanya satu kali, dan kemudian Anda bisa saja background ketiga rsyncs untuk menjalankannya secara paralel.

Morgan
sumber
1

Solusi lain yang mungkin adalah menjalankan banyak proses rsync secara paralel seperti halnya Anda memiliki host, yaitu fork.

Alexey Tigarev
sumber