Jak przenosić pliki między dwoma segmentami S3 przy minimalnym koszcie?

44

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ć?

Daniel Cukier
źródło

Odpowiedzi:

53

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:

  • modyfikacja s3cmd (to konkretne żądanie ściągnięcia) zawiera równoległe polecenia cp i mv i powinna być dla ciebie dobrą opcją.
  • Konsola AWS może wykonać kopię bezpośrednio - nie mogę mówić o tym, jak równoległa jest.
  • Skrypt aws Tima Kaya może wykonać kopię - ale nie jest równoległy - musisz ją napisać, aby uruchomić pełną kopię, którą chcesz (prawdopodobnie nie jest to najlepsza opcja w tym przypadku - chociaż jest to świetny skrypt).
  • CloudBerry S3 Explorer , Bucket Explorer i CloudBuddy powinny być w stanie wykonać to zadanie, chociaż nie wiem, w jaki sposób wydajność każdego z nich się podnosi. Uważam jednak, że wielowątkowe funkcje większości z nich wymagają zakupu oprogramowania.
  • Skryptuj własny, używając jednego z dostępnych zestawów SDK.

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.

cyberx86
źródło
Bucket Explorer wydaje się działać dla mnie dobrze (przenoszenie plików między dwoma segmentami w tej chwili)
Noodles
3
Gdzie się aws s3 sync s3://source s3://destinationmieści?
Olivier Lalonde
7

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
użytkownik1360528
źródło
Zbawiciel życia. Kopiuję 300 + GB. Wskazówka: jeśli kopiujesz z wiader w tym samym regionie, jest znacznie szybszy niż w innym regionie (a ja czytam, że jest tańszy).
Marcelo Agimóvel,
Miałem problem z twoją metodą: prywatność plików była ustawiona na PRYWATNE, nawet większość obiektów była publiczna, co się stało?
Marcelo Agimóvel
5

Nie jestem pewien, czy jest to najlepsze podejście, ale konsola zarządzania AWS ma funkcję wycinania / kopiowania / wklejania. bardzo łatwy w użyciu i wydajny.

Itikos Kleinos
źródło
6
To raczej nie zadziała dobrze z milionem plików.
James
@James może potwierdzić, że boleśnie;)
rob
3

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.

cobbzilla
źródło
Świetnie się bawiłem z s3s3mirror. Udało mi się ustawić go na węźle m1.small EC2 i skopiować 1,5 miliona obiektów w około 2 godziny. Konfiguracja była trochę trudna z powodu mojej nieznajomości Mavena i Javy, ale wystarczyło kilku poleceń apt-get na Ubuntu, aby wszystko zainstalować. Ostatnia uwaga: jeśli (podobnie jak ja) martwisz się uruchomieniem nieznanego skryptu w dużym, ważnym segmencie s3, utwórz specjalnego użytkownika z dostępem tylko do odczytu w segmencie kopiowania z i użyj tych poświadczeń. Zero szansy na przypadkowe usunięcie.
Micheasza
Czy można to zastosować do koszyków między różnymi kontami?
Oliver Burdekin
@OliverBurdekin tak istnieje --cross-account-copyopcja ( -Cw 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.
cobbzilla
Dzięki @rfcreader Jak mogę oszacować koszt tego? Jestem świadomy kalkulatora kosztów AWS, ale nie mam pojęcia, na czym będzie polegał ten proces pod względem liczby zapytań typu get puts itp. Wyobrażam sobie, że zliczanie tych danych za pomocą CLI jest dość łatwe, ale jeśli wiesz więcej, skontaktuj się z nami. Wsparcie AWS sugeruje „requester płaci”. ha!
Oliver Burdekin
@OliverBurdekin s3s3mirror śledzi liczbę żądań AWS według typu (GET, COPY, DELETE itp.). Te statystyki są drukowane okresowo podczas działania, a po raz ostatni na końcu. Możesz wykonać ograniczone / testowe uruchomienie, aby skopiować mały podzbiór obiektów, powinno to dać ogólny obraz tego, ile całkowitych żądań będzie wymaganych do skopiowania całego zestawu danych.
cobbzilla
2

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ę.

czas lecieć
źródło
0

W przegrywającym segmencie wybierz pliki, które chcesz skopiować do innego segmentu.

  • W obszarze Działania wybierz opcję „Kopiuj”.
  • Idź do zdobywającego wiadra.
  • W obszarze Działania wybierz opcję „Wklej”
Jan
źródło
1
Po co powtarzać rozwiązanie, o którym wspominali inni rok wcześniej?
Benjamin,