การซิงโครไนซ์โครงสร้างโฟลเดอร์ที่มีขนาดใหญ่มาก


14

เรามีโครงสร้างโฟลเดอร์บนอินทราเน็ตของเราซึ่งมีไฟล์ประมาณ 800,000 ไฟล์แบ่งออกเป็นประมาณ 4,000 โฟลเดอร์ เราจำเป็นต้องซิงโครไนซ์สิ่งนี้กับกลุ่มเครื่องขนาดเล็กใน DMZ ของเรา ความลึกของโครงสร้างตื้นมาก (ไม่ลึกเกินสองระดับ)

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

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

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

มีคนอื่นที่ทำงานในโครงการการประสานขนาดใหญ่ของการเรียงลำดับนี้หรือไม่? มีบางสิ่งที่ออกแบบมาเพื่อจัดการโครงสร้างไฟล์ขนาดใหญ่เช่นนี้เพื่อการซิงโครไนซ์หรือไม่?


คุณได้ลองแยกการทำงานของ rsync หลายอินสแตนซ์ออกพร้อมกันหรือไม่? ฉันไม่มีภาพที่ดีจริง ๆ ของโครงสร้างไดเรกทอรี แต่คุณสามารถแยกมันออกตามชื่อไดเรกทอรีหรือชื่อไฟล์
คลัช

เราคิดเกี่ยวกับสิ่งนั้น แต่ด้วยโครงสร้างที่เรียบเช่นนี้มันยากที่จะหาเส้นแบ่งที่ดีที่จะแยกงาน มันซับซ้อนโดยข้อเท็จจริงที่ว่าโฟลเดอร์ส่วนใหญ่มีชื่อคล้ายกันมาก (มีแบบแผนการตั้งชื่อซึ่งทำให้โฟลเดอร์ส่วนใหญ่เริ่มต้นด้วยชุดอักขระ 6 ตัวเริ่มต้นชุดเดียวกัน)
MightyE

คุณเคยพบทางออกที่ดีหรือไม่? ฉันกำลังพิจารณา lsyncd สำหรับ dir กับ 65535 ย่อย dirs แต่ละที่จะมี 65 ^ 16 ไฟล์
Mike Diehn

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

คำตอบ:


9

หากคุณเชื่อถือระบบไฟล์เวลาที่แก้ไขล่าสุดคุณสามารถเพิ่มความเร็วได้โดยการรวม Rsync เข้ากับยูทิลิตี้ 'find' ของ UNIX / Linux 'find' สามารถรวบรวมรายการของไฟล์ทั้งหมดที่แสดงเวลาที่แก้ไขล่าสุดภายในวันที่ผ่านมาและจากนั้นไพพ์เท่านั้นที่จะย่อรายการไฟล์ / ไดเรกทอรีไปยัง Rsync สิ่งนี้เร็วกว่าการให้ Rsync เปรียบเทียบข้อมูลเมตาของทุก ๆ ไฟล์บนผู้ส่งกับเซิร์ฟเวอร์ระยะไกล

กล่าวโดยย่อคำสั่งต่อไปนี้จะดำเนินการ Rsync เฉพาะในรายการไฟล์และไดเรกทอรีที่มีการเปลี่ยนแปลงใน 24 ชั่วโมงที่ผ่านมา: (Rsync จะไม่รบกวนตรวจสอบไฟล์ / ไดเรกทอรีอื่น ๆ )

find /local/data/path/ -mindepth 1 -ctime -0 -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.

ในกรณีที่คุณไม่คุ้นเคยกับคำสั่ง 'find' คำสั่งนั้นจะค้นหาทรีย่อยของไดเรกทอรีอีกครั้งค้นหาไฟล์และ / หรือไดเรกทอรีที่ตรงกับเกณฑ์ที่คุณระบุ ตัวอย่างเช่นคำสั่งนี้:

find . -name '\.svn' -type d -ctime -0 -print

จะเริ่มในไดเรกทอรีปัจจุบัน (".") และเรียกคืนผ่านไดเรกทอรีย่อยทั้งหมดโดยมองหา:

  • ไดเรกทอรีใด ๆ ("-type d"),
  • ชื่อ ".svn" ("-name '.svn'"),
  • ที่มีการแก้ไขข้อมูลเมตาใน 24 ชั่วโมงที่ผ่านมา ("-ctime -0")

มันพิมพ์ชื่อพา ธ เต็ม ("-print") ของสิ่งที่ตรงกับเกณฑ์เหล่านั้นในการส่งออกมาตรฐาน ตัวเลือก '-name', '-type' และ '-ctime' เรียกว่า "tests" และตัวเลือก '-print' เรียกว่า "action" หน้าคนสำหรับ 'ค้นหา' มีรายการการทดสอบและการกระทำที่สมบูรณ์

หากคุณต้องการให้ฉลาดจริง ๆ คุณสามารถใช้การทดสอบ 'ค้นหา' คำสั่ง '-cnewer' แทน '-ctime' เพื่อทำให้กระบวนการนี้ทนต่อความผิดพลาดและยืดหยุ่นได้มากขึ้น '-cnewer' ทดสอบว่าแต่ละไฟล์ / ไดเร็กทอรีในแผนผังมีการเปลี่ยนแปลงข้อมูลเมตามากกว่าไฟล์อ้างอิงบางไฟล์หรือไม่ ใช้ 'สัมผัส' เพื่อสร้างไฟล์อ้างอิงของ NEXT ที่จุดเริ่มต้นของการวิ่งแต่ละครั้งก่อน 'ค้นหา ... | คำสั่ง rsync ... 'ดำเนินการ นี่คือการใช้งานพื้นฐาน:

#!/bin/sh
curr_ref_file=`ls /var/run/last_rsync_run.*`
next_ref_file="/var/run/last_rsync_run.$RANDOM"
touch $next_ref_file
find /local/data/path/ -mindepth 1 -cnewer $curr_ref_file -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
rm -f $curr_ref_file

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


นี่เป็นทางออกที่ฉลาดที่สุด! ฉันคิดว่าคุณหมายถึงtouch $next_ref_fileในตอนท้าย? มันทำให้เราไม่มีความสามารถในการรับมือกับเส้นทางที่ถูกลบแม้ว่า (ในที่สุดรายงานการเก็บถาวรแบบถาวรเหล่านี้ก็เก่าพอที่จะถูกเก็บถาวรและถูกลบทิ้ง) นั่นอาจจะไม่ใช่การหยุดโชว์
MightyE

ฉันพบว่าแม้เพียงแค่find . -ctime 0ค่อนข้างช้าในโครงสร้างไดเรกทอรีนี้ (ยังรอให้เสร็จสมบูรณ์เพื่อรายงานเวลา) อันที่จริงทำให้ฉันเสียใจเล็กน้อยเพราะดูเหมือนว่านี่อาจเป็นการดำเนินการในระดับต่ำมากซึ่งอาจจะเป็นการกำหนดบาร์ให้เร็วที่สุดที่เราคาดหวังว่างานนี้จะเสร็จสมบูรณ์ อาจเป็นกรณีที่ดิสก์ I / O เป็นปัจจัย จำกัด ที่นี่
MightyE

สำหรับ scriptlet นั้นใช่ฉันทำผิดไป ฉันหมายถึงเรียกใช้ 'แตะ' ที่ 'next_ref_file' (ไม่ใช่ 'curr_ref_file') ก่อนที่จะเรียกใช้ 'find ... | คำสั่ง rsync ... ' (ฉันจะแก้ไขคำตอบของฉัน)
Ryan B. Lynch

3
สำหรับคำสั่ง 'find' ที่ช้า: คุณใช้ระบบแฟ้มชนิดใด หากคุณใช้ Ext3 คุณอาจต้องการพิจารณาการปรับแต่ง FS สองรายการ: 1) เรียกใช้ 'tune2fs -O dir_index <DEVICE_NODE>' เพื่อเปิดใช้งานคุณลักษณะ 'dir_index' ของ Ext3 เพื่อเพิ่มความเร็วในการเข้าถึง dirs ด้วยการนับไฟล์จำนวนมาก 2) เรียกใช้ 'mount -o remount, noatime, nodiratime' เพื่อปิดการอัปเดตเวลาเข้าถึงซึ่งจะช่วยเพิ่มความเร็วในการอ่านโดยทั่วไป 'dumpe2fs -h <DEVICE_NODE> | grep dir_index 'บอกคุณว่า' dir_index 'เปิดใช้งานอยู่แล้ว (ในบาง distros เป็นค่าเริ่มต้น) และ' mount | grep <DEVICE_NODE> 'บอกคุณเกี่ยวกับการอัพเดทเวลาเข้าถึง
Ryan B. Lynch

น่าเศร้าที่เป็น NTFS - Windows 2003 Server ที่ใช้ Cygwin สำหรับคำสั่ง find ฉันจะจำตัวเลือกการปรับแต่งเหล่านั้น (คำแนะนำที่ดีเยี่ยม) สำหรับ ext3 ในกรณีที่เราเคยพบเจอสิ่งที่คล้ายกันในกลุ่ม Debian ของเรา
MightyE

7

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


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

2
ครั้งแรกที่คุณสร้างดัชนีทั้งสองด้านเวลาสร้างใหม่จะคล้ายกับ rsync เนื่องจากมีการแฮชแต่ละไฟล์ เมื่อทำสิ่งนี้เสร็จแล้ว unison จะใช้เวลาที่แก้ไขล่าสุดของไดเรกทอรีเพื่อระบุว่าเมื่อใดที่ไฟล์มีการเปลี่ยนแปลงและจะต้องสแกนไฟล์นั้นเพื่อหาการเปลี่ยนแปลงเท่านั้น
Dave Cheney

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

ขณะนี้ใช้เวลาประมาณ 2 ชั่วโมงในการสร้างแคตาล็อกเริ่มต้นเพื่อสแกนหาการเปลี่ยนแปลง ฉันค่อนข้างประหลาดใจว่า RAM Unison ใช้งานได้เท่าไร สำหรับการรวบรวมไฟล์ของเราเซิร์ฟเวอร์ต้นทางใช้งาน 635M และไคลเอนต์ระยะไกลกำลังใช้งาน 366M หากต้องการซิงโครไนซ์เครื่องหลายเครื่องในคลัสเตอร์จะเป็นรอยเท้าที่ค่อนข้างหนักโดยเฉพาะกับเซิร์ฟเวอร์ต้นทาง!
MightyE

1
คุณสามารถจัดโครงสร้างข้อมูลของคุณในแบบที่ทำให้ง่ายต่อการระบุข้อมูลที่มีการเปลี่ยนแปลงเมื่อเร็ว ๆ นี้? คือจัดเก็บในรูปแบบปี / เดือน / วัน / ...
Dave Cheney


2

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


เราได้ลองโดยใช้และไม่มีแฟล็ก -z ดูเหมือนจะไม่ส่งผลกระทบต่อระยะเวลาการดำเนินการ "การสร้างรายการไฟล์"
MightyE

2

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

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