วิธีรับ rsync เชื่อมโยงไฟล์ที่เหมือนกันด้วยตัวเลือก --link-dest หากไฟล์เก่ามีอยู่แล้ว?


11

อาจคิดว่าการ--link-destเข้าสู่ไฟล์ที่เหมือนกันอาจใช้ได้ในทุกกรณี แต่มันไม่ได้เมื่อไฟล์ที่มีอยู่แม้ว่าไฟล์จะล้าสมัย / มีเนื้อหาที่แตกต่างกัน

เป็นเพราะสิ่งนี้จากหน้า rsync ของมนุษย์ใน--link-dest:

"ตัวเลือกนี้ทำงานได้ดีที่สุดเมื่อคัดลอกไปยังลำดับชั้นปลายทางที่ว่างเปล่าเนื่องจาก rsync จะถือว่าไฟล์ที่มีอยู่นั้นชัดเจน (ดังนั้นrsync จะไม่ดูใน link-dest dirs เมื่อไฟล์ปลายทางมีอยู่แล้ว ")

ซึ่งหมายความว่าหากy/fileมีอยู่เหมือนแหล่งที่มาและz/fileล้าสมัย

rsync -a --del -link-dest=y source:/file z

จะส่งผลให้ inodes สองตัว (และสองเท่าของพื้นที่ใช้งาน) ถูกใช้งานy/fileและz/fileซึ่งจะมีเนื้อหาและ datestamps เดียวกัน

ฉันเจอสิ่งนี้เพราะฉันสำรองข้อมูลทุกวันโดยพื้นฐานแล้วสคริปต์นี้รันวันละครั้ง

mv $somedaysago $today; 
yest=$today; today=`date +%Y%m%d`;
rsync -avPShyH --del --link-dest=../$yest host:/dirs $today

เนื่องจากการสำรองข้อมูลของฉันครอบคลุมไฟล์มากถึง 10M การดำเนินการrm -rf $olddir; rsync source:$dir newdirใช้เวลานานเกินไป (โดยเฉพาะเมื่อ 0.5% ของไฟล์ที่เปลี่ยนต่อวันทำให้เกิดการลบและการสร้างรายการ dir 10M เพื่อจัดการไฟล์ใหม่หรือไฟล์ที่เปลี่ยนแปลง 50K ซึ่งทำให้ฉัน การสำรองข้อมูลไม่สมบูรณ์ในเวลาสำหรับวันถัดไป)

นี่คือตัวอย่างของสถานการณ์:

aเป็นแหล่งที่มาของเรา1ผ่าน4เป็นข้อมูลสำรองหมายเลขของเรา:

$ mkdir -p 1 2; echo foo > 1/foobar; cp -lrv 1/* 2
`1/foobar' -> `2/foobar'
$ ls -i1 */foobar
1053003 1/foobar
1053003 2/foobar

$ mkdir a; echo quux > a/foobar
$ mv 1 3; rsync -avPhyH --del --link-dest=../2 a/ 3
sending incremental file list
./
foobar
           5 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 105 bytes  received 34 bytes  278.00 bytes/sec
total size is 5  speedup is 0.04

$ ls -i1 */foobar
1053003 2/foobar
1053007 3/foobar
1053006 a/foobar

$ mv 2 4; rsync -avPhyH --del --link-dest=../3 a/ 4
sending incremental file list
./
foobar
           5 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 105 bytes  received 34 bytes  278.00 bytes/sec
total size is 5  speedup is 0.04


$ ls -il1 */foobar
1053007 -rw-r--r-- 1 math math 5 Mar 30 00:57 3/foobar
1053008 -rw-r--r-- 1 math math 5 Mar 30 00:57 4/foobar
1053006 -rw-r--r-- 1 math math 5 Mar 30 00:57 a/foobar

$ md5sum [34a]/foobar
d3b07a382ec010c01889250fce66fb13  3/foobar
d3b07a382ec010c01889250fce66fb13  4/foobar
d3b07a382ec010c01889250fce66fb13  a/foobar

ตอนนี้เรามีการสำรองข้อมูล 2 ชุดa/foobarที่เหมือนกันทุกวิธีรวมถึงการประทับเวลา แต่มี inodes ที่แตกต่างกัน

อาจคิดว่าจะมีวิธีแก้ปัญหา--delete-beforeซึ่งฆ่าผลประโยชน์ของการสแกนที่เพิ่มขึ้น แต่สิ่งนี้ไม่ได้ช่วยอย่างใดอย่างหนึ่งเนื่องจากไฟล์จะไม่ถูกลบ แต่ใช้เป็นพื้นฐานในกรณีที่มีการทำสำเนาแบบเพิ่มขึ้น

เราอาจคาดเดาเพิ่มเติมได้จากนั้นเราสามารถปิดการป้องกันความเสี่ยงที่เพิ่มขึ้นนี้คัดลอก--whole-fileแต่ไม่ได้ช่วยอัลกอริทึมใด ๆ ไม่มีวิธีที่จะได้รับสิ่งที่เราต้องการ

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

วิธีการแก้ปัญหาน่าเสียดายที่จะย้ายจาก rsync เดียวเป็นการดำเนินการแบบปรมาณูไปยังการดำเนินการแบบแห้งด้วย-nการบันทึกการประมวลผลบันทึกนั้นเป็นอินพุตไปยังการลบไฟล์ที่ถูกเปลี่ยนล่วงหน้าทั้งหมดด้วยตนเองจากนั้นทำงานrsync --link-destเพื่อให้ได้สิ่งที่เราต้องการ เปรียบเทียบกับ rsync ใหม่ทั้งหมด

ภาคผนวก:พยายามเชื่อมโยงล่วงหน้า$yesterdayและ$todayบนเซิร์ฟเวอร์สำรองก่อนทำการสำรองข้อมูลกับกล่องผลิตด้วยrsync --link-dest=../$yesterday $yesterday/ $today- แต่ผลลัพธ์เดียวกัน - ไฟล์ใด ๆ ที่มีอยู่ไม่ว่าจะด้วยวิธีใดก็ตามแม้ความยาว 0 จะไม่ถูกลบออกและเชื่อมโยงปลายทางแทน สำเนาใหม่จะทำจาก sourcedir พร้อม inode ใหม่และใช้พื้นที่ดิสก์มากขึ้น

มองpax(1)ว่าเป็นวิธีการเชื่อมโยงล่วงหน้าก่อนการสำรองข้อมูลที่เป็นไปได้


ฉันใช้--delete-afterในสถานการณ์การใช้งานนี้เกิดอะไรขึ้นกับสิ่งนี้?
gogoud

1
--delete-afterใช้ได้ แต่ไม่เกี่ยวข้องกับปัญหาที่เกิดขึ้น ไฟล์ที่หายไปจากแหล่งที่มาจะถูกลบหลังจากคัดลอกเสร็จแล้ว ปัญหาที่ฉันอธิบายเกี่ยวกับการสำรองข้อมูลที่ทำในวันนี้เหมือนกับของเมื่อวาน แต่เทียบกับไฟล์เก่าที่ล้าสมัยที่ไม่ได้เชื่อมโยงกับ inode ของเมื่อวานนี้ แต่เก็บไว้เป็นไฟล์ใหม่ที่พื้นที่ดิสก์สองเท่าเมื่อวาน ถือว่าเป็นสำเนาที่เหมือนกัน
คณิตศาสตร์

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

1
หากคุณไม่ได้รับคำตอบที่ต้องการที่นี่คุณสามารถโพสต์ในรายการ rsync นักพัฒนา rsync ตอบคำถามอย่างสม่ำเสมอพร้อมกับผู้ใช้ขั้นสูงจำนวนมาก คุณสามารถค้นหาพวกเขาผ่านทางlists.samba.org/mailman/listinfo/rsync ฉันมักจะแฝงตัวอยู่ที่นั่นและเรียนรู้มากมาย
Joe

rsnapshot จะไม่รีไซเคิลการสำรองข้อมูลเก่า - และฉันต้อง: ถ้าฉันมีการสำรองข้อมูล 2 mo และ 2-mo + 1 วันฉันสามารถวนรอบเป็นเป้าหมายใหม่ได้ ตั้งแต่ ~ 5% ของการเปลี่ยนแปลงไฟล์ / วันฉันสร้างลิงก์ 50K แทน 10M ความแตกต่างของความเร็วนี้ช่วยให้สามารถสำรองเซิร์ฟเวอร์ได้ 5 เครื่องต่อคืนไม่ hardlink(1)ช้า (ช้ากว่าการสแกนข้อมูลเมตาของ rsync 15 เท่า); paxเร็วกว่า แต่ใช้หัว HDD เปรียบเทียบข้อมูลสำรองเก่ากับใหม่ rsync -nเพื่อรับรายการเดลต้าหมายถึงการกดปุ่มเซิร์ฟเวอร์การผลิตสองครั้ง (การสแกนไฟล์ 10M นั้นส่งผลกระทบมากกว่าการคัดลอกการเปลี่ยนแปลง 50K) ป่วยส่งรายการเกี่ยวกับตัวเลือกใน rsync เพื่อให้สิ่งนี้
คณิตศาสตร์

คำตอบ:


12

(แปลงจากการแก้ไขคำถาม)

นี่คือการแก้ไขโดยการอัพเกรด rsync เวอร์ชั่น 3.1.1 หรือใหม่กว่าจะแทนที่ไฟล์ที่เหมือนกันในเป้าหมายและ--link-destไดเรกทอรีด้วยไฟล์ hardlinked หนึ่งไฟล์ ประหยัดพื้นที่มากมาย

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