ทำสำเนาถัง s3 ได้เร็วขึ้น


94

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

s3cmd cp -r --acl-public s3://bucket1 s3://bucket2

วิธีนี้ใช้งานได้ แต่จะช้ามากเนื่องจากคัดลอกไฟล์แต่ละไฟล์ผ่าน API ทีละไฟล์ ถ้าs3cmdสามารถทำงานในโหมดคู่ขนานได้ฉันจะดีใจมาก

มีตัวเลือกอื่น ๆ เป็นเครื่องมือบรรทัดคำสั่งหรือรหัสที่ผู้คนใช้เพื่อทำสำเนาที่เก็บข้อมูลที่เร็วกว่าs3cmdหรือไม่

แก้ไข: ดูเหมือนว่าs3cmd-modifiedคือสิ่งที่ฉันกำลังมองหา เสียดายที่ไม่ได้ผล มีทางเลือกอื่นอีกไหม?


6
ไม่แน่ใจว่าเหตุใดคำถามนี้จึงถูกปิดซ้ำ ๆ เนื่องจากดูเหมือนว่ามีนักพัฒนาจำนวนมากพบปัญหานี้ อย่างไรก็ตามฉันแก้ไขมันแบบขนานกันมากนี่คือลิงค์: github.com/cobbzilla/s3s3mirror ขอบคุณ! - โจนาธาน
cobbzilla

คำตอบ:


167

AWS CLI ดูเหมือนจะทำงานได้อย่างสมบูรณ์แบบและมีโบนัสจากการเป็นเครื่องมือที่ได้รับการสนับสนุนอย่างเป็นทางการ

aws s3 sync s3://mybucket s3://backup-mybucket

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

รองรับการโอนพร้อมกันตามค่าเริ่มต้น ดูhttp://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests

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

aws configure set default.s3.max_concurrent_requests 200

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

11
ช้าเหมือนนรกถ้าจำนวนไฟล์สูง
PhươngNguyễn

14
เมื่อการถ่ายโอนไฟล์ขนาดเล็กจำนวนมากเวลาแฝงกลายเป็นข้อ จำกัด ที่สำคัญดังนั้นการรันคำสั่งนี้จากอินสแตนซ์ EC2 จึงเป็นสิ่งจำเป็น
python1981

1
ฉันใช้สิ่งนี้เพื่อสร้างนักเทียบท่าและใช้งานได้ดีgithub.com/sunshineo/s3-bucket-copier
Gordon Sun

3
ตอนนี้รองรับการซิงค์พร้อมกันแล้ว :-) docs.aws.amazon.com/cli/latest/topic/…
python1981

71

หากคุณไม่สนใจที่จะใช้คอนโซล AWS คุณสามารถ:

  1. เลือกไฟล์ / โฟลเดอร์ทั้งหมดในที่เก็บข้อมูลแรก
  2. คลิกการดำเนินการ> คัดลอก
  3. สร้างที่เก็บข้อมูลใหม่แล้วเลือก
  4. คลิกการดำเนินการ> วาง

มันยังค่อนข้างช้า แต่คุณสามารถปล่อยให้มันอยู่คนเดียวและปล่อยให้มันทำสิ่งนั้นได้


นี่เป็นการคัดลอกเนื้อหาของที่เก็บข้อมูลต้นทางไปยังเครื่องของฉันขณะที่คัดลอกไปยังปลายทางหรือไม่ มีกิจกรรมเครือข่ายจำนวนมากและตัวตรวจสอบเบราว์เซอร์ทำงานช้ามากจึงวิเคราะห์ได้ยาก 600K / s บนเครื่องของฉัน จากนั้นจะเป็นการเริ่มต้นการถ่ายโอนภายในเครือข่าย amazon ได้เร็วขึ้นมาก ... ลองไปที่นั่นแทน
Brad Goss

9
ฉันเพิ่งใช้วิธีนี้วันนี้ มันไม่ดึงไฟล์ลงไปที่เครื่องของคุณ - มันทำสำเนาโดยตรงและเร็วกว่ามาก
Greg Benedict

7
มันยังคงดึงรายการไฟล์ หากรายการยาวเกินไป (ในกรณีของฉันเป็นหมื่นไฟล์) มันก็ช้าเหมือนกัน และหมดเวลา / แฮงค์เป็นไปได้มาก
เฝิงเห

14
น่าเสียดายที่กระบวนการนี้เชื่อมโยงกับเบราว์เซอร์ :( จากเอกสาร : "หลังจากที่คุณเริ่มกระบวนการคัดลอกคุณต้องเปิดเบราว์เซอร์ไว้ในขณะที่กำลังดำเนินการคัดลอก"
David Lemayian

5
ฉันกำลังพยายามทำสิ่งนี้ในที่เก็บข้อมูลที่มีไฟล์ 8 ล้านไฟล์อยู่ ไม่รู้ว่าจะต้องใช้เวลากี่เดือนในการเลือกช่องทำเครื่องหมายทั้งหมด ...
Chris Harrison

28

ฉันได้ลองโคลนสองที่เก็บข้อมูลโดยใช้เว็บคอนโซลs3cmdAWS และ AWS CLI แม้ว่าวิธีการเหล่านี้จะใช้ได้ผลเกือบตลอดเวลา แต่ก็ช้าอย่างเจ็บปวด

จากนั้นฉันก็พบs3s3mirror: เครื่องมือพิเศษสำหรับการซิงค์ที่เก็บข้อมูล S3 สองชุด เป็นแบบมัลติเธรดและเร็วกว่าวิธีอื่น ๆ ที่ฉันเคยลองมามาก ฉันย้ายข้อมูล Giga-bytes จากภูมิภาค AWS หนึ่งไปยังอีกภูมิภาคหนึ่งอย่างรวดเร็ว

ลองดูได้ที่https://github.com/cobbzilla/s3s3mirrorหรือดาวน์โหลด Docker container จากhttps://registry.hub.docker.com/u/pmoust/s3s3mirror/


1
หากคุณมีไฟล์จำนวนมากที่จะถ่ายโอนนี่เป็นเครื่องมือที่ดีที่สุดสำหรับงานนี้ ความอัปยศมันเป็นรายการคำตอบ ...
John Chrysostom

หมายเหตุสำหรับบางคน: ต้องใช้ Java 6/7 ในการคอมไพล์
Brian

1
ฉันใช้สิ่งนี้จากอินสแตนซ์ EC2 และทำงานได้เร็วอย่างไม่น่าเชื่อ! ฉันต้องแทนที่ <source-bucket> และ <destination-bucket> ด้วยชื่อที่เก็บข้อมูลจริง (ไม่ใช่ปลายทางหรือบางอย่างเช่นใน AWS CLI)
ironmouse

1
เครื่องมือที่น่าทึ่งแนะนำเป็นอย่างยิ่งสำหรับไฟล์จำนวนมาก การควบคุมจำนวนเธรดการคัดลอกนั้นยอดเยี่ยม
Shaunak

คุณคิดว่าการใช้ aws-cli ไม่ใช่แอปพลิเคชันของบุคคลที่สามจะปลอดภัยกว่าหรือไม่? ท้ายที่สุดเราจำเป็นต้องให้ข้อมูลรับรองหรือคีย์การเข้าถึงเพื่อใช้เครื่องมือเหล่านี้
Keet Sugathadasa

11

สำหรับโซลูชัน adhoc ใช้aws cliเพื่อซิงค์ระหว่างที่เก็บข้อมูล:

aws s3 syncความเร็วขึ้นอยู่กับ:
- เวลาในการตอบสนองสำหรับการเรียก API ไปยังปลายทาง S3
- จำนวนการเรียก API ที่ทำพร้อมกัน

ในการเพิ่มความเร็วในการซิงค์:
- เรียกใช้aws s3 syncจากอินสแตนซ์ AWS (c3.large บน FreeBSD ก็โอเค ;-))
- อัปเดต ~ / .aws / config ด้วย:
- max_concurrent_requests = 128
-max_queue_size = 8096

ด้วยการกำหนดค่าและประเภทอินสแตนซ์ต่อไปนี้ฉันสามารถซิงค์ที่เก็บข้อมูล (ไฟล์ 309GB, 72K, us-east-1) ภายใน 474 วินาที

สำหรับโซลูชันทั่วไปเพิ่มเติมโปรดพิจารณา - AWS DataPipeLine หรือ S3 การจำลองแบบข้ามภูมิภาค


คุณรู้หรือไม่ว่าฉันสามารถคาดหวังประสิทธิภาพเดียวกันได้หรือไม่ถ้าฉันใช้ S3 cp? คุณแน่ใจหรือไม่ว่าเมื่อคุณใช้การซิงค์จะมีการโอนทั้งหมด 309GB จริง การซิงค์จะซิงค์เฉพาะไฟล์ที่ไม่เหมือนกันหรือมีอยู่ในที่เก็บข้อมูลอื่น
หนาวจัด

คุณคิดอย่างไรกับเรื่องนี้สำหรับกรณีการใช้งานที่ฉันมีไฟล์ 1k หรือน้อยกว่า แต่มีขนาดใหญ่กว่า (10gb) คุณคิดว่าฉันจะเห็นการแสดงที่คล้ายคลึงกับคุณหรือไม่?
หนาวจัด

@frosty ในที่เก็บข้อมูลปลายทางของกรณีของฉันว่างเปล่า ต่อawscliเอกสาร - aws syncคัดลอกเฉพาะไฟล์ใหม่และไฟล์ที่อัปเดต คุณอาจคาดหวังว่าจะมีประสิทธิภาพสูงด้วยaws cp(การคัดลอกเสร็จสิ้นภายในลูกค้าของคุณเพียงแค่เรียกใช้ API) ประสิทธิภาพขึ้นอยู่กับปัจจัยเหล่านี้: 1. เวลาแฝงระหว่างภูมิภาค src และ dst (เช่น us-east-X ถึง us-west-X) 2. เวลาในการตอบสนองระหว่างไคลเอนต์และปลายทาง AWS API (คุณสามารถเรียก API ได้เร็วแค่ไหน) 3. จำนวนคำขอพร้อมกัน (จำนวนคำขอต่อวินาทีที่ลูกค้าของคุณสามารถส่งออกได้) ในกรณีของฉัน 309G ถูกคัดลอกระหว่างถังในภูมิภาคเดียวกัน (us-east-1)
Tom Lime

3

เนื่องจากเป็นเรื่องแรกของ Google ในเรื่องนี้จึงเพิ่มข้อมูลเพิ่มเติม

'Cyno' สร้าง s3cmd-modified เวอร์ชันใหม่ซึ่งตอนนี้รองรับการซิงค์ที่เก็บข้อมูลต่อถังแบบขนาน สิ่งที่ฉันรอเช่นกัน

คำขอดึงอยู่ที่https://github.com/pcorliss/s3cmd-modification/pull/2เวอร์ชันของเขาที่https://github.com/pearltrees/s3cmd-modification


s3cmd-modified ช่วยฉันได้หลายวันในการคัดลอก
แก๊

2

ฉันไม่รู้จักเครื่องมือบรรทัดคำสั่ง S3 อื่น ๆ แต่ถ้าไม่มีอะไรเกิดขึ้นที่นี่อาจเป็นวิธีที่ง่ายที่สุดในการเขียนของคุณเอง

เลือกภาษาใดก็ได้และ Amazon SDK / Toolkit ที่คุณต้องการ จากนั้นคุณเพียงแค่ต้องแสดงรายการ / ดึงเนื้อหาที่เก็บข้อมูลต้นทางและคัดลอกแต่ละไฟล์ (เห็นได้ชัดว่าขนานกัน)

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


ใช่. ฉันใช้ความคิดนี้และเขียนด้วยทับทิมด้วยวิธีที่เป็นเหตุการณ์ด้วยเครื่องเหตุการณ์หรือเธรดด้วย JRuby อย่างไรก็ตาม s3cmd นั้นค่อนข้างสมบูรณ์อยู่แล้วและฉันอยากจะใช้มัน ฉันได้พูดคุยกับผู้พัฒนา s3cmd และเขามีวิธีแก้ปัญหาสองสามอย่างในท่อที่น่าจะแก้ไขปัญหาด้านประสิทธิภาพ
Sean McCleary

1

ง่าย ๆ ใช้aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursiveงานได้ดี (สมมติว่าคุณมีการตั้งค่า aws cli)

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