S3バケットには約400万個のファイルがあり、合計で約500GBを消費しています。ファイルを新しいバケットに同期する必要があります(実際にはバケットの名前を変更するだけで十分ですが、それが不可能なため、新しいバケットを作成し、ファイルをそこに移動し、古いバケットを削除する必要があります)。
AWS CLIのs3 sync
コマンドを使用していますが、それは仕事をしますが、多くの時間がかかります。 依存システムのダウンタイムが最小になるように時間を短縮したいと思います。
ローカルマシンとEC2 c4.xlarge
インスタンスの両方から同期を実行しようとしていましたが、かかる時間に大きな違いはありません。
--exclude
および--include
オプションを使用してジョブを複数のバッチに分割し、別々のターミナルウィンドウから並行して実行すると、かかる時間が多少短縮されることに気付きました。
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "1?/*"
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "2?/*"
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "3?/*"
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "4?/*"
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "1?/*" --exclude "2?/*" --exclude "3?/*" --exclude "4?/*"
同期をさらに高速化できる方法は他にありますか?別のタイプのEC2
インスタンスがジョブに適していますか?ジョブを複数のバッチに分割するのは良い考えですか?同じバケットで並列に実行できるsync
プロセスの「最適な」数のようなものがありますか?
更新
システムを停止する前にバケットを同期し、移行を実行してから、バケットを再度同期して、その間に変更された少数のファイルのみをコピーする戦略に傾倒しています。ただし、違いのないバケットでも同じsync
コマンドを実行するには時間がかかります。
EMRとS3-distcpを使用できます。 2つのバケット間で153 TBを同期しなければなりませんでした。これには約9日かかりました。また、データ転送コストが発生するため、バケットが同じリージョンにあることを確認してください。
aws emr add-steps --cluster-id <value> --steps Name="Command Runner",Jar="command-runner.jar",[{"Args":["s3-dist-cp","--s3Endpoint","s3.amazonaws.com","--src","s3://BUCKETNAME","--dest","s3://BUCKETNAME"]}]
http://docs.aws.Amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html
http://docs.aws.Amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-commandrunner.html
OPがすでに行っていることの変形として..
同期するすべてのファイルのリストをaws s3 sync --dryrun
で作成できます
aws s3 sync s3://source-bucket s3://destination-bucket --dryrun
# or even
aws s3 ls s3://source-bucket --recursive
同期するオブジェクトのリストを使用して、ジョブを複数のaws s3 cp ...
コマンドに分割します。このように、「aws cli」は、--exclude "*" --include "1?/*"
型引数で複数の同期ジョブを開始するときのように、同期候補のリストを取得しながら、そこにぶら下がるだけではありません。
すべての「コピー」ジョブが完了すると、オブジェクトが「ソース」バケットから削除される可能性がある場合、おそらく--delete
を使用して、別の同期を行う価値があります。
異なるリージョンにある「ソース」および「デスティネーション」バケットの場合、バケットの同期を開始する前に、 クロスリージョン バケット複製を有効にできます。
背景:syncコマンドのボトルネックは、オブジェクトの一覧表示とオブジェクトのコピーです。オブジェクトのリストは通常、シリアル操作ですが、プレフィックスを指定すると、オブジェクトのサブセットをリストできます。これが並列化の唯一のトリックです。オブジェクトのコピーは並行して実行できます。
残念ながら、aws s3 sync
は並列化を行わず、接頭辞が/
で終わる場合を除き、接頭辞によるリストもサポートしていません(つまり、フォルダごとにリストできます)。これが遅い理由です。
s3s3mirror (および多くの同様のツール)はコピーを並列化します。オブジェクト(または他のツール)がオブジェクトのリストを並列化するとは思わないただし、プレフィックスはサポートされているため、アルファベットの各文字(または適切なもの)ごとに複数回呼び出すことができます。
また、AWS APIを使用してロールアウトすることもできます。
最後に、S3バケットと同じリージョンのインスタンスで起動する場合、aws s3 sync
コマンド自体(およびそれに関するツール)は少し高速になるはずです。
40100個のオブジェクト160GBが90秒未満でコピー/同期されました
以下の手順に従ってください。
step1- select the source folder
step2- under the properties of the source folder choose advance setting
step3- enable transfer acceleration and get the endpoint
AWS構成は1回のみ(毎回これを繰り返す必要はありません)
aws configure set default.region us-east-1 #set it to your default region
aws configure set default.s3.max_concurrent_requests 2000
aws configure set default.s3.use_accelerate_endpoint true
オプション:-
--delete:このオプションは、ソースにファイルが存在しない場合、宛先のファイルを削除します
同期するAWSコマンド
aws s3 sync s3://source-test-1992/foldertobesynced/ s3://destination-test-1992/foldertobesynced/ --delete --endpoint-url http://soucre-test-1992.s3-accelerate.amazonaws.com
転送加速コスト
https://aws.Amazon.com/s3/pricing/#S3_Transfer_Acceleration_pricing