Ubuntu 使用s3cmd在2个s3存储桶之间同步不工作

Ubuntu 使用s3cmd在2个s3存储桶之间同步不工作,ubuntu,amazon-web-services,amazon-s3,s3cmd,Ubuntu,Amazon Web Services,Amazon S3,S3cmd,我正在尝试同步2个s3存储桶。下面是我用来在两个s3存储桶之间同步的命令 s3cmd sync s3://source-bucket s3://destination-bucket 我正在crontab中设置这个。我已经指定了s3cmd的绝对路径。我正在记录操作,但我的日志文件为空,这不会显示任何错误,也不会同步。问题是什么。我该如何解决这个问题 正如我们在评论中所发现的,您的问题的解决方案与所描述的是一样的:您的s3cmd版本太旧,无法支持从一个存储桶到另一个存储桶,修复方法是升级您的s3c

我正在尝试同步2个s3存储桶。下面是我用来在两个s3存储桶之间同步的命令

s3cmd sync s3://source-bucket s3://destination-bucket

我正在crontab中设置这个。我已经指定了s3cmd的绝对路径。我正在记录操作,但我的日志文件为空,这不会显示任何错误,也不会同步。问题是什么。我该如何解决这个问题

正如我们在评论中所发现的,您的问题的解决方案与所描述的是一样的:您的s3cmd版本太旧,无法支持从一个存储桶到另一个存储桶,修复方法是升级您的s3cmd版本。我很高兴这是一个简单的解决办法

然而,在使用此工具时,有两个非常重要的问题

s3cmd实用程序不是在cronjob中用于例行同步两个存储桶的合适工具,原因有二:

首先,您需要考虑到工具运行的时间太长,以至于cron作业在下次到期时再次触发;这里的问题是,您可能同时运行两个或多个s3cmd副本,试图同步相同的两个存储桶。当第二个实例发现越来越多已经同步的内容时,它可能会赶上第一个实例,使它们重新同步几乎相同的文件,从而使传输数量增加一倍

时间线可以如下所示:

…发现文件不在那里,开始同步文件

……B发现文件不在那里,也开始同步文件

完成同步文件

完成同步文件

假设您的bucket中没有使用版本化对象,那么您的数据就可以了,但您需要支付两倍的请求和两倍的带宽

至少,cron作业需要调用一个bash脚本来管理锁文件,以防止多次并发运行

第二,更严重的是,s3cmd在这种环境中不会扩展,因为它似乎没有每个存储桶中的内容的“内存”

例如,我有一个桶,里面有800万个物体。如果我想用s3cmd一次性从一个存储桶复制到另一个存储桶,那就没问题了。问题是,s3cmd无法“记住”它以前在您的存储桶中看到的内容,因此第二次,以及随后的每一次,它必须发现并检查一个存储桶中的所有800万个文件,然后验证它们是否在另一个存储桶中,并(大概)验证它们是否是相同的文件,通过向两个方向的每个对象发送
HEAD
请求。因此,这种方法将无法扩展,并且可能最终导致对S3的不必要请求的巨大成本

对于我自己的内部系统,我维护bucket中对象的本地数据库。当我将一个对象添加到bucket中时,我会在传输成功后使用该对象的size、md5和其他属性更新数据库。然后,我的所有存储桶都设置了日志记录(进入一个不同的公共存储桶)。我的系统获取日志文件,解析它们,对于其他进程(根据日志)上载的任何对象,我获取它们的元数据并将其存储在本地数据库中。。。因此,我有一个S3中的本地表示,它只延迟了几分钟(日志到达并被发现的等待时间)

然后,当我需要将bucket与文件系统或彼此同步时,我可以使用本地数据库来比较内容,并决定哪些文件需要同步。当然,我也有一些进程可以根据S3审核数据库的一致性


如果您要定期同步两个存储桶,我建议您需要一个比s3cmd更复杂的解决方案

正如我们在评论中所发现的,您的问题的解决方案与所描述的是一样的:您的s3cmd版本太旧,无法支持从一个存储桶到另一个存储桶,修复方法是升级您的s3cmd版本。我很高兴这是一个简单的解决办法

然而,在使用此工具时,有两个非常重要的问题

s3cmd实用程序不是在cronjob中用于例行同步两个存储桶的合适工具,原因有二:

首先,您需要考虑到工具运行的时间太长,以至于cron作业在下次到期时再次触发;这里的问题是,您可能同时运行两个或多个s3cmd副本,试图同步相同的两个存储桶。当第二个实例发现越来越多已经同步的内容时,它可能会赶上第一个实例,使它们重新同步几乎相同的文件,从而使传输数量增加一倍

时间线可以如下所示:

…发现文件不在那里,开始同步文件

……B发现文件不在那里,也开始同步文件

完成同步文件

完成同步文件

假设您的bucket中没有使用版本化对象,那么您的数据就可以了,但您需要支付两倍的请求和两倍的带宽

至少,cron作业需要调用一个bash脚本来管理锁文件,以防止多次并发运行

第二,更严重的是,s3cmd在这种环境中不会扩展,因为它似乎没有每个存储桶中的内容的“内存”

例如,我有一个桶,里面有800万个物体。如果我想用s3cmd一次性从一个存储桶复制到另一个存储桶,那就没问题了。问题是,s3cmd不“记住”它以前在您的存储桶中看到的内容,所以第二次,以及随后的每一次,它必须发现并检查一个存储桶中的所有800万个文件,然后验证它们是否在另一个存储桶中,并(大概)验证