Szybsze powielanie zasobnika s3

94

Próbowałem znaleźć lepsze narzędzie wiersza poleceń do kopiowania zasobników niż s3cmd . s3cmdmoże powielać zasobniki bez konieczności pobierania i przesyłania każdego pliku. Polecenie, które zwykle uruchamiam, aby powielić zasobniki za pomocą s3cmd, to:

s3cmd cp -r --acl-public s3://bucket1 s3://bucket2

To działa, ale jest bardzo powolne, ponieważ kopiuje każdy plik za pośrednictwem interfejsu API pojedynczo. Gdybym s3cmdmógł działać w trybie równoległym, byłbym bardzo szczęśliwy.

Czy są dostępne inne opcje jako narzędzia wiersza poleceń lub kod, których ludzie używają do duplikowania zasobników, które są szybsze niż s3cmd?

Edycja: Wygląda na to, że modyfikacja s3cmd jest dokładnie tym, czego szukam. Szkoda, że ​​nie działa. Są jakieś inne opcje?

Sean McCleary
źródło
6
Nie jestem pewien, dlaczego to pytanie jest wielokrotnie zamykane, ponieważ wydaje się, że spotkało się z nim wielu programistów. W każdym razie rozwiązałem to bardzo równolegle, oto link: github.com/cobbzilla/s3s3mirror dzięki! - Jonathan.
cobbzilla

Odpowiedzi:

167

AWS CLI wydaje się doskonale wykonywać swoją pracę i ma tę zaletę, że jest oficjalnie obsługiwanym narzędziem.

aws s3 sync s3://mybucket s3://backup-mybucket

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

Domyślnie obsługuje jednoczesne transfery. Zobacz http://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests

Aby szybko przesłać ogromną liczbę małych plików, uruchom skrypt z instancji EC2, aby zmniejszyć opóźnienie i zwiększyć, max_concurrent_requestsaby zmniejszyć wpływ opóźnienia. Na przykład:

aws configure set default.s3.max_concurrent_requests 200
python1981
źródło
4
Obsługuje nierównoczesną synchronizację w oparciu o czas modyfikacji pliku, rozmiar itp. Kiedy próbowałem, działało błyskawicznie. Uważam, że obiekty są kopiowane bezpośrednio na S3 bez pobierania ich na lokalny komputer. Domyślnie nie działa równolegle, ale jestem pewien, że możesz mieć wiele poleceń synchronizacji działających w oddzielnych podfolderach w tym samym czasie. Jest na tyle szybki, że prawdopodobnie i tak nie będziesz potrzebować go równolegle. Właśnie zduplikowałem 100 GB danych w kilka minut.
python1981
11
Wolno jak diabli, jeśli liczba plików jest wysoka.
Phương Nguyễn,
14
Podczas przesyłania wielu małych plików opóźnienie staje się kluczowym ograniczeniem, dlatego uruchomienie tego polecenia z instancji EC2 jest niezbędne.
python1981
1
Użyłem tego do zbudowania dockera
Gordon Sun
3
Teraz OBSŁUGUJE równoczesną synchronizację :-) docs.aws.amazon.com/cli/latest/topic/ ...
python1981
71

Jeśli nie masz nic przeciwko korzystaniu z konsoli AWS, możesz:

  1. Wybierz wszystkie pliki / foldery w pierwszym segmencie
  2. Kliknij Działania> Kopiuj
  3. Utwórz nowy zasobnik i wybierz go
  4. Kliknij opcję Działania> Wklej

Nadal jest dość powolny, ale możesz zostawić go w spokoju i pozwolić mu działać.

śmiertelnie
źródło
Czy to kopiuje zawartość zasobnika źródłowego na mój komputer podczas kopiowania do miejsca docelowego? Aktywność sieciowa jest duża, a inspektor przeglądarki działa bardzo wolno, więc trudno go przeanalizować. 600 K / s na moim komputerze. Wtedy zainicjowanie transferu w ramach sieci amazon byłoby znacznie szybsze ... Spróbuję zamiast tego.
Brad Goss,
9
Właśnie dzisiaj użyłem tej metody. Nie ściąga plików na twoją lokalną maszynę - wykonuje bezpośrednią kopię i jest dużo, dużo szybsza.
Greg Benedict
7
Nadal pobiera listę plików. Jeśli lista jest zbyt długa (w moim przypadku kilkadziesiąt tysięcy plików), to jest wolna jak cholera. Limit czasu / zawieszenie jest bardzo prawdopodobne
Phương Nguyễn
13
Niestety ten proces jest powiązany z przeglądarką. :( Z dokumentów : „Po zainicjowaniu procesu kopiowania musisz pozostawić przeglądarkę otwartą, gdy kopiowanie jest w toku.”
David Lemayian
4
Próbuję to zrobić na wiadrze z 8 milionami plików. Nie wiem, ile miesięcy zajmie mi zaznaczenie wszystkich pól wyboru ...
Chris Harrison
28

Próbowałem sklonować dwa zasobniki za pomocą konsoli internetowej AWS, pliku s3cmd oraz interfejsu wiersza polecenia AWS. Chociaż te metody działają przez większość czasu, są boleśnie powolne.

Wtedy znalazłem s3s3mirror : specjalistyczne narzędzie do synchronizacji dwóch zasobników S3. Jest wielowątkowy i znacznie szybszy niż inne podejścia, które wypróbowałem. Szybko przeniosłem gigabajty danych z jednego regionu AWS do drugiego.

Sprawdź to na https://github.com/cobbzilla/s3s3mirror lub pobierz kontener Docker z https://registry.hub.docker.com/u/pmoust/s3s3mirror/

Ketil
źródło
1
Jeśli masz dużo plików do przesłania, jest to zdecydowanie najlepsze narzędzie do tego zadania. Szkoda, że ​​to tak daleko na liście odpowiedzi ...
John Chryzostom
Uwaga dla niektórych osób: do kompilacji wymagana jest Java 6/7.
Brian
1
Używam tego z instancji EC2 i działa niewiarygodnie szybko! Musiałem zamienić <source-bucket> i <destination-bucket> na rzeczywistą nazwę zasobnika (nie punkt końcowy lub coś podobnego do interfejsu wiersza polecenia AWS).
ironmouse
1
Niesamowite narzędzie, wysoce zalecane w stosunku do innych, do dużej liczby plików. Kontrola nad liczbą wątków kopiowania jest genialna.
Shaunak
Czy nie uważasz, że bezpieczniej jest używać programu aws-cli, a nie aplikacji innych firm? W końcu musimy podać dane uwierzytelniające lub klucze dostępu, aby korzystać z tych narzędzi.
Keet Sugathadasa
11

W przypadku rozwiązania adhoc użyj aws clido synchronizacji między zasobnikami :

aws s3 syncprędkość zależy od:
- opóźnienia wywołania API do punktu końcowego S3
- ilości wywołań API wykonanych jednocześnie

Aby zwiększyć szybkość synchronizacji:
- uruchom aws s3 syncz instancji AWS (c3.large na FreeBSD jest OK ;-))
- zaktualizuj ~ / .aws / config za pomocą:
- max_concurrent_requests = 128
-max_queue_size = 8096

z następującą konfiguracją i typem instancji udało mi się zsynchronizować zasobnik (309 GB, 72 KB plików, us-east-1) w ciągu 474 sekund.

Aby uzyskać bardziej ogólne rozwiązanie, rozważ replikację między regionami AWS DataPipeLine lub S3.

Tom Lime
źródło
Czy wiesz, czy mógłbym spodziewać się takiej samej wydajności, gdybym użył S3 cp? Czy jesteś pewien, że kiedy użyłeś synchronizacji, faktycznie przeniósł wszystkie 309 GB? sync zsynchronizuje tylko pliki, które nie są takie same lub nie znajdują się w drugim zasobniku.
mroźny
Co sądzisz o tym w przypadku użycia, w którym mam 1 KB lub mniej plików, ale mają one większy rozmiar (10 GB)? Czy myślisz, że zobaczyłbym podobny występ dla Ciebie?
mroźny
@frosty, w moim przypadku zasobnik docelowy był pusty. na awsclidokument - aws synckopiuj tylko nowe i zaktualizowane pliki. prawdopodobnie powinieneś spodziewać się wysokiej wydajności z aws cp(kopiowanie jest wykonywane wewnętrznie, twój klient po prostu wywołuje API). wydajność zależy od następujących czynników: 1. opóźnienie między regionami src i dst (np. us-east-X do us-west-X) 2. opóźnienie między klientem a punktem końcowym API AWS (jak szybko można wywołać wywołanie API) 3. liczba jednoczesnych żądań (ile żądań na sekundę może wysłać klient). W moim przypadku 309G został skopiowany między zasobnikami w tym samym regionie (us-east-1)
Tom Lime.
3

Ponieważ chodzi o pierwsze trafienie Google na ten temat, dodanie dodatkowych informacji.

„Cyno” stworzył nowszą wersję modyfikacji s3cmd, która teraz obsługuje równoległą synchronizację typu „bucket-to-bucket”. Dokładnie to, na co też czekałem.

Żądanie pull znajduje się na https://github.com/pcorliss/s3cmd-modification/pull/2 , jego wersja na https://github.com/pearltrees/s3cmd-modification

Jean-Pierre Deckers
źródło
Modyfikacja s3cmd pozwoliła mi zaoszczędzić dni kopiowania.
gak
2

Nie znam żadnych innych narzędzi wiersza poleceń S3, ale jeśli nic tu nie pojawi się, najłatwiej będzie napisać własne.

Wybierz preferowany język i zestaw Amazon SDK / Toolkit. Następnie wystarczy wyświetlić / pobrać zawartość zasobnika źródłowego i skopiować każdy plik (oczywiście równolegle)

Patrząc na źródło modyfikacji s3cmd (i przyznaję, że nic nie wiem o Pythonie), wygląda na to, że nie zrównoleglali kodu typu bucket-to-bucket, ale być może można by użyć standardowego równoległego kodu upload / download jako punktu wyjścia do Zrób to.

Geoff Appleford
źródło
Tak. Bawiłem się tym pomysłem i pisałem go w rubinowy sposób z wykorzystaniem maszyny zdarzeń lub w wątku z JRubym. Jednak s3cmd jest już całkiem kompletny i wolałbym go po prostu użyć. Rozmawiałem z programistą s3cmd i ma on w przygotowaniu kilka rozwiązań, które prawdopodobnie rozwiążą problemy z wydajnością.
Sean McCleary,
1

prosty aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursivedziała dobrze (zakładając, że masz konfigurację AWS CLI)

mdmjsh
źródło