rsync - แทนที่เขียนไปยังไฟล์ทั้งหมดหรือเพียงแค่ในส่วนที่จำเป็นต้องอัพเดท? (สำหรับการสำรองข้อมูล btrfs + rsync)


21

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


จะทราบได้อย่างไรว่าสามารถหลีกเลี่ยงการเขียนไฟล์ทั้งหมด? ไม่จำเป็นต้องอ่านไฟล์ทั้งหมดก่อนเพื่อหาว่ามีอะไรเปลี่ยนแปลงหรือไม่
Mehrdad

2
@ Mehrdad ใช่มันทำ แต่การอ่านทั้งหมดไม่เป็นปัญหา หากrsyncอ่านไฟล์ทั้งหมดแล้วค้นหาและอัปเดตเฉพาะส่วนที่ต้องการ btrfs จะคัดลอกเฉพาะบล็อกที่อัปเดตเหล่านี้ แต่ถ้าrsyncอ่านและเขียนไฟล์ทั้งหมดมันจะเป็นปัญหา
Petr Pudlák

1
@ Mehrdad rsyncไม่เพียง แต่รู้ว่ามันอาจหลีกเลี่ยงการเขียนไฟล์ทั้งหมด แต่ก็สามารถทำได้โดยไม่ต้องคัดลอกไฟล์ทั้งหมดในเน็ต โปรแกรมเล็ก ๆ ที่ฉลาด
Gunther Piez

คำตอบ:


31

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

นี่คือวิธีการยืนยัน:

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

จากนั้นแตะไฟล์แล้วซิงค์อีกครั้ง

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

คุณสามารถตรวจสอบได้ว่ามันใช้ไอโหนดด้วย "ls -li" อีกครั้ง แต่ให้สังเกตว่ามันส่งทั้งไบต์ 64K ลองอีกครั้งด้วย --no-whole-file

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

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

หมายเหตุ (ดูความคิดเห็น) ว่าสำหรับระบบไฟล์ในท้องถิ่น--whole-fileจะถือว่า (ดูหน้าคนสำหรับ rsync) บนมืออื่น ๆ , ข้ามเครือข่าย--no-whole-fileจะสันนิษฐานดังนั้นในตัวเองจะทำงานเป็น--inplace--inplace --no-whole-file


ทำไมไม่ได้--inplaceบ่งบอก--no-whole-file?
Geremia

ไม่ใช่--no-whole-fileค่าเริ่มต้นเลยหรือ
Geremia

2
@Geremia ไม่ได้ถ้าทั้งสองเส้นทางเป็นของท้องถิ่น และตัวอย่างของฉันแสดงให้เห็น--inplaceว่าไม่ได้หมายความถึง--no-whole-fileรุ่นของ rsync ที่ฉันใช้ในปี 2013 แต่คุณสามารถทำการทดลองนี้ซ้ำกับ rsync ของคุณเอง
dataless

ดีinplaceไม่เกี่ยวกับ‚ scan สำหรับเดียวกัน / บล็อกที่แตกต่างกัน 'มันเป็นเพียงเกี่ยวกับการเขียนทับไฟล์ที่มีอยู่ในทันทีจาก offset 0 (อื่น ๆ คัดลอกชั่วคราวถูกสร้างขึ้นแล้วเท่านั้นไฟล์เป้าหมายเก่าลบและ tempoary คัดลอกชื่อ . มันอาจจะถือว่า“ความปลอดภัยมากขึ้น” เพื่อเก็บไฟล์เก่าเป็นเวลานานที่สุดถ้ากระบวนการได้รับการขัดจังหวะของหลักสูตรนี้จะเลวร้ายยิ่งสำหรับประสิทธิภาพการใช้พื้นที่เก็บข้อมูลสูงสุด (คิดว่าไฟล์ขนาดใหญ่) อาจจะกระจายตัว ... ) ... .
Frank Nocke

1
ฉันคิดว่ามันเป็นวิธีอื่นที่--no-whole-fileแสดงถึงเสมอ--inplaceมิฉะนั้นส่วนใหญ่ของการเพิ่มประสิทธิภาพจะหายไป ไม่พบเอกสารนี้แม้ว่า ...
Frank Nocke

15

นี่คือคำตอบที่ชัดเจนฉันเดาว่าอ้างอิงส่วนที่ถูกต้องของคู่มือ:

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.

4

--inplaceเขียนทับเฉพาะภูมิภาคที่มีการเปลี่ยนแปลง ใช้งานได้เสมอเมื่อเขียนถึง Btrfs


และคุณมีหลักฐานที่แสดงว่าไม่ได้เขียนทับส่วนอื่น ๆ ของไฟล์หรือไม่?
Petr Pudlák

เช่นเดียวกันกับ ZFS หรือไม่
ewwhite

@ewwhite: เนื่องจาก ZFS เป็น COW (copy-on-write) เช่น BTRFS ดังนั้นใช่
Geremia

@ PetrPudlák -vvvแสดงให้เห็นว่าการกระโดดข้ามบล็อคที่ตรงกัน
Tom Hale

3

อัลกอริทึมการถ่ายโอนเดลต้า rsync เกี่ยวข้องกับว่าไฟล์ทั้งหมดจะถูกส่งหรือเพียงแค่ส่วนที่แตกต่างกัน นี่เป็นพฤติกรรมเริ่มต้นเมื่อทำการซิงค์ไฟล์ระหว่างสองเครื่องเพื่อบันทึกบนแบนด์วิดท์ สิ่งนี้สามารถแทนที่ด้วย--whole-file(หรือ-W) เพื่อบังคับrsyncให้ส่งไฟล์ทั้งหมด

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


2

จากหน้าคน:

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

สิ่งนี้ทำให้ฉันเชื่อว่ามันเขียนทับไฟล์ทั้งหมด - ฉันคิดว่าคงเป็นไปไม่ได้ที่ rsync จะทำงานในลักษณะอื่น


2
หลังจากพิจารณาว่าส่วนใดที่จำเป็นต้องมีการอัพเดตก็สามารถค้นหาชิ้นส่วนเหล่านั้นและอัพเดตได้แทนที่จะเขียนไฟล์ทั้งหมด
Petr Pudlák

0

งานทางทฤษฎีเกี่ยวกับ rsync ในสถานที่อธิบายไว้ในบทความนี้

เอกสารอ้างอิง: D. Rasch และ R. Burns In-Place Rsync: การซิงโครไนซ์ไฟล์สำหรับอุปกรณ์พกพาและไร้สาย การประชุมทางเทคนิคประจำปี USENIX, FREENIX track, 91-100, USENIX, 2003

จากลิงค์:

... เราปรับเปลี่ยนการใช้ rsync ที่มีอยู่เพื่อรองรับการสร้างใหม่ในสถานที่

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

ดังนั้นนี่จึงเป็นรายละเอียดทางเทคนิคของสิ่งที่ rsync - กำลังทำอยู่ ตามจุดเริ่มต้นของกระดาษ:

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

ตามที่เห็นได้ชัดจากคำตอบของ @ datalessนี่ก็หมายความว่า--inplaceใช้พื้นที่เก็บข้อมูลเดียวกัน แต่อาจยังคงคัดลอกไฟล์ทั้งหมดลงในพื้นที่นั้น โดยเฉพาะอย่างยิ่งเมื่อทำสำเนาจาก / ไปยังระบบไฟล์โลคัล rsync จะใช้--whole-fileตัวเลือก แต่เมื่อมันข้ามระบบเครือข่ายในทางกลับกันก็ถือว่า--no-whole-fileตัวเลือก


1
อืมดังนั้นคำตอบคืออะไร?
Xen2050

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