我正在尝试同步2个s3存储桶。这是我用来在2个s3桶之间同步的命令。
s3cmd sync s3://source-bucket s3://destination-bucket
我在crontab中设置它。我已经指定了s3cmd的绝对路径。我正在记录操作,但我的日志文件是空的,虽然这并没有显示任何错误,也没有同步。是什么问题。我该如何解决这个问题。
答案 0 :(得分:4)
正如我们在评论中发现的那样,您的问题的解决方案与所描述的here相同:您的s3cmd版本太旧而无法支持从桶到桶,并且修复程序是升级你的s3cmd版本。我很高兴这很容易解决。
但是,您尝试使用此工具时会遇到两个非常重要的问题。
s3cmd实用程序不适合在cronjob中用于定期同步两个存储桶,原因有两个:
首先,您需要考虑让工具运行这么长时间,以便cron作业在下次到期时再次触发;你在这里遇到的问题是你可以同时运行2个或更多的s3cmd副本,试图同步相同的两个桶。在某些时候,随着第二个实例发现越来越多已经同步的东西,它可能会赶上第一个,它们将重新同步大约相同的文件,使你将要做的传输次数增加一倍
时间表可能如下所示:
... A发现不在那里的文件,开始同步文件
...... B发现文件不存在,也开始同步文件
......... A完成同步文件
............ B完成同步文件。
假设您没有在存储桶中使用版本化对象,那么您的数据就可以了,但您需要支付两倍的请求和两倍的带宽。
绝对最低限度,你的cron作业需要调用一个管理锁文件的bash脚本,以防止多次并发运行。
其次,更严重的是,s3cmd在这种环境下不会扩展,因为它似乎没有“记忆”每个桶中的内容。
例如,我有一个包含800万个物体的桶。如果我想用s3cmd从一个桶到另一个桶进行一次性复制,那就没关系。问题是,s3cmd不会“记住”它之前在你的桶中看到的东西,所以第二次,以及随后的每一次,它必须发现并检查一个桶中的所有800万个文件,然后验证它们是否'通过在两个方向上针对每个对象发送HEAD
请求,在另一个桶中(并且可能)验证它们是否是相同的文件。因此,这种方法不会扩展,最终会导致对S3的不必要请求产生大量成本。
对于我自己的内部系统,我维护了桶中对象的本地数据库。当我将一个对象添加到存储桶时,我会在传输成功后使用该对象的大小,md5和其他属性更新数据库。然后,我将所有桶设置为记录(进入另一个共同的桶)。我的系统获取日志文件,解析它们,以及由其他进程上传的任何对象(根据日志)我获取它们的元数据并将其存储在本地数据库中...所以我有一个本地表示什么是在S3中延迟了几分钟(日志到达和被发现的等待时间)。
然后,当我需要将桶同步到文件系统或彼此同步时,我可以使用本地数据库来比较内容并决定需要同步哪些文件。当然,我也有可以审核数据库与S3的一致性的进程。
如果您要定期同步两个存储桶,我建议您需要比s3cmd更复杂的解决方案。
答案 1 :(得分:1)
其中一个选项是将两个存储桶挂载为本地目录(例如,使用RiofS)并运行您喜欢的工具来同步两个文件夹。