วิธีที่ดีที่สุดในการคัดลอกไฟล์นับล้านไฟล์ระหว่าง 2 เซิร์ฟเวอร์


39

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

ความคิดที่สองของฉันคือการใช้ scp แต่ต้องการได้รับความคิดเห็นจากภายนอกเพื่อดูว่ามีวิธีที่ดีกว่านี้หรือไม่ ขอบคุณ!


คอขวดน่าจะเป็นระบบไฟล์ที่ด้านรับ ระบบไฟล์ส่วนใหญ่จะจบลงด้วยการเพิ่มไฟล์ที่คุณใส่ลงในไดเรกทอรีเดียวให้ช้าลง (นั่นคือทุกครั้งที่ rsync เพิ่มไฟล์ใหม่ทางด้านการรับ ระบบไฟล์ที่เก่ากว่าจำนวนมากไม่สามารถมีไฟล์มากกว่า 32K ในไดเรกทอรีเดียว
Mikko Rantalainen

คำตอบ:


41

สิ่งนี้จะทำงานได้ดี:

tar c some/dir | gzip - |  ssh host2 tar xz

อาจละเว้น gzip และแฟล็ก "z" สำหรับการแยกเนื่องจากคุณอยู่ในเครือข่ายกิกะบิต


จำเป็นต้องใช้ gzip หรือไม่หรือบีบอัดสตรีมอย่างไร? หรือสามารถที่จะทำมันได้หรือไม่
Thilo

1
ssh จะบีบอัดสตรีมหากคุณผ่าน "-C" บน LAN ฉันจะไม่รำคาญกับการบีบอัดสตรีม ผ่านทางอินเทอร์เน็ตฉันอาจจะเว้นแต่จะถูกบีบอัดแล้ว

6
โดยส่วนตัวฉันจะทิ้ง gzip ไว้: แม้แต่กิกะบิตอีเธอร์เน็ตคอขวดก็ไม่น่าจะเป็นซีพียูมากนัก
Benji XVI

6
@BenjiXVI คอขวดจะเป็นซีพียูอย่างแน่นอนซึ่งgzipจะทำงานบนแกนเดียวเท่านั้น คุณสามารถคาดหวังได้ประมาณ 30 MB / s ด้วยระดับการบีบอัดเริ่มต้นที่ 6 - แต่สิ่งนี้จะไม่ส่งผลให้ Gigabit Ethernet สูงสุด
syneticon-dj

2
ใช้ pbzip2 หรือไม่ ...
Apache

19

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

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


6
+1 สำหรับการเคลื่อนย้ายไดรฟ์ร่างกายมันเร็วกว่าวิธีนี้
Robert Gould

1
มันแน่ใจว่าเต้นคัดลอกทุกอย่างบนไดรฟ์กระโดดและจะกลับมา ...
VirtuosiMedia

@RobertGould ลองใช้ IPoAC เป็นโปรโตคอลการส่งของเรา: "D
coolcat007

12

ในการคัดลอกไฟล์หลายล้านไฟล์บนสวิตช์กิกะบิต (ในสภาพแวดล้อมที่เชื่อถือได้) คุณสามารถใช้การรวมกันของnetcat (or nc)และtarตามที่ผู้ใช้แนะนำ 55556 สิ่งนี้จะสตรีมไฟล์ทั้งหมดเป็นไฟล์ขนาดใหญ่หนึ่งไฟล์ (ดูที่การคัดลอกไฟล์อย่างรวดเร็ว - Linux! (39 GB) )

# requires netcat on both servers
nc -l -p 2342 | tar -C /target/dir -xzf -   # destination box
tar -cz /source/dir | nc Target_Box 2342    # source box

วันนี้มีสิ่งต่างๆมากมายที่พยายามทำ IPv6 ก่อนอื่นคุณอาจต้องใช้สวิตช์ -4 พร้อมกับคำสั่ง nc ของคุณทั้งสองด้านเพื่อให้มันทำงานบน IPv4 LAN แบบเก่า
BeowulfNode42

5

เรามีไฟล์ประมาณ 1 ล้านไฟล์ในไดเรกทอรี (มูลค่าไฟล์ประมาณ 4 ปี)

และเราใช้ robocopy เพื่อย้ายไฟล์ไปยังไดเรกทอรี YYYY / MM (ประมาณ 35-45,000 ไฟล์ต่อเดือน) .. เราใส่สคริปต์ robocopy ในไฟล์. bat ดังนี้:

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\11
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081201 /MINAGE:20090101 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\12
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090101 /MINAGE:20090201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\01
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090201 /MINAGE:20090301 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\02

บันทึกย่อ .. /ns /nc /nfl /npเพื่อหลีกเลี่ยงการ bloating ไฟล์บันทึกข้อมูลเพิ่มเติม /log+...คือการเขียนข้อมูลสรุปลงในไฟล์บันทึก

/minage and /maxage is to copy files modified with in that date range. 

ดังนั้นสำหรับตัวอย่างไฟล์ที่แก้ไข> = 01 / Nov / 2008 (รวม) ถึงไฟล์ที่แก้ไข <01 / Dec / 2008 (ไม่รวม)

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\11

/mov เพื่อย้ายไฟล์

จากนั้นไดเรกทอรีแหล่งที่มา

แล้วไดเรกทอรีปลายทางมา (ไดเรกทอรีจะถูกสร้างขึ้นทันทีและเมื่อจำเป็น)

ใช้เวลาประมาณ 40 - 60 นาทีสำหรับการถ่ายโอน 1 เดือน (ประมาณ 35-45,000 ไฟล์) เราคิดว่ามันใช้เวลาประมาณ 12 ชั่วโมงหรือน้อยกว่าสำหรับการถ่ายโอน 1 ปี

ใช้ Windows Server 2003

ทุกสิ่งถูกบันทึกไว้ในล็อกไฟล์ ... เวลาเริ่มต้น, เวลาสิ้นสุดและจำนวนไฟล์ที่คัดลอก

Robocopy บันทึกวัน


robocopy ทุกวันนี้มีสวิตช์ / MT [: n] สำหรับทำสำเนาแบบมัลติเธรดที่มีเธรด n (ค่าเริ่มต้น 8) เพื่อให้ได้ผลเหมือนกันเท่านั้นดีกว่าและไม่พึ่งพาช่วงวันที่และอนุญาตให้ใช้บรรทัดคำสั่งเดียวแทนที่จะเป็นหนึ่ง ต่อกระทู้ แม้ว่าสวิตช์ MT จะไม่สามารถใช้งานได้ใน Windows 2003
BeowulfNode42

4

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


4

ฉันชอบที่จะใช้lz4เป็นเครื่องมือบีบอัดข้อมูลที่เร็วที่สุดในขณะนี้ ตัวเลือก SSH -c arcfour128ใช้อัลกอริทึมการเข้ารหัสที่เร็วกว่าค่าเริ่มต้น [1]

ดังนั้นการถ่ายโอนไดเรกทอรีดูเหมือนว่า:

tar -c folder | lz4 -c | ssh -carcfour128 somehost 'lz4 -d | tar -x > folder'

โปรดทราบว่าในคำสั่ง Debian lz4 คือ lz4c และบน CentOS มันคือ lz4


การเข้ารหัส / ถอดรหัส ssh อาจเป็นปัญหาคอขวดเนื่องจากการใช้งาน cpu บน cpu ต้นทางหรือปลายทางและลักษณะเธรดเดี่ยวของการใช้งาน ssh เกือบทั้งหมด มันเป็นกิกะบิต LAN ส่วนตัวจึงไม่จำเป็นต้องเข้ารหัส
BeowulfNode42

3

Robocopyยอดเยี่ยมสำหรับสิ่งต่าง ๆ เช่นนี้ จะลองอีกครั้งหลังจากหมดเวลาเครือข่ายและยังช่วยให้คุณสามารถตั้งค่าความล่าช้าของช่องว่างระหว่างแพ็กเก็ตเพื่อล้นท่อ

[แก้ไข]

โปรดทราบว่านี่เป็นแอปพลิเคชัน Windows เท่านั้น


สมมติว่าคุณอยู่ในหน้าต่างแน่นอน สิ่งที่ดีเกี่ยวกับ robocopy คือแอพมีหน้าที่รับผิดชอบในการวนซ้ำไฟล์ปัญหาเกี่ยวกับยูนิกซ์ utils ก็คือคุณอาจมีพื้นที่ว่างไม่เพียงพอในการขยายชื่อ
Martin Beckett

3

ฉันรู้ว่ามันอาจจะงี่เง่า - แต่คุณเคยคิดที่จะคัดลอกมันไปยังดิสก์ภายนอกแล้วนำไปไว้ที่เซิร์ฟเวอร์อื่นหรือไม่? มันอาจเป็นทางออกที่มีประสิทธิภาพและง่ายที่สุด


3

เรากำลังตรวจสอบปัญหานี้ในขณะนี้ เราจำเป็นต้องถ่ายโอนไฟล์ขนาดเล็กประมาณ 18 ล้านไฟล์ - รวมทั้งหมดประมาณ 200GB เราบรรลุประสิทธิภาพที่ดีที่สุดโดยใช้ XCopy แบบเก่า แต่ก็ยังใช้เวลานาน ประมาณ 3 วันจากเซิร์ฟเวอร์ 1 เครื่องไปยังเซิร์ฟเวอร์อื่นประมาณ 2 สัปดาห์สำหรับไดรฟ์ภายนอก!

ผ่านกระบวนการอื่นเราจำเป็นต้องทำซ้ำเซิร์ฟเวอร์ สิ่งนี้ทำกับ Acronis ใช้เวลาประมาณ 3 ชั่วโมง !!!

เราจะทำการตรวจสอบนี้อีก คำแนะนำ dd ด้านบนอาจให้ผลลัพธ์ที่คล้ายกัน


2

แล้วตันของข้อเสนอแนะที่ดี แต่อยากจะโยนในBeyond เปรียบเทียบ ฉันเพิ่งถ่ายโอนประมาณ 750,000 ไฟล์ระหว่าง 5KB และ 20MB จากเซิร์ฟเวอร์หนึ่งไปยังอีกผ่านกิกะบิตสวิตช์ มันไม่ได้สะอึกเลย ได้รับมันใช้เวลาสักครู่ แต่ฉันคาดหวังว่ามีข้อมูลมากมาย


1

ฉันจะดูว่า zip-> copy-> unzip ทำงานอย่างไร

หรือระบบการบีบอัด / เก็บถาวรที่คุณชื่นชอบคืออะไร


ใช่บีบอัดให้เป็นหนึ่งไฟล์จะเป็นความคิดที่ดีเกินไป
โรเบิร์ตกูลด์

แม้แต่แค่ลูกฟุตบอล
Joel Coehoorn

1

บรรจุลงในไฟล์เดียวก่อนที่คุณจะคัดลอกแล้วแกะออกอีกครั้งหลังจากคัดลอกแล้ว


1

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

แนวทาง tar เกือบสองเท่าของอัตราการถ่ายโอนเมื่อเทียบกับ scp หรือ rsync (YMMV)

นี่คือคำสั่ง tar โปรดทราบว่าคุณจะต้องเปิดใช้งานคำสั่ง r โดยการสร้างไฟล์. rhosts ในโฮมไดเร็กตอรี่ของแต่ละเครื่อง (ลบไฟล์เหล่านี้หลังจากที่พวกเขาคัดลอกเสร็จสมบูรณ์ - มันเป็นปัญหาด้านความปลอดภัยที่ฉาวโฉ่) โปรดทราบว่าตามปกติ HP-UX นั้นอึดอัด - ในขณะที่คนอื่น ๆ ในโลกใช้ 'rsh' สำหรับคำสั่งเชลล์ระยะไกล HP-UX ใช้ 'remsh' 'rsh' เป็นเชลล์ จำกัด ชนิดหนึ่งใน HP parlance

box1> cd source_directory; tar cf - . | remsh box2 "cd target_directory; tar xf - "

คำสั่ง tar แรกสร้างไฟล์ชื่อ '-' ซึ่งเป็นโทเค็นพิเศษที่มีความหมายว่า 'เอาต์พุตมาตรฐาน' ในกรณีนี้ ไฟล์เก็บถาวรที่สร้างขึ้นมีไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน (.) รวมทั้งไดเรกทอรีย่อยทั้งหมด (tar จะเรียกซ้ำโดยค่าเริ่มต้น) ไฟล์เก็บถาวรนี้ถูกไพพ์ลงในคำสั่ง remsh ซึ่งส่งไปยังเครื่อง box2 ในช่อง 2 ฉันเปลี่ยนไดเรกทอรีรับที่เหมาะสมก่อนจากนั้นฉันแยกจาก '-' หรือ 'อินพุตมาตรฐาน' ไฟล์ขาเข้า

ฉันมี 6 คำสั่ง tar เหล่านี้ทำงานพร้อมกันเพื่อให้แน่ใจว่าการเชื่อมโยงเครือข่ายอิ่มตัวด้วยข้อมูลแม้ว่าฉันสงสัยว่าการเข้าถึงดิสก์อาจเป็นปัจจัย จำกัด


1

ข้ามระบบไฟล์

คุณสามารถยกเลิกการต่อเชื่อมพาร์ติชั่นนี้ที่ไฟล์มีอยู่หรือติดตั้งแบบอ่านอย่างเดียวได้หรือไม่? ทำสิ่งนั้นเช่น:

dd if=/dev/PARTITION | ssh username@host "dd of=diskimage.bin"

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

หากคุณกล้าหาญจริงๆคุณสามารถddกลับเข้าไปในพาร์ติชั่นด้านปลายทางได้โดยตรง ฉันไม่แนะนำ


0

คุณสามารถลองดังต่อไปนี้ (อาจอยู่ในกลุ่มของไฟล์)

  • น้ำมันดินชุดของไฟล์
  • gzip พวกเขา
  • คัดลอกโดยใช้ scp ถ้าเป็นไปได้
  • gunzip
  • untar ไฟล์

0

ตามที่แนะนำโดย sth คุณสามารถลอง tar มากกว่า ssh

หากคุณไม่ต้องการการเข้ารหัส (แต่เดิมคุณใช้ rsync แต่ไม่ได้พูดถึงมันคือ rsync + ssh) คุณสามารถลอง tar บน netcat เพื่อหลีกเลี่ยงค่าใช้จ่าย ssh

แน่นอนว่าคุณสามารถลดเวลาที่ต้องใช้ลงได้โดยใช้ gzip หรือวิธีการบีบอัดอื่น ๆ


0

มีสิ่งอื่นที่ต้องพิจารณา ลองสิ่งนี้:

  • สร้าง VHD ที่มีขนาดแบบไดนามิก
  • ติดมันอาจจะเป็นไดเรกทอรี
  • ตั้งค่าแอตทริบิวต์ 'บีบอัดทั้งดิสก์'

โดยการทำเช่นนี้ไม่มีค่าใช้จ่ายสำหรับการทำซ้ำหรือบีบอัดไดเรกทอรีเพราะที่ทำในเวลาที่ไฟล์ถูกเขียน มีเพียงไฟล์เดียวที่จะย้าย - VHD

บน Windows ฉันตั้งค่าขนาดแพ็คเก็ต TCP เริ่มต้นให้ใหญ่ขึ้นเช่น 16348 ซึ่งหมายถึงค่าใช้จ่ายส่วนหัว IP ที่น้อยลง

แต่สิ่งหนึ่งที่ฉันพบคือว่ามันเป็นการดีที่สุดที่จะรักษาขนาดไฟล์ให้ต่ำกว่า 100 Mb สำหรับการถ่ายโอนเครือข่ายหรือ USB ฉันใช้ Rar.exe เพื่อ - แยกไฟล์

ทำงานเหมือนแชมป์ นี่เทียบเท่ากับ 'dd' ใน Linux .. แนวคิดของการติดตั้งระบบไฟล์ที่บีบอัดไปยังไดเรกทอรีเป็นเรื่องปกติสำหรับ Linux เช่นกันดังนั้นจึงใช้ตรรกะเดียวกัน คุณควรตรวจสอบให้แน่ใจว่าไฟล์ทั้งหมดถูกปิดก่อนที่จะเริ่มการทำงานเช่นเดียวกับวิธีอื่น ๆ

สิ่งนี้มีประโยชน์เพิ่มเติมในการทำให้เป็นไปได้ที่จะใส่โควต้าขนาดลงในโฟลเดอร์ หาก VHD มีขนาดคงที่การใช้เกินขีด จำกัด นั้นจะไม่ทำให้เซิร์ฟเวอร์เกิดข้อผิดพลาดมันจะทำให้เกิดข้อผิดพลาดในการสร้างหรือเขียนไฟล์

VHD ที่จัดรูปแบบเป็น NTFS สามารถจัดการไฟล์หลายล้านไฟล์ในโฟลเดอร์ได้เช่นกัน

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