วิธีที่เร็วที่สุดในการถ่ายโอนรูปภาพ 55GB ไปยังเซิร์ฟเวอร์ใหม่


64

ปัจจุบันฉันมีเซิร์ฟเวอร์ CentOS สองแห่ง ฉันจำเป็นต้องรู้วิธีและสิ่งที่เร็วที่สุดที่จะ "tar" ในไดเรกทอรีรูปภาพและ SCP ได้หรือไม่

นั่นเป็นวิธีที่เร็วที่สุดที่ฉันเพิ่งแนะนำเพราะการเหน็บแนมใช้ไปตลอดกาล ... ฉันวิ่งตามคำสั่ง:

tar cvf imagesbackup.tar images

และฉันกำลังจะสแกนมันมากกว่า

แจ้งให้เราทราบหากมีวิธีที่รวดเร็วกว่า ฉันสามารถเข้าถึงทั้งสองเครื่องจากระยะไกล / SSH ได้


12
sneakernet?
นิค T

คำตอบ:


98

แทนที่จะใช้ tar เพื่อเขียนไปยังดิสก์ภายในเครื่องของคุณคุณสามารถเขียนโดยตรงไปยังเซิร์ฟเวอร์ระยะไกลผ่านเครือข่ายโดยใช้ ssh

server1$ tar -zc ./path | ssh server2 "cat > ~/file.tar.gz"

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

หรือคุณสามารถแตกไฟล์ tar บนเซิร์ฟเวอร์อื่น ๆ ได้โดยตรง:

server1$ tar -zc ./path | ssh server2 "tar -zx -C /destination"

หมายเหตุ-Cตัวเลือกที่ไม่ค่อยใช้ หมายถึง "เปลี่ยนไดเรกทอรีนี้ก่อนทำอะไรก็ได้"

หรือบางทีคุณอาจต้องการ "ดึง" จากเซิร์ฟเวอร์ปลายทาง:

server2$ tar -zx -C /destination < <(ssh server2 "tar -zc -C /srcdir ./path")

โปรดทราบว่า <(cmd) โครงสร้างนั้นใหม่ต่อการทุบตีและไม่สามารถใช้กับระบบเก่าได้ มันรันโปรแกรมและส่งออกไปยังไปป์และทดแทนไปป์นั้นในคำสั่งราวกับว่ามันเป็นไฟล์

ฉันสามารถเขียนข้างต้นได้อย่างง่ายดายดังนี้:

server2$ tar -zx -C /destination -f <(ssh server2 "tar -zc -C /srcdir ./path")

หรือเป็นดังนี้:

server2$ ssh server2 "tar -zc -C /srcdir ./path" | tar -zx -C /destination

หรือคุณสามารถช่วยตัวเองให้เศร้าโศกและใช้ rsync:

server1$ rsync -az ./path server2:/destination/

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

อีกวิธีหนึ่งคุณอาจต้องการพิจารณาไพพ์เพื่อ gzip ด้วยตัวคุณเอง (แทนที่จะใช้ตัวเลือก -z) เพื่อให้คุณสามารถระบุระดับการบีบอัดได้ เป็นประสบการณ์ของฉันที่การเชื่อมต่อเครือข่ายที่รวดเร็วด้วยข้อมูลที่บีบอัดได้โดยใช้ gzip ที่ระดับ 2 หรือ 3 (ค่าเริ่มต้นคือ 6) ให้ปริมาณงานโดยรวมที่ดีที่สุดในกรณีส่วนใหญ่ ชอบมาก

server1$ tar -c ./path | gzip -2 | ssh server2 "cat > ~/file.tar.gz"

Rsync ทำงานได้อย่างสวยงาม - บีบอัดได้อย่างรวดเร็วคัดลอกทั้งโฟลเดอร์กลับสู่การเชื่อมต่อที่ขาด ทั้งหมดในคำสั่งง่ายๆ รักมัน นี่เป็นตัวเลือกที่ฉันพบว่ามีประโยชน์: z: compress r: recurse = copy โฟลเดอร์ย่อย v: verbose ตัวอย่างคำสั่ง Rsync ของฉัน: rsync -azvr / src-path / ชื่อผู้ใช้ @ dest_server: / dest / path /
Bastion

68

ฉันถูกล่อลวงให้ซิงค์ผ่านตัวเอง - มันทำการบีบอัดและจัดการการสูญเสียลิงก์ได้ดี


14
rsync เป็นเครื่องมือที่เหมาะสม
Rich

4
+1 - Yay rsync!
Evan Anderson

1
+1, เพื่อสะสม นอกจากนี้ฉันชอบ rsync
Steven Monday

1
แต่เมื่อใช้ rsync คุณจะต้องบีบอัดข้อมูลด้วยตนเองต่อไป (ถ้าคุณต้องการจัดเก็บข้อมูลของคุณที่ถูกบีบอัด)
wlk

คุณจะจัดเก็บไฟล์บีบอัดด้วย rsync ได้อย่างไร
Dolan Antenucci

12

หากคุณเพียงแค่ทิ้งไว้และไม่มีอะไรอื่นจะทำให้เสียเวลาด้วยการเพิ่มความเร็วเพียงเล็กน้อยเท่านั้น

ดังนั้นเพียงแค่การบีบอัดไฟล์ด้วยสวิตช์ cvf จะทำให้เสียเวลาอย่างมีประสิทธิภาพในการอ่านอิมเมจ 55GB ทั้งหมดและเขียนกลับไปที่ดิสก์ (อย่างมีประสิทธิภาพจะเสียเวลามากขึ้นเนื่องจากจะมีค่าใช้จ่ายมาก)

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

ข้อเสียที่ใหญ่ที่สุดจากการถ่ายโอนไฟล์เก็บถาวร tar ขนาดใหญ่ผ่านสายคือถ้ามีอะไรผิดพลาดอาจหมายถึงคุณต้องเริ่มต้นใหม่

ฉันจะใช้วิธีนี้:

md5sum /images/* > md5sum.txt
scp -r images/* user@host:/images/

บนเซิร์ฟเวอร์ใหม่

md5sum /images/* > md5sum_new.txt

diffแล้วก็ และเนื่องจาก scp รองรับการบีบอัดได้ทันทีจึงไม่จำเป็นต้องแยกเก็บถาวร

แก้ไข

ฉันจะเก็บข้อมูล MD5 ไว้เนื่องจากเป็นประโยชน์ต่อ OP แต่ความคิดเห็นหนึ่งทำให้ฉันมีความเข้าใจใหม่ ดังนั้นการค้นหาเล็กน้อยจึงให้ข้อมูลที่เป็นประโยชน์นี้ โปรดทราบว่าเรื่องที่นี่คือ SFTP ไม่ได้โดยตรง SCP

ในทางตรงกันข้ามกับ FTP SFTP จะเพิ่มค่าใช้จ่ายในการถ่ายโอนไฟล์ เนื่องจากไฟล์ถูกถ่ายโอนระหว่างไคลเอนต์และเซิร์ฟเวอร์มันจะถูกแบ่งออกเป็นชิ้นเล็ก ๆ ที่เรียกว่า "แพ็คเก็ต" ตัวอย่างเช่นสมมติว่าแต่ละแพ็กเก็ตคือ 32KB โปรโตคอล SFTP ทำการตรวจสอบกับไฟล์ 32KB แต่ละไฟล์ตามที่ส่งมาและรวมถึงการตรวจสอบดังกล่าวพร้อมกับแพ็กเก็ตนั้น ผู้รับได้รับแพ็กเก็ตนั้นและถอดรหัสข้อมูลจากนั้นตรวจสอบการตรวจสอบ การตรวจสอบตัวเองคือ "แข็งแกร่ง" กว่าการตรวจสอบ CRC32 (เนื่องจาก SFTP ใช้การตรวจสอบแบบ 128- บิตหรือสูงกว่าเช่น MD5 หรือ SHA และเนื่องจากสิ่งนี้ทำบนแต่ละแพ็คเก็ตจึงมีการตรวจสอบความสมบูรณ์ที่ละเอียดซึ่งเป็นส่วนหนึ่งของการถ่ายโอน) ดังนั้นโปรโตคอล ตัวเองช้าลง (เนื่องจากค่าใช้จ่ายเพิ่มเติม) แต่ความสำเร็จของการโอนหมายถึงโดยพฤตินัย


ขอบคุณมาก md5sum กำลังทำอะไรอยู่? และต่างกันอย่างไร ขอบคุณดำเนินการทันที!
Andrew Fashion

2
md5sum (หรือ md5) ใช้เวลาตรวจสอบไฟล์ Diff ค้นหาความแตกต่างในไฟล์ (man diff) เช็คซัมสร้างสตริงแฮชว่าหากไฟล์ถูกเปลี่ยนระหว่างการขนส่ง ... บิตพลิกเกิดข้อผิดพลาด ... จะไม่ตรงกันเมื่อคุณนำไฟล์นั้นมาใช้อีกด้านหนึ่ง สำหรับไฟล์ขนาดใหญ่คุณมีโอกาสเกิดข้อผิดพลาดเพิ่มขึ้น นั่นเป็นเหตุผลที่เมื่อคุณเห็นเว็บไซต์ที่ให้คุณดาวน์โหลดไฟล์. iso พวกเขามักจะมีการตรวจสอบ MD5 เพื่อให้คุณเปรียบเทียบไฟล์ที่คุณดาวน์โหลดมาเพื่อให้แน่ใจว่าตรงกับและไม่เสียหาย
Bart Silverstrim

3
scp ถูกเข้ารหัสและรับประกันความสมบูรณ์ของบรรทัด ยังมีโอกาสเล็กน้อยที่ข้อมูลจะเสียหายในหน่วยความจำหรือบนดิสก์แน่นอน แต่ค่อนข้างหายาก
Ryan Bair

1
ค่าโสหุ้ยของการตรวจสอบ SFTP มีความสำคัญจริงหรือไม่ ฉันจินตนาการไม่ออก 4 ไบต์สำหรับทุก 32768 นั้นฟังดูไม่สำคัญ นั่นคือ 128 kB ต่อ GB การเรียกว่า "ช้าลง" ดูเหมือนว่าเป็นการพูดเกินจริงในทุกสิ่งยกเว้นความรู้สึกทางทฤษฎีที่น่าเบื่อ
underscore_d

8

นอกเหนือจากคำแนะนำ md5sum ของ Pacey แล้วฉันจะใช้สิ่งต่อไปนี้:

บนปลายทาง: nc -w5 -l -p 4567 | tar -xvf -

จากนั้นในแหล่งที่มา: tar -cvf - /path/to/source/ | nc -w5 destinationserver 4567

มันยังคงเป็น tar / untar และไม่มีการเข้ารหัส แต่มันตรงไปยังเซิร์ฟเวอร์อื่น เริ่มทั้งคู่ควบคู่กัน ( -w5มอบความสง่างามให้คุณ 5 วินาที) แล้วดูมัน ถ้าแบนด์วิดท์แน่นให้เพิ่ม -z ไปยัง tar ทั้งสองด้าน


1
ฉันคิดว่ามันเป็นวิธีอื่น ๆ รอบแรกที่เขามีการดำเนินการเกี่ยวกับปลายทาง (จะเปิดซ็อกเก็ต) และจากนั้นในแหล่งที่มา (เพื่อการจัดส่ง)
ดิมิท Mistriotis

แทนที่เซิร์ฟเวอร์ปลายทางฉันเพียงแค่ใส่ root@1.1.1.1?
Andrew Fashion

ไม่เพียงแค่ IP netcat ไม่ได้ใช้โปรโตคอลอื่นที่ไม่ใช่ TCP :) คำสั่งนี้จะเร็วที่สุดสำหรับคำสั่งทั้งหมดที่ระบุไว้ด้านบน มีการอ่านหนึ่งไฟล์ต่อหนึ่งแหล่งที่มาปริมาณการรับส่งข้อมูลเครือข่ายขั้นต่ำที่แน่นอนในการถ่ายโอนไฟล์และการเขียนหนึ่งไฟล์ต่อหนึ่งปลายทาง หากคุณมีรอบ CPU สำรองการเพิ่มแฟล็ก -z (สำหรับการบีบอัด) จะช่วยเพิ่มความเร็วให้มากขึ้นเนื่องจากจะต้องมีการถ่ายโอนข้อมูลเครือข่ายน้อยลง
Jeff McJunkin

@ user36845 - จริง ฉันไม่ได้หมายถึงเหตุการณ์ที่มีลำดับข้างต้น แต่คุณพูดถูกต้องซ็อกเก็ตจะต้องเปิดก่อน ฉันจะแก้ไขเพื่อชี้แจง :)
SmallClanger

ฉันไม่แน่ใจว่าทำไม SSH / SCP ถูก capping ออกที่ 125MB / s เพื่อ 133MB / s แต่ netcat สามารถท่อว่าข้อมูลที่ (การเชื่อมโยงเดียวกัน) ได้ง่าย ~ 380MB / s
ThorSummoner

1

จุดหนึ่ง - โฮสต์ไม่ได้ทั้งหมดมี rsync และโฮสต์อาจมี tar แตกต่างกัน ด้วยเหตุนี้เราจึงสามารถแนะนำให้เป็นพอร์ตแรกของการโทรโดยใช้ cpio oft-neglected

คุณสามารถ cpio มากกว่า ssh เพื่อทำการจำลองแบบ ad-hoc ของโครงสร้างไฟล์ / ไดเรกทอรีระหว่างโฮสต์ วิธีนี้คุณสามารถควบคุมสิ่งที่ได้รับการส่งให้ละเอียดยิ่งขึ้นในขณะที่คุณต้องการ "ฟีด" cpio, nom-nom นอกจากนี้ยังเป็นแบบพกพาที่โต้แย้งได้มากขึ้น cpio ไม่เปลี่ยนแปลงมากนักนี่เป็นจุดสำคัญหากคุณกำลังดูแลโฮสต์หลาย ๆ แห่งในสภาพแวดล้อมที่แตกต่างกัน

ตัวอย่างการคัดลอก / ส่งออก / home และส่วนย่อยไปยังโฮสต์ระยะไกล:

cd /export/ find . home -print | cpio -oaV | ssh 10.10.10.10 'cd /export/home; cpio -imVd'

ข้างต้นจะคัดลอกเนื้อหาของ / export / home และ subdirs ใด ๆ ไปยัง / export / home บนรีโมตโฮสต์

หวังว่านี่จะช่วยได้


เขาพูดถึงว่ามันเป็นกล่อง CentOS สองกล่องดังนั้นพวกเขาจึงมี rsync และไฟล์ tar รุ่นที่เข้ากันได้ เครื่องมืออย่าง rsync ถูกสร้างขึ้นเพื่อแทนที่เครื่องมืออย่าง cpio :) คุณไม่สามารถ "ดำเนินการต่อ" กับ cpio อย่างน้อยที่สุดโดยไม่ทราบว่าคุณต้องการเริ่มจากตรงไหนและกรองการค้นหาของคุณตามความเหมาะสม ซึ่งเป็นเวลาที่ไม่จำเป็น ต้องบอกว่าข้อมูลที่เป็นประโยชน์สำหรับ 'เก่า' UNIX กล่อง :)
Rafiq Maniar

ใช่ cmmand ทำให้ฉันหายไปฮ่าฮ่า
Andrew Fashion

1

ฉันคุณมีการเข้าถึง ssh คุณมีการเข้าถึง rsync

rsync -av -e ssh /storage/images/ user@[ip or domain name]:/storage/images/

หรือ

rsync -av -e "ssh -l user" /storage/images/ [ip or domain name]:/storage/images/

หากคุณได้รับข้อผิดพลาดเช่น "ข้อผิดพลาด rsync: บางไฟล์ไม่สามารถถ่ายโอนได้ (รหัส 23) ที่ main.c (977) [ผู้ส่ง = 2.6.9]" ให้ตรวจสอบผู้ใช้และกลุ่มของคุณระหว่างเซิร์ฟเวอร์ คุณอาจมีความไม่ตรงกัน

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

มีตัวเลือก "--progress" ซึ่งจะให้เปอร์เซ็นต์การโอนซึ่งเป็นชนิดที่ดีถ้าคุณชอบสิ่งนั้น


0

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


เซิร์ฟเวอร์ที่แตกต่างกันในสถานที่ห่างไกล
Andrew Fashion

0

หรือคุณสามารถใช้ท่อ tar:

(cd /path && tar -cjf - * ) | ssh user@host 'tar -xjf - -C /path'

'j' = bzip2 คุณสามารถใช้ 'z' สำหรับ gzip หรือ --lzma หาก tar ของคุณรองรับ

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