Saya memiliki jutaan file dalam ember Amazon S3 dan saya ingin memindahkan file-file ini ke ember dan folder lain dengan biaya minimum atau tanpa biaya jika memungkinkan. Semua ember berada di zona yang sama.
Bagaimana saya bisa melakukannya?
Saya memiliki jutaan file dalam ember Amazon S3 dan saya ingin memindahkan file-file ini ke ember dan folder lain dengan biaya minimum atau tanpa biaya jika memungkinkan. Semua ember berada di zona yang sama.
Bagaimana saya bisa melakukannya?
Jawaban:
Jutaan adalah jumlah besar - saya akan kembali lagi nanti.
Terlepas dari pendekatan Anda, mekanisme yang mendasarinya perlu menyalin secara langsung dari satu ember ke ember lainnya - dengan cara ini (karena ember Anda berada di wilayah yang sama) Anda tidak dikenai biaya untuk bandwidth. Pendekatan lain apa pun tidak efisien (misalnya mengunduh dan mengunggah ulang file).
Menyalin antar bucket dilakukan dengan menggunakan 'PUT copy' - itu adalah permintaan PUT yang menyertakan tajuk 'x-amz-copy-source' - Saya yakin ini digolongkan sebagai permintaan COPY. Ini akan menyalin file dan secara default meta-data terkait. Anda harus memasukkan 'x-amz-acl' dengan nilai yang benar jika Anda ingin mengatur ACL pada saat yang sama (jika tidak, itu akan menjadi standar untuk pribadi). Anda akan dikenai biaya untuk permintaan COPY Anda ($ 0,01 / 1.000 permintaan). Anda dapat menghapus file yang tidak dibutuhkan setelah disalin (HAPUS permintaan tidak dikenakan biaya). (Satu hal yang saya tidak jelas adalah apakah permintaan COPY atau tidak juga menimbulkan biaya permintaan GET, karena objek tersebut harus terlebih dahulu diambil dari ember sumber - jika ya, biaya akan menjadi tambahan $ 0,01 / 10.000 permintaan).
Biaya di atas tampaknya tidak dapat dihindari - untuk satu juta objek yang Anda cari sekitar $ 10 (atau $ 11). Karena pada akhirnya Anda harus benar-benar membuat file pada bucket tujuan, pendekatan lain (mis. Tar-gzipping file, Amazon Impor / Ekspor, dll) tidak akan menyiasati biaya ini. Meskipun demikian, mungkin bernilai saat Anda menghubungi Amazon jika Anda memiliki lebih dari beberapa juta objek untuk ditransfer.
Mengingat hal di atas (harga yang tidak dapat dihindarkan), hal selanjutnya yang harus diperhatikan adalah waktu, yang akan menjadi faktor besar ketika menyalin 'jutaan file'. Semua alat yang dapat melakukan penyalinan langsung antar bucket akan dikenakan biaya yang sama. Sayangnya, Anda memerlukan satu permintaan per file (untuk menyalin), satu permintaan untuk dihapus, dan mungkin satu permintaan untuk membaca data ACL (jika file Anda memiliki ACL yang bervariasi). Kecepatan terbaik akan datang dari apa pun yang dapat menjalankan operasi paling paralel.
Ada beberapa pendekatan command line yang mungkin cukup layak:
Ada beberapa kemungkinan bahwa s3fs dapat berfungsi - cukup paralel, apakah mendukung salinan antara bucket yang sama - TIDAK mendukung salinan antara bucket yang berbeda, tetapi mungkin mendukung perpindahan di antara bucket yang berbeda.
Saya akan mulai dengan s3cmd-modifikasi dan melihat apakah Anda berhasil atau hubungi Amazon untuk solusi yang lebih baik.
aws s3 sync s3://source s3://destination
cocok?
Topik lama, tapi ini untuk siapa pun yang menyelidiki skenario yang sama. Seiring dengan waktu saya, untuk lebih dari 20.000 objek. Berjalan di AWS Linux / Centos, setiap objek menjadi gambar untuk sebagian besar, bersama dengan beberapa video dan berbagai file media.
Menggunakan AWS CLI Tools untuk menyalin file dari Bucket A ke Bucket B.
A. Buat ember baru
$ aws s3 mb s3://new-bucket-name
B. Sinkronkan ember lama dengan ember baru
$ aws s3 sync s3://old-bucket-name s3://new-bucket-name
Menyalin 20.000 objek ...
Mulai 17:03
Berakhir pada 17:06
Total waktu untuk 20.000+ objek = sekitar 3 menit
Setelah ember baru dikonfigurasi dengan benar, yaitu izin, kebijakan dll. Dan Anda ingin menghapus ember lama.
C. Lepas / hapus ember lama
$ aws s3 rb --force s3://old-bucket-name
Saya membayangkan Anda mungkin telah menemukan solusi yang baik sekarang, tetapi untuk orang lain yang menghadapi masalah ini (seperti saya baru-baru ini), saya telah membuat utilitas sederhana khusus untuk tujuan mirroring satu ember S3 ke yang lain di cara yang sangat konkuren, namun CPU dan memori efisien.
Ada di github di bawah Lisensi Apache di sini: https://github.com/cobbzilla/s3s3mirror
Jika Anda memutuskan untuk mencobanya, beri tahu saya jika Anda memiliki umpan balik.
--cross-account-copy
opsi ( -C
singkatnya) untuk melakukan ini. Perhatikan bahwa saat menyalin di seluruh akun, ACL tidak disalin; pemilik bucket tujuan akan memiliki izin penuh untuk data yang disalin.
AWS CLI menyediakan cara untuk menyalin satu ember ke ember lainnya dalam proses paralel. Diambil dari https://stackoverflow.com/a/40270349/371699 :
Perintah berikut akan memberi tahu AWS CLI untuk menggunakan 1.000 utas untuk menjalankan pekerjaan (masing-masing file kecil atau satu bagian dari salinan multi-bagian) dan melihat ke depan 100.000 pekerjaan:
aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000
Setelah menjalankan ini, Anda dapat menggunakan perintah sinkronisasi sederhana sebagai berikut:
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
Pada mesin m4.xlarge (dalam AWS - 4 core, 16GB RAM), untuk kasus saya (file 3-50GB) kecepatan sinkronisasi / salin meningkat dari sekitar 9,5MiB / dtk ke 700 + MiB / dtk, peningkatan kecepatan dari 70x lebih dari konfigurasi default.