rsync ไปยังหลายปลายทางโดยใช้ filelist เดียวกันหรือไม่


22

ฉันสงสัยว่าเป็นไปได้หรือไม่ที่ rsync จะสามารถคัดลอกไดเรกทอรีหนึ่งไปยังปลายทางระยะไกลหลายแห่งได้ในครั้งเดียวหรือแม้แต่ในแบบคู่ขนาน (ไม่จำเป็น แต่จะมีประโยชน์)

โดยปกติแล้วสิ่งต่อไปนี้จะใช้ได้ดี:

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

และถ้านั่นเป็นตัวเลือกเดียวฉันจะใช้มัน อย่างไรก็ตาม / ขยะตั้งอยู่บนไดรฟ์ช้าที่มีไฟล์ค่อนข้างน้อยและการสร้างไฟล์ใหม่ของไฟล์บางไฟล์ประมาณ 12,000 ไฟล์ในแต่ละครั้งจะช้าลงอย่างช้า ๆ (~ 5 นาที) เมื่อเทียบกับการถ่ายโอน / การอัพเดตจริง เป็นไปได้ไหมที่จะทำสิ่งนี้เพื่อทำสิ่งเดียวกัน:

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

ขอบคุณที่มอง!

คำตอบ:


12

นี่คือข้อมูลจาก man page สำหรับ rsync เกี่ยวกับโหมดแบทช์

โหมดแบทช์

สามารถใช้โหมดแบทช์เพื่อใช้ชุดการอัปเดตชุดเดียวกันกับระบบที่เหมือนกันหลายระบบ สมมติว่ามีต้นไม้ที่มีการจำลองแบบจำนวนโฮสต์ ทีนี้สมมติว่ามีการเปลี่ยนแปลงบางอย่างกับแผนผังต้นกำเนิดนี้และการเปลี่ยนแปลงเหล่านั้นจำเป็นต้องแพร่กระจายไปยังโฮสต์อื่น ๆ ในการทำเช่นนี้โดยใช้โหมดแบตช์ rsync จะถูกรันด้วยตัวเลือกชุดการเขียนเพื่อใช้การเปลี่ยนแปลงที่เกิดขึ้นกับแผนผังต้นทางกับหนึ่งในแผนผังปลายทาง ตัวเลือกชุดการเขียนทำให้ไคลเอนต์ rsync เก็บไว้ใน "แบตช์ไฟล์" ข้อมูลทั้งหมดที่จำเป็นในการทำซ้ำการดำเนินการนี้กับต้นไม้ปลายทางอื่น ๆ ที่เหมือนกัน

การสร้างแบตช์ไฟล์ครั้งเดียวจะบันทึกไม่ต้องดำเนินการสถานะไฟล์การตรวจสอบและการสร้างบล็อคข้อมูลมากกว่าหนึ่งครั้งเมื่ออัปเดตต้นไม้หลายปลายทาง Multicast transport protocols สามารถใช้ในการถ่ายโอนไฟล์การอัพเดทแบบแบ็ตช์ไปยังหลาย ๆ โฮสต์ได้พร้อมกันแทนที่จะส่งข้อมูลเดียวกันไปยังโฮสต์ทุกเครื่อง

เมื่อต้องการใช้การเปลี่ยนแปลงที่บันทึกไว้กับแผนผังปลายทางอื่นให้รัน rsync ด้วยตัวเลือกชุดอ่านข้อมูลโดยระบุชื่อไฟล์แบตช์เดียวกันและแผนผังปลายทาง Rsync อัพเดตแผนผังปลายทางโดยใช้ข้อมูลที่เก็บไว้ในไฟล์แบตช์

เพื่อความสะดวกของคุณไฟล์สคริปต์จะถูกสร้างขึ้นเมื่อมีการใช้ตัวเลือกชุดงานเขียน: มันจะตั้งชื่อเหมือนกับไฟล์ชุดงานที่มี ".sh" ต่อท้าย ไฟล์สคริปต์นี้มีบรรทัดคำสั่งที่เหมาะสมสำหรับการอัพเดตทรีปลายทางโดยใช้ไฟล์แบตช์ที่เกี่ยวข้อง สามารถดำเนินการได้โดยใช้เชลล์ Bourne (หรือ Bourne-like) ซึ่งเป็นทางเลือกที่จะผ่านชื่อพา ธ ต้นไม้ปลายทางอื่นซึ่งจะถูกใช้แทนเส้นทางปลายทางเดิม สิ่งนี้มีประโยชน์เมื่อเส้นทางต้นไม้ปลายทางบนโฮสต์ปัจจุบันแตกต่างจากที่ใช้ในการสร้างแบตช์ไฟล์

   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

ในตัวอย่างเหล่านี้ rsync ใช้เพื่ออัปเดต / adest / dir / from / source / dir / และข้อมูลที่จะทำซ้ำการดำเนินการนี้จะถูกเก็บไว้ใน "foo" และ "foo.sh" จากนั้นโฮสต์ "ระยะไกล" จะได้รับการอัปเดตด้วยข้อมูลที่แบตช์ไปยังไดเรกทอรี / bdest / dir ความแตกต่างระหว่างสองตัวอย่างแสดงให้เห็นถึงความยืดหยุ่นบางอย่างที่คุณมีในวิธีจัดการกับแบทช์:

  • ตัวอย่างแรกแสดงให้เห็นว่าสำเนาเริ่มต้นไม่จำเป็นต้องเป็นแบบโลคัลคุณสามารถพุชหรือดึงข้อมูลไปยัง / จากรีโมตโฮสต์โดยใช้ไวยากรณ์รีโมตเชลล์หรือซิงโครไนซ์ rsync daemon ตามต้องการ

  • ตัวอย่างแรกใช้ไฟล์ "foo.sh" ที่สร้างขึ้นเพื่อรับตัวเลือก rsync ที่ถูกต้องเมื่อเรียกใช้คำสั่ง read-batch บนโฮสต์ระยะไกล

  • ตัวอย่างที่สองอ่านข้อมูลแบตช์ผ่านอินพุตมาตรฐานเพื่อให้ไม่ต้องคัดลอกไฟล์แบตช์ไปยังเครื่องระยะไกลก่อน ตัวอย่างนี้หลีกเลี่ยงสคริปต์ foo.sh เนื่องจากจำเป็นต้องใช้ตัวเลือก --read-batch ที่แก้ไข แต่คุณสามารถแก้ไขไฟล์สคริปต์ได้หากคุณต้องการใช้มัน (เพียง แต่ต้องแน่ใจว่าไม่มีตัวเลือกอื่นที่พยายามใช้มาตรฐาน อินพุตเช่นตัวเลือก "--exclude-from = -")

    คำเตือน:

    ตัวเลือกชุดการอ่านคาดว่าต้นไม้ปลายทางที่มีการปรับปรุงจะเหมือนกับต้นไม้ปลายทางที่ใช้ในการสร้างชุดการปรับปรุงไฟล์ เมื่อพบความแตกต่างระหว่างต้นไม้ชาติปลายทางที่พบการอัปเดตอาจถูกยกเลิกพร้อมกับคำเตือน (หากไฟล์ดูเหมือนว่ามีความทันสมัยอยู่แล้ว) หรืออาจพยายามอัปเดตไฟล์แล้วหากไฟล์ไม่สามารถตรวจสอบได้ การอัปเดตถูกทิ้งโดยมีข้อผิดพลาด ซึ่งหมายความว่าควรจะปลอดภัยในการเรียกใช้การดำเนินการแบบอ่านซ้ำอีกครั้งหากคำสั่งถูกขัดจังหวะ หากคุณต้องการบังคับให้พยายามทำการอัพเดตแบบแบตช์เสมอโดยไม่คำนึงถึงขนาดและวันที่ของไฟล์ให้ใช้ตัวเลือก -I (เมื่ออ่านแบตช์) หากเกิดข้อผิดพลาดทรีปลายทางอาจอยู่ในสถานะที่ได้รับการปรับปรุงบางส่วน ในกรณีนั้น,

    เวอร์ชัน rsync ที่ใช้กับปลายทางทั้งหมดจะต้องเป็นอย่างน้อยใหม่เหมือนที่ใช้ในการสร้างแบตช์ไฟล์ Rsync จะตายโดยมีข้อผิดพลาดหากรุ่นโปรโตคอลในไฟล์แบทช์นั้นใหม่เกินไปสำหรับ rsync ที่อ่านแบบแบทช์ที่จะจัดการ ดูเพิ่มเติมที่ --protocol ตัวเลือกสำหรับวิธีการสร้าง rsync สร้างไฟล์แบทช์ที่ rsync เก่าสามารถเข้าใจได้ (โปรดทราบว่าไฟล์แบตช์เปลี่ยนไปเป็นเวอร์ชัน 2.6.3 ดังนั้นการผสมเวอร์ชั่นที่เก่ากว่ากับเวอร์ชั่นที่ใหม่กว่าจะไม่ทำงาน)

    เมื่ออ่านไฟล์แบตช์ rsync จะบังคับให้มีค่าของตัวเลือกบางตัวเพื่อจับคู่ข้อมูลในไฟล์แบตช์หากคุณไม่ได้ตั้งค่าให้เหมือนกันกับคำสั่งการเขียนแบทช์ ตัวเลือกอื่นสามารถเปลี่ยน (และควร) ได้ ตัวอย่างเช่น - การเขียนแบบแบทช์เปลี่ยนเป็น - อ่าน - แบตช์ - ไฟล์ - จากถูกดร็อปและ - ฟิลเตอร์ / - รวม / - ไม่รวมตัวเลือกที่ไม่ต้องการยกเว้นว่ามีการระบุตัวเลือก - ลบ .

    รหัสที่สร้างไฟล์ BATCH.sh แปลงตัวกรอง / รวม / แยกตัวเลือกใด ๆ ลงในรายการเดียวที่ผนวกเข้ากับเอกสาร "นี่" ไปยังไฟล์สคริปต์เชลล์ ผู้ใช้ขั้นสูงสามารถใช้สิ่งนี้เพื่อแก้ไขรายการแยกหากต้องการการเปลี่ยนแปลงในสิ่งที่ถูกลบโดย - ลบเป็นที่ต้องการ ผู้ใช้ทั่วไปสามารถละเว้นรายละเอียดนี้และใช้เชลล์สคริปต์เป็นวิธีที่ง่ายในการรันคำสั่ง --read-batch ที่เหมาะสมสำหรับข้อมูลที่แบตช์

    โหมดแบตช์ดั้งเดิมใน rsync อ้างอิงจาก "rsync +" แต่เวอร์ชันล่าสุดใช้การปรับใช้ใหม่

ฉันคิดว่าคุณสามารถลอง

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

คำสั่งที่แนะนำไม่ทำงาน:remote destination is not allowed with --read-batch
kynan

แสดงคำสั่งทั้งหมด -สำหรับชื่อไฟล์หมายถึงอ่านจากอินพุตมาตรฐานและ STDIN กำลังอ่านจากfooตัวอย่างในไฟล์โลคัล
Chloe

2
นี่ดูเหมือนจะเป็นทางออกที่ถูกต้องที่สุดสำหรับสิ่งที่ฉันพยายามทำถึงแม้ว่ากรณีการใช้งานของฉันสำหรับสิ่งนี้จะมีความยาวตั้งแต่ระเหยกลายเป็นอากาศธาตุ : D
Jessie

4

คุณอาจลองใช้พร้อมเพรียง มันควรจะเร็วกว่ามากในการสร้างรายการไฟล์เพราะมันจะเก็บแคชของไฟล์


2
หมายเหตุ: การพร้อมเพรียงจะไม่เก็บ 'แคช' ของไฟล์ไว้ มันจะเก็บฐานข้อมูลของชื่อไฟล์การประทับเวลา checksums มันยังทำการสแกนระบบไฟล์และสร้าง checksum เพื่อเปรียบเทียบกับรีโมต ข้อได้เปรียบเพียงอย่างเดียวของ Unison คือการซิงค์แบบสองทาง ฉันแนะนำ Unison แต่จะไม่ช่วยที่นี่
Chloe

4

rsync --batch-modeสนับสนุนหลายผู้รับ หากเป็นไปได้ในเครือข่ายของคุณมันอาจคุ้มค่าที่จะดู


2

วิธีการเกี่ยวกับการเปลี่ยนระบบไฟล์?

ก่อนหน้านี้ฉันเปลี่ยน FS หลายเทราไบต์จาก ext3 เป็น XFS เวลาในการสแกนไดเรกทอรี (โดยประมาณ 600,000 ไฟล์ครั้งล่าสุดที่ฉันตรวจสอบ) ไปจาก 15-17 นาทีถึงน้อยกว่า 30 วินาที!


1

ไม่ใช่คำตอบโดยตรง แต่ถ้าคุณใช้ rsync เวอร์ชัน 3+ มันจะเริ่มถ่ายโอนก่อนที่จะสร้างไฟล์ทั้งหมด

อีกทางเลือกหนึ่งที่ยังไม่มีประสิทธิภาพมากนักคือการเรียกใช้เป็นงานเพื่อให้ทำงานสองสามอย่างในเวลาเดียวกัน

นอกจากนี้ฉันแค่คิดถึงความแปลกประหลาดนี้หากคุณไม่รังเกียจการใช้น้ำมันดิน:

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

ที่แต่ละ localhost จะเป็นเซิร์ฟเวอร์ที่แตกต่างกันแน่นอน (สมมติว่าเข้าสู่ระบบด้วยคีย์) ไม่เคยใช้ข้างต้นมาก่อนว่า


อืม! น่าแปลกที่ cwrsync (rsync 3.0.7) ดูเหมือนจะไม่ทำเช่นนั้น ฉันจะต้องตรวจสอบว่าทำไมถึงเป็นเช่นนั้นเพราะจะช่วยได้มากในการลดรูทีนมหาศาลเหล่านี้ ขอบคุณ!
เจสซี

รุ่นนั้นทั้งสองด้าน?
Kyle Brandt

ไม่จริง เครื่องโลคัลคือ cwrsync 3.0.7 และรีโมตโฮสต์ (ดีที่ฉันกำลังทำงานด้วยตอนนี้) คือ rsync 3.0.3 บน Debian Lenny ดูเหมือนจะไม่เป็นความแตกต่างของรุ่นใหญ่เกินไปที่จะทำงานผิดปกติ แต่ฉันก็ไม่รู้ฉันจะดูการอัพเกรดด้านเดเบียน
เจสซี

1
ช่างเป็นอะไรที่แปลกนิดหน่อย อาจเป็นไปได้ว่าถ้าฉันไม่ได้ใช้ประโยชน์จากความจริงที่ว่า rsync ไม่จำเป็นต้องซ้ำข้อมูลสองสามกิ๊กผ่านการเชื่อมโยงที่ช้าหลายครั้งเมื่อมากที่สุดเพียงไม่กี่ร้อยกิโลไบต์ของมันมีการเปลี่ยนแปลง นอกจากนี้การทำให้ปลายทั้งสองไปที่ (cw) rsync 3.0.7 ยังคงสร้างรายการไฟล์และถ่ายโอนอย่างต่อเนื่อง ไม่ได้กังวลมากไปกว่านั้น
เจสซี

ไม่ใช่ "tar cf -." เช่นเดียวกับ "tar c." ?
Johan Boulé

1

วิธีการเกี่ยวกับการเรียกใช้งาน rsync จาก host1, host2 และ host3 หรือรันงานเพื่อคัดลอกไปที่ host1 จากนั้นรันบน host2 และ host3 เพื่อรับงานจาก host1


1

ทางออกที่ดีกว่าคือการสร้างพื้นที่เก็บข้อมูลที่มีคอมไพล์และเพียงแค่กดไปที่ 3 โฮสต์ เร็วกว่าคุณไม่จำเป็นต้องมีส่วนของรายการไฟล์และใช้ทรัพยากรน้อยลง

ขอให้โชคดี
João Miguel Neves


10
git ไม่รักษาเวลาการแก้ไขหรือการอนุญาต (ยกเว้นสำหรับรันบิต) และจะต้องเก็บสำเนาที่สองของข้อมูลเป็นวัตถุ git ใน.git/แม้ว่าจะผลักดันไปยังรีโมทซึ่งจะมีข้อมูลส่วนใหญ่แล้วจะเร็วขึ้น git ไม่ใช่การแทนที่ rsync
Dan D.

นอกจากนี้คอมไพล์สามารถดูได้แบบสาธารณะยกเว้นว่าคุณจ่าย
Chloe

8
@ Chloe คุณเข้าใจผิดเกี่ยวกับคอมไพล์ GitHub Git ตัวเองเป็น opensource ฟรีระบบกระจายการควบคุมเวอร์ชันและทุกคนสามารถเป็นเจ้าภาพเก็บคอมไพล์โดยวิธีการใด ๆ รวมทั้งhttp, และnfs afpGitHub เป็นเว็บไซต์ที่ดูแลการสร้างและบำรุงรักษา repos git ให้คุณและทำให้พวกเขาเป็นสาธารณะ (เว้นแต่คุณจะจ่าย)
toriningen

1
@Chloe GitHub สามารถดูได้แบบสาธารณะ แต่ BitBucket ให้บริการ repos ส่วนตัว
sws

2
นอกจากนี้ Git จะไม่ติดตามไดเรกทอรีว่าง
Flimm

1

ในการหาคำตอบนี้ฉันคิดว่าคุณต้องสร้างแบตช์โดยใช้ rsync ก่อนจากนั้นจึงส่งไปให้พวกเขาทั้งหมดซึ่งจะทำให้เป็นเช่นนั้นรายชื่อไฟล์จะต้องกระทืบเพียงครั้งเดียวแล้วคุณก็สามารถทำได้ พื้นหลังทั้งสาม rsyncs เพื่อให้ทำงานได้ในแบบคู่ขนาน


1

โซลูชันที่เป็นไปได้อีกอย่างหนึ่งก็คือใช้กระบวนการ rsync หลายตัวพร้อมกันในขณะที่คุณมีโฮสต์เช่นทางแยก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.