Próbowałem znaleźć lepsze narzędzie wiersza poleceń do kopiowania zasobników niż s3cmd . s3cmd
moż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 s3cmd
mó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?
amazon-web-services
amazon-s3
Sean McCleary
źródło
źródło
Odpowiedzi:
AWS CLI wydaje się doskonale wykonywać swoją pracę i ma tę zaletę, że jest oficjalnie obsługiwanym narzędziem.
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_requests
aby zmniejszyć wpływ opóźnienia. Na przykład:źródło
Jeśli nie masz nic przeciwko korzystaniu z konsoli AWS, możesz:
Nadal jest dość powolny, ale możesz zostawić go w spokoju i pozwolić mu działać.
źródło
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/
źródło
W przypadku rozwiązania adhoc użyj
aws cli
do synchronizacji między zasobnikami :aws s3 sync
prę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 sync
z 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.
źródło
awscli
dokument -aws sync
kopiuj tylko nowe i zaktualizowane pliki. prawdopodobnie powinieneś spodziewać się wysokiej wydajności zaws 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)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
źródło
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.
źródło
prosty
aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursive
działa dobrze (zakładając, że masz konfigurację AWS CLI)źródło