正文
然后尝试在 EC2 上进行 S3 手动跨域同步,但是速度跟直接在目标 IDC 机房机器上执行差不多,所以放弃这个方案。
这里只能用最笨的办法解决,从命令使用方式上找到最快的方法。
s3cmd 是最稳定的 S3 客户端
s3cmd 是最常用的 S3 客户端,是一个 Python 写的小程序,数据同步最常用命令:
s3cmd sync s3://bucket/folder /localpath/bucket/folder -v --skip-existing
这条命令适用于小量文件的镜像同步。或者最终的数据镜像校验。它的执行过程是先扫描本地文件夹的文件列表,存储在内存中;然后从远程文件夹获取文件夹下的文件列表和文件的 meta 信息;然后对比差异开始逐个文件的下载。这里的问题是千万级别的本地文件 meta 信息的扫描、S3 上文件列表和 meta 信息的传送都会耗时很久。假如中途进程中断,整个过程会重新开始。并且非常耗费 CPU 资源。
s3cmd get -r --skip-existing s3://bucket/folder /localpath/bucket/folder
这条命令直接从远程 S3 获取文件进行下载,但是不提供数据校验。速度很快,瓶颈在网络 IO 上。
尽管有很多多线程的 S3 客户端工具,但是在尝试之后 s3cmd 仍然是最好的选择,原因是更加稳定,功能完善,考虑到了很多边界问题。但是小文件传输 s3cmd 单进程成为瓶颈,并不能充分利用带宽和机器资源。单个进程的同步速度只有几十 KB/s 。