Bir Amazon S3 kovasında milyonlarca dosyam var ve bu dosyaları asgari maliyetle veya mümkün olduğunda ücretsiz olarak diğer kovalara ve klasörlere taşımak istiyorum. Bütün kovalar aynı bölgededir.
Nasıl yapabilirim?
Bir Amazon S3 kovasında milyonlarca dosyam var ve bu dosyaları asgari maliyetle veya mümkün olduğunda ücretsiz olarak diğer kovalara ve klasörlere taşımak istiyorum. Bütün kovalar aynı bölgededir.
Nasıl yapabilirim?
Yanıtlar:
Milyonlarca büyük bir sayı - daha sonra geri döneceğim.
Yaklaşımınızdan bağımsız olarak, temel mekanizmanın doğrudan bir kovadan diğerine kopyalanması gerekir - bu şekilde (kovalarınız aynı bölgede olduğu için) bant genişliği için herhangi bir ücret ödemezsiniz. Diğer herhangi bir yaklaşım sadece verimsizdir (örneğin, dosyaların indirilmesi ve yeniden yüklenmesi).
Kovalar arasında kopyalama, 'PUT kopyası' kullanılarak gerçekleştirilir - bu, 'x-amz-kopya kaynağı kaynak' başlığını içeren bir PUT isteğidir - bunun bir COPY isteği olarak sınıflandırıldığına inanıyorum. Bu dosyayı ve varsayılan olarak ilişkili meta verileri kopyalar. ACL'yi aynı anda ayarlamak istiyorsanız doğru değere sahip bir 'x-amz-acl' eklemelisiniz (aksi takdirde varsayılan olarak özel olur). COPY talepleriniz için tahsil edilecektir (0.01 $ / 1.000 istek). Gereksiz dosyaları kopyalandıktan sonra silebilirsiniz (SİLME istekleri tahsil edilmez). (Açıkça bilmediğim bir nokta, bir COPY isteğinin ayrıca bir GET isteğinin ücretini de getirip getirmediğidir, çünkü nesne önce kaynak kovadan alınmalıdır - eğer öyleyse, ek ücret 0.01 / 10.000 ABD Doları olacaktır. istekleri).
Yukarıdaki masraflar görünüşte kaçınılmaz görünüyor - bir milyon nesneye yaklaşık 10 dolar (veya 11 dolar) bakıyorsunuz. Sonunda gerçekten hedef kovandaki dosyaları oluşturmanız gerektiğinden, diğer yaklaşımlar (örneğin, tar-gzipping, Amazon Alma / Verme, vb.) Bu maliyeti aşmaz. Hiçbiri, aktarılacak birkaç milyondan fazla nesneniz varsa, Amazon'la iletişim kurarken buna değebilir.
Yukarıdakiler göz önüne alındığında (kaçınılmaz fiyat), dikkat edilmesi gereken bir sonraki şey 'milyonlarca dosya' kopyalanırken büyük bir etken olacak zamandır. Kovalar arasında doğrudan kopya yapabilen tüm aletler aynı yüke tabidir. Ne yazık ki, dosya başına bir istek (kopyalamak), silmek için bir istek ve ACL verilerini okumak için bir istek (dosyalarınız farklı ACL'lere sahipse) gerekir. En iyi hız, en paralel işlemleri yürütebilecek olandan gelir.
Oldukça uygun olabilecek bazı komut satırı yaklaşımları var:
S3fs işe yarayabilecek bazı olasılığı vardır - Farklı kovalar arasındaki kopyalarını DESTEKLEMEZ ama - oldukça paraleldir, aynı kova arasındaki destek kopyalarını yapar belki farklı kovalar arasındaki hareketini desteklemek.
S3cmd-modifikasyon ile başlar ve daha iyi bir çözüm için herhangi bir başarınız olup olmadığını görürsünüz ya da Amazon'la temasa geçiyorum.
aws s3 sync s3://source s3://destination
sığacak?
Eski konu, ancak bu aynı senaryoyu araştıran herkes içindir. 20.000'in üzerinde nesne için beni aldı. AWS Linux / Centos'ta çalışan nesnelerin çoğu, bazı video ve çeşitli medya dosyalarının yanı sıra görüntü olarak da kullanılıyor.
Dosyaları Kova A'dan Kova B'ye Kopyalamak için AWS CLI Araçlarını Kullanma
A. Yeni kepçe oluşturun
$ aws s3 mb s3://new-bucket-name
B. Eski kovayı yeni kova ile senkronize edin
$ aws s3 sync s3://old-bucket-name s3://new-bucket-name
20.000'den fazla nesne kopyalanıyor ...
17:03
17:06 'de sona erdi
20.000+ nesne için toplam süre = yaklaşık 3 dakika
Yeni kova doğru bir şekilde yapılandırıldıktan sonra izinler, politikalar vb. Eski kovayı çıkarmak istersiniz.
C. Eski kovayı çıkarın / silin
$ aws s3 rb --force s3://old-bucket-name
Şu ana kadar muhtemelen iyi bir çözüm bulduğunuzu hayal ediyorum, ancak bu sorunla karşılaşan diğer kişiler için (az önce olduğu gibi), özellikle bir S3 kovasını diğerine yansıtmak amacıyla basit bir yardımcı program hazırladım. çok eşzamanlı, ancak CPU ve bellek verimli bir şekilde.
Burada Apache Lisansı altında github'da: https://github.com/cobbzilla/s3s3mirror
Denemeye karar verirseniz, herhangi bir geri bildirim varsa lütfen bana bildirin.
--cross-account-copy
seçenek var ( -C
kısaca). Hesaplar genelinde kopyalarken, ACL unutmayın değil kopyalanan; Hedef kovanın sahibi kopyalanan verilere tam izin verecek.
AWS CLI, paralel işlemlerde bir kovayı diğerine kopyalamanın bir yolunu sağlar. Alındığı https://stackoverflow.com/a/40270349/371699 :
Aşağıdaki komutlar AWS CLI'ye işleri yürütmek için 1.000 iş parçacığı kullanmasını söyleyecektir (her biri küçük bir dosya ya da çok parçalı bir kopyanın bir kısmı) ve 100.000 işin önüne bakacak:
aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000
Bunları çalıştırdıktan sonra, basit senkronizasyon komutunu aşağıdaki gibi kullanabilirsiniz:
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
Bir m4.xlarge makinesinde (AWS - 4 çekirdekte, 16 GB RAM'de), benim durumumda (3-50 GB dosyalar), eşitleme / kopyalama hızı yaklaşık 9.5MiB / s'den 700 + MiB / s'ye çıktı. Varsayılan yapılandırma üzerinden 70x.