ฉันมีไฟล์หลายล้านไฟล์ในที่ฝากข้อมูล Amazon S3 และฉันต้องการย้ายไฟล์เหล่านี้ไปยังที่เก็บข้อมูลและโฟลเดอร์อื่น ๆ ด้วยค่าใช้จ่ายขั้นต่ำหรือไม่มีค่าใช้จ่ายหากเป็นไปได้ ถังทั้งหมดอยู่ในโซนเดียวกัน
ฉันจะทำมันได้อย่างไร
ฉันมีไฟล์หลายล้านไฟล์ในที่ฝากข้อมูล Amazon S3 และฉันต้องการย้ายไฟล์เหล่านี้ไปยังที่เก็บข้อมูลและโฟลเดอร์อื่น ๆ ด้วยค่าใช้จ่ายขั้นต่ำหรือไม่มีค่าใช้จ่ายหากเป็นไปได้ ถังทั้งหมดอยู่ในโซนเดียวกัน
ฉันจะทำมันได้อย่างไร
คำตอบ:
ล้านเป็นจำนวนมาก - ฉันจะกลับไปที่ภายหลัง
กลไกพื้นฐานนั้นจำเป็นต้องคัดลอกโดยตรงจากที่เก็บข้อมูลหนึ่งไปยังอีกที่หนึ่งด้วยวิธีนี้ (เนื่องจากที่เก็บข้อมูลของคุณอยู่ในภูมิภาคเดียวกัน) คุณจึงไม่ต้องเสียค่าใช้จ่ายสำหรับแบนด์วิดท์ วิธีการอื่นใดที่ไม่มีประสิทธิภาพ (เช่นการดาวน์โหลดและการโหลดไฟล์ซ้ำ)
การคัดลอกระหว่างที่เก็บข้อมูลทำได้โดยใช้ '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 ที่หลากหลาย) ความเร็วที่ดีที่สุดนั้นมาจากสิ่งใดก็ตามที่สามารถทำงานแบบขนานได้มากที่สุด
มีวิธีการบางบรรทัดคำสั่งที่อาจทำงานได้ค่อนข้าง:
มีความเป็นไปได้ที่ s3fs อาจทำงานได้ - มันค่อนข้างขนานกัน, รองรับการคัดลอกระหว่างที่ฝากข้อมูลเดียวกัน - ไม่รองรับการคัดลอกระหว่างที่เก็บข้อมูลที่ต่างกัน, แต่อาจรองรับการย้ายระหว่างที่เก็บข้อมูลที่แตกต่างกัน
ฉันจะเริ่มต้นด้วย s3cmd-modified และดูว่าคุณประสบความสำเร็จหรือไม่หรือติดต่อ Amazon เพื่อหาทางออกที่ดีกว่า
aws s3 sync s3://source s3://destination
เหมาะสมใน?
หัวข้อเก่า แต่นี่คือสำหรับทุกคนที่ตรวจสอบสถานการณ์เดียวกัน พร้อมกับเวลาที่ฉันต้องใช้กับวัตถุมากกว่า 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
ฉันคิดว่าคุณอาจจะพบวิธีแก้ปัญหาที่ดีในตอนนี้ แต่สำหรับคนอื่น ๆ ที่กำลังประสบปัญหานี้ (อย่างที่ฉันเพิ่งทำเมื่อเร็ว ๆ นี้) ฉันได้สร้างยูทิลิตี้ง่าย ๆ เพื่อสะท้อนมิเรอร์ S3 S3 หนึ่งไปยังอีก เป็นซีพียูและหน่วยความจำที่มีประสิทธิภาพพร้อมกันสูง
อยู่ใน github ภายใต้ใบอนุญาต Apache ที่นี่: https://github.com/cobbzilla/s3s3mirror
หากคุณตัดสินใจที่จะลองโปรดแจ้งให้เราทราบหากคุณมีข้อเสนอแนะใด ๆ
--cross-account-copy
ตัวเลือก ( -C
สั้น ๆ ) ในการทำเช่นนี้ โปรดทราบว่าเมื่อคัดลอกข้ามบัญชี ACL จะไม่ถูกคัดลอก เจ้าของฝากข้อมูลปลายทางจะมีสิทธิ์แบบเต็มไปยังข้อมูลที่คัดลอก
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 เหนือการกำหนดค่าเริ่มต้น
ในที่ฝากข้อมูลสูญหายให้เลือกไฟล์ที่คุณต้องการคัดลอกไปยังที่ฝากข้อมูลอื่น