วิธีการย้ายไฟล์ระหว่างสองถัง S3 ด้วยต้นทุนต่ำสุด?


44

ฉันมีไฟล์หลายล้านไฟล์ในที่ฝากข้อมูล Amazon S3 และฉันต้องการย้ายไฟล์เหล่านี้ไปยังที่เก็บข้อมูลและโฟลเดอร์อื่น ๆ ด้วยค่าใช้จ่ายขั้นต่ำหรือไม่มีค่าใช้จ่ายหากเป็นไปได้ ถังทั้งหมดอยู่ในโซนเดียวกัน

ฉันจะทำมันได้อย่างไร

คำตอบ:


53

ล้านเป็นจำนวนมาก - ฉันจะกลับไปที่ภายหลัง

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

การคัดลอกระหว่างที่เก็บข้อมูลทำได้โดยใช้ 'PUT copy' - นั่นคือคำขอ PUT ที่มีส่วนหัว 'x-amz-copy-source' - ฉันเชื่อว่านี่เป็นประเภทที่ขอ COPY นี่จะเป็นการคัดลอกไฟล์และตามค่าเริ่มต้นแล้วข้อมูลเมตาที่เชื่อมโยง คุณต้องรวม 'x-amz-acl' ด้วยค่าที่ถูกต้องหากคุณต้องการตั้งค่า ACL ในเวลาเดียวกัน (ไม่เช่นนั้นจะเป็นการตั้งค่าเริ่มต้นให้เป็นแบบส่วนตัว) คุณจะถูกเรียกเก็บเงินสำหรับคำขอ COPY ของคุณ (คำขอ $ 0.01 / 1,000) คุณสามารถลบไฟล์ที่ไม่จำเป็นหลังจากที่คัดลอกแล้ว (ไม่ได้เรียกเก็บคำขอ DELETE) (จุดหนึ่งที่ฉันไม่ค่อยชัดเจนคือการร้องขอ COPY นั้นมีค่าใช้จ่ายของคำขอ GET หรือไม่เนื่องจากวัตถุต้องถูกดึงจากแหล่งฝากข้อมูลก่อน - ถ้ามีค่าใช้จ่ายจะเพิ่มอีก $ 0.01 / 10,000 คำขอ)

ดูเหมือนว่าจะมีการเรียกเก็บเงินข้างต้นดูเหมือนจะหลีกเลี่ยงไม่ได้ - สำหรับวัตถุหนึ่งล้านชิ้นที่คุณกำลังดูอยู่ที่ประมาณ $ 10 (หรือ $ 11) เนื่องจากในท้ายที่สุดคุณต้องสร้างไฟล์บนที่ฝากข้อมูลปลายทางวิธีการอื่น ๆ (เช่น tar-gzipping ไฟล์, Amazon Import / Export, ฯลฯ ) จะไม่ได้รับค่าใช้จ่ายนี้ ไม่น้อยไปกว่านี้มันอาจจะคุ้มค่าที่คุณต้องติดต่อ Amazon หากคุณมีวัตถุมากกว่าสองล้านชิ้นที่จะถ่ายโอน

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

มีวิธีการบางบรรทัดคำสั่งที่อาจทำงานได้ค่อนข้าง:

  • s3cmd-modified (คำขอดึงเฉพาะนั้น) รวมถึงคำสั่ง cp และ mv แบบขนานและควรเป็นตัวเลือกที่ดีสำหรับคุณ
  • คอนโซล AWS สามารถทำสำเนาโดยตรง - ฉันไม่สามารถพูดได้ว่ามันขนานกันอย่างไร
  • สคริปต์aws ของ Tim Kayสามารถทำสำเนาได้ - แต่มันไม่ขนาน - คุณจะต้องสคริปต์เพื่อเรียกใช้สำเนาทั้งหมดที่คุณต้องการ (อาจไม่ใช่ตัวเลือกที่ดีที่สุดในกรณีนี้ - แม้ว่ามันจะเป็นสคริปต์ที่ยอดเยี่ยม)
  • Cloudberry S3 Explorer , Bucket ExplorerและCloudBuddyทั้งหมดควรสามารถทำงานได้แม้ว่าฉันจะไม่รู้ประสิทธิภาพของแต่ละกอง ฉันเชื่อว่าคุณสมบัติแบบมัลติเธรดซึ่งส่วนใหญ่ต้องซื้อซอฟต์แวร์
  • สคริปต์ของคุณเองโดยใช้หนึ่งใน SDK ที่มีให้

มีความเป็นไปได้ที่ s3fs อาจทำงานได้ - มันค่อนข้างขนานกัน, รองรับการคัดลอกระหว่างที่ฝากข้อมูลเดียวกัน - ไม่รองรับการคัดลอกระหว่างที่เก็บข้อมูลที่ต่างกัน, แต่อาจรองรับการย้ายระหว่างที่เก็บข้อมูลที่แตกต่างกัน

ฉันจะเริ่มต้นด้วย s3cmd-modified และดูว่าคุณประสบความสำเร็จหรือไม่หรือติดต่อ Amazon เพื่อหาทางออกที่ดีกว่า


Bucket Explorer ดูเหมือนว่าจะทำงานได้ดีสำหรับฉัน (การย้ายไฟล์ระหว่างสองถังในขณะนี้)
ก๋วยเตี๋ยว

3
สถานที่ที่ไม่aws s3 sync s3://source s3://destinationเหมาะสมใน?
Olivier Lalonde

7

หัวข้อเก่า แต่นี่คือสำหรับทุกคนที่ตรวจสอบสถานการณ์เดียวกัน พร้อมกับเวลาที่ฉันต้องใช้กับวัตถุมากกว่า 20,000 ชิ้น ทำงานบน AWS Linux / Centos แต่ละออบเจกต์เป็นอิมเมจส่วนใหญ่พร้อมกับไฟล์วิดีโอและไฟล์มีเดียต่างๆ

การใช้เครื่องมือ AWS CLI เพื่อคัดลอกไฟล์จาก Bucket A ไปยัง Bucket B

A. สร้างที่เก็บข้อมูลใหม่

$ aws s3 mb s3://new-bucket-name

B. ซิงค์ฝากข้อมูลเก่ากับที่ฝากข้อมูลใหม่

$ aws s3 sync s3://old-bucket-name s3://new-bucket-name

กำลังคัดลอกวัตถุมากกว่า 20,000 รายการ ...

เริ่ม 17:03

สิ้นสุดวันที่ 17:06

เวลาทั้งหมดสำหรับวัตถุมากกว่า 20,000 รายการ = ประมาณ 3 นาที

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

C. ลบ / ลบที่ฝากข้อมูลเก่า

$ aws s3 rb --force s3://old-bucket-name

ช่วยชีวิต ฉันกำลังคัดลอก 300 + GB เคล็ดลับ: หากคุณคัดลอกจากถังในภูมิภาคเดียวกันนั้นเร็วกว่าในภูมิภาคอื่น (และฉันอ่านมันราคาไม่แพง)
Marcelo Agimóvel

ฉันมีปัญหากับวิธีการของคุณ: ความเป็นส่วนตัวของไฟล์ถูกตั้งค่าเป็นความเป็นส่วนตัวแม้วัตถุส่วนใหญ่จะเป็นสาธารณะ
Marcelo Agimóvel

5

ฉันไม่แน่ใจว่าเป็นวิธีที่ดีที่สุด แต่คอนโซลการจัดการ AWS มีคุณสมบัติตัด / คัดลอก / วาง ใช้งานง่ายและมีประสิทธิภาพ


6
ไม่น่าจะทำงานได้ดีกับไฟล์นับล้านไฟล์
James

@ James สามารถยืนยันได้อย่างเจ็บปวดว่า;)
ปล้น

3

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

อยู่ใน github ภายใต้ใบอนุญาต Apache ที่นี่: https://github.com/cobbzilla/s3s3mirror

หากคุณตัดสินใจที่จะลองโปรดแจ้งให้เราทราบหากคุณมีข้อเสนอแนะใด ๆ


ฉันมีประสบการณ์ที่ยอดเยี่ยมกับ s3s3mirror ฉันสามารถตั้งค่าบนโหนด EC2 m1.small และคัดลอกวัตถุ 1.5 ล้านชิ้นในเวลาประมาณ 2 ชั่วโมง การติดตั้งค่อนข้างยากเนื่องจากความไม่คุ้นเคยกับ Maven และ Java ของฉัน แต่ใช้คำสั่ง apt-get บน Ubuntu เพื่อติดตั้งทุกอย่าง หมายเหตุสุดท้ายหนึ่ง: หาก (เช่นฉัน) คุณกังวลเกี่ยวกับการเรียกใช้สคริปต์ที่ไม่รู้จักในที่เก็บข้อมูลสำคัญขนาดใหญ่ s3 ให้สร้างผู้ใช้พิเศษด้วยการเข้าถึงแบบอ่านอย่างเดียวบนที่คัดลอกจากที่เก็บข้อมูลและใช้ข้อมูลรับรองเหล่านั้น ไม่มีโอกาสเกิดการลบโดยไม่ตั้งใจ
คา

สามารถนำไปใช้กับที่เก็บข้อมูลระหว่างบัญชีที่แตกต่างกันได้หรือไม่
Oliver Burdekin

@OliverBurdekin ใช่มี--cross-account-copyตัวเลือก ( -Cสั้น ๆ ) ในการทำเช่นนี้ โปรดทราบว่าเมื่อคัดลอกข้ามบัญชี ACL จะไม่ถูกคัดลอก เจ้าของฝากข้อมูลปลายทางจะมีสิทธิ์แบบเต็มไปยังข้อมูลที่คัดลอก
cobbzilla

ขอบคุณ @rfcreader ฉันจะประเมินราคาได้อย่างไร ฉันตระหนักถึงเครื่องคิดเลขราคา AWS แต่ไม่ทราบว่ากระบวนการนี้จะเกี่ยวข้องกับจำนวนของการได้รับการร้องขอ ls ฯลฯ ฉันคิดว่ามันเป็นเรื่องง่ายที่จะนับตัวชี้วัดเหล่านี้โดยใช้ CLI แต่ถ้าคุณรู้เพิ่มเติมกรุณาติดต่อ การสนับสนุน AWS แนะนำ "ผู้ร้องขอจ่าย" ฮ่า!
Oliver Burdekin

@OliverBurdekin s3s3mirror ติดตามจำนวนคำขอ AWS ตามประเภท (GET, COPY, DELETE, ฯลฯ ) สถิติเหล่านี้จะถูกพิมพ์ออกมาเป็นระยะเมื่อทำงานและหนึ่งครั้งสุดท้ายในตอนท้าย คุณสามารถทำการทดสอบแบบ จำกัด / ทดสอบเพื่อคัดลอกชุดย่อยขนาดเล็กของวัตถุซึ่งควรให้ความรู้สึกโดยทั่วไปสำหรับจำนวนคำขอทั้งหมดที่ต้องใช้เพื่อคัดลอกชุดข้อมูลทั้งหมด
cobbzilla

2

AWS CLI จัดเตรียมวิธีคัดลอกที่ฝากข้อมูลหนึ่งไปยังอีกที่หนึ่งในกระบวนการคู่ขนาน นำมาจากhttps://stackoverflow.com/a/40270349/371699 :

คำสั่งต่อไปนี้จะบอก AWS CLI ให้ใช้ 1,000 เธรดเพื่อดำเนินงาน (แต่ละไฟล์ขนาดเล็กหรือส่วนหนึ่งของสำเนาหลายส่วน) และมองไปข้างหน้า 100,000 งาน:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

หลังจากรันสิ่งเหล่านี้คุณสามารถใช้คำสั่ง sync แบบง่าย ๆ ดังนี้:

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

บนเครื่อง m4.x ใหญ่ (ใน AWS - 4 คอร์, RAM 16GB), สำหรับกรณีของฉัน (ไฟล์ 3-50GB) ความเร็วในการซิงค์ / คัดลอกเพิ่มขึ้นจากประมาณ 9.5MiB / s เป็น 700 + MiB / s, เพิ่มความเร็วเป็น 70x เหนือการกำหนดค่าเริ่มต้น


0

ในที่ฝากข้อมูลสูญหายให้เลือกไฟล์ที่คุณต้องการคัดลอกไปยังที่ฝากข้อมูลอื่น

  • ใต้การกระทำให้เลือก 'คัดลอก'
  • ไปที่ถังเก็บน้ำ
  • ใต้การกระทำให้เลือก 'วาง'

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