Mam miliony plików w segmencie Amazon S3 i chciałbym przenieść te pliki do innych segmentów i folderów przy minimalnym koszcie lub bez kosztów, jeśli to możliwe. Wszystkie wiadra znajdują się w tej samej strefie.
Jak mogłem to zrobić?
Mam miliony plików w segmencie Amazon S3 i chciałbym przenieść te pliki do innych segmentów i folderów przy minimalnym koszcie lub bez kosztów, jeśli to możliwe. Wszystkie wiadra znajdują się w tej samej strefie.
Jak mogłem to zrobić?
Odpowiedzi:
Miliony to duża liczba - wrócę do tego później.
Niezależnie od twojego podejścia, podstawowym mechanizmem musi być kopiowanie bezpośrednio z jednego segmentu do drugiego - w ten sposób (ponieważ twoje segmenty znajdują się w tym samym regionie) nie ponosisz żadnych opłat za przepustowość. Każde inne podejście jest po prostu nieefektywne (np. Pobieranie i ponowne ładowanie plików).
Kopiowanie między segmentami odbywa się za pomocą „PUT copy” - czyli żądania PUT zawierającego nagłówek „x-amz-copy-source” - uważam, że jest to klasyfikowane jako żądanie COPY. Spowoduje to skopiowanie pliku i domyślnie powiązanych metadanych. Musisz dołączyć „x-amz-acl” z prawidłową wartością, jeśli chcesz ustawić ACL w tym samym czasie (w przeciwnym razie będzie to domyślnie prywatny). Opłata zostanie naliczona za Twoje żądania KOPIOWANIA (0,01 USD / 1 000 wniosków). Możesz usunąć niepotrzebne pliki po ich skopiowaniu (żądania DELETE nie są naliczane). (Jedną kwestią, na którą nie jestem do końca jasne, jest to, czy żądanie KOPIOWANIA również wiąże się z obciążeniem żądania GET, ponieważ obiekt musi być najpierw pobrany z zasobnika źródłowego - jeśli tak, opłata wyniesie dodatkowe 0,01 USD / 10 000 USD upraszanie).
Powyższe opłaty są pozornie nieuniknione - za milion przedmiotów patrzysz na około 10 USD (lub 11 USD). Ponieważ ostatecznie musisz faktycznie utworzyć pliki w docelowym segmencie, inne metody (np. Tar-gzipping plików, import / eksport Amazon itp.) Nie pozwolą na obejście tego kosztu. Niemniej jednak warto skontaktować się z Amazonem, jeśli masz do przesłania więcej niż kilka milionów obiektów.
Biorąc pod uwagę powyższe (nieunikniona cena), następną rzeczą do rozważenia jest czas, który będzie dużym czynnikiem podczas kopiowania „milionów plików”. Wszystkie narzędzia, które mogą wykonywać bezpośrednie kopiowanie między segmentami, poniosą tę samą opłatę. Niestety potrzebujesz jednego żądania na plik (do skopiowania), jednego żądania usunięcia i ewentualnie jednego żądania odczytu danych ACL (jeśli twoje pliki mają różne ACL). Najlepsza prędkość będzie pochodzić z wszystkiego, co może wykonywać najbardziej równoległe operacje.
Istnieje kilka podejść do linii poleceń, które mogą być całkiem opłacalne:
Istnieje pewna możliwość, że s3fs może działać - jest dość równoległy, obsługuje kopie między tym samym segmentem - NIE obsługuje kopii między różnymi segmentami, ale może obsługiwać ruchy między różnymi segmentami.
Zacznę od modyfikacji s3cmd i zobaczę, czy odniesiesz z nią sukces, lub skontaktuj się z Amazonem w sprawie lepszego rozwiązania.
aws s3 sync s3://source s3://destination
mieści?
Stary temat, ale jest to dla każdego, kto bada ten sam scenariusz. Wraz z czasem, który mi to zajęło, dla ponad 20 000 obiektów. Działa na AWS Linux / Centos, przy czym każdy obiekt jest w większości obrazem, wraz z niektórymi plikami wideo i różnymi plikami multimedialnymi.
Używanie narzędzi AWS CLI do kopiowania plików z segmentu A do segmentu B.
A. Utwórz nowe wiadro
$ aws s3 mb s3://new-bucket-name
B. Zsynchronizuj stare wiadro z nowym wiadrem
$ aws s3 sync s3://old-bucket-name s3://new-bucket-name
Kopiowanie ponad 20 000 obiektów ...
Rozpoczęty 17:03
Zakończył 17:06
Całkowity czas dla ponad 20 000 obiektów = około 3 minut
Gdy nowy segment zostanie poprawnie skonfigurowany, tj. Uprawnienia, zasady itp., A użytkownik chce usunąć stary segment.
C. Usuń / usuń stary pojemnik
$ aws s3 rb --force s3://old-bucket-name
Wyobrażam sobie, że prawdopodobnie znalazłeś już dobre rozwiązanie, ale dla innych, którzy napotykają ten problem (tak jak niedawno), stworzyłem proste narzędzie specjalnie w celu wykonania kopii lustrzanej jednego wiadra S3 na drugim w wysoce współbieżny, a jednocześnie wydajny procesor i pamięć.
Jest dostępny na github na licencji Apache tutaj: https://github.com/cobbzilla/s3s3mirror
Jeśli zdecydujesz się spróbować, daj mi znać, jeśli masz jakieś uwagi.
--cross-account-copy
opcja ( -C
w skrócie), aby to zrobić. Pamiętaj, że podczas kopiowania między kontami listy ACL nie są kopiowane; właściciel docelowego segmentu będzie miał pełne uprawnienia do skopiowanych danych.
Interfejs AWS CLI umożliwia kopiowanie jednego segmentu do drugiego w równoległych procesach. Zaczerpnięte z https://stackoverflow.com/a/40270349/371699 :
Następujące polecenia powiedzą interfejsowi AWS CLI, aby używał 1000 wątków do wykonywania zadań (każdy mały plik lub część wieloczęściowej kopii) i patrzył w przyszłość 100 000 zadań:
aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000
Po ich uruchomieniu możesz użyć prostej komendy synchronizacji w następujący sposób:
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
Na maszynie m4.xlarge (w AWS - 4 rdzenie, 16 GB pamięci RAM), w moim przypadku (pliki 3-50 GB) prędkość synchronizacji / kopiowania wzrosła z około 9,5 Mb / s do 700 + MiB / s, wzrost prędkości o 70x ponad domyślną konfigurację.