Cri*_*ian 5 php backup amazon-simpledb
我正在开发一个使用 SimpleDB 来存储其数据的 Facebook 应用程序,但我意识到亚马逊没有提供备份该数据的方法(至少我知道)
而且 SimpleDB 很慢。您每秒可以获得大约 4 个列表,每个列表包含 100 条记录。不是备份大量记录的好方法。
我在网络上找到了一些可以为您进行备份的服务,但我不愿意向他们提供我的 AWS 凭证。
所以我想使用线程。问题是,如果对域中的所有键进行选择,则需要等待第一页的 next_token 值才能处理第二页,依此类推。
我为此考虑的一个解决方案是根据 Facebook id 的最后 2 位数字创建一个新属性。所以我会开始一个线程,选择“00”,另一个选择“01”,依此类推,可能有可能运行 100 个线程并更快地进行备份(至少在理论上)。一个相关的解决方案是将该域拆分为 100 个域(这样我可以单独备份每个域),但这会破坏我需要做的一些选择。另一种可能对 PHP 更友好的解决方案是使用 cron 作业来备份假设 10,000 条记录并保存“next_token”,然后下一个作业从 next_token 开始,依此类推。
有没有人对此有更好的解决方案?如果它是一个 PHP 解决方案,那就太好了,但如果它涉及其他东西,无论如何都欢迎。
PS:在你提到之前,据我所知,PHP 仍然不是线程安全的。而且我知道除非我在备份期间停止写入,否则会出现一些一致性问题,但在这种特殊情况下我并不太担心。
小智 1
根据我的经验,创建代理分片属性的方法当然有效。
或者,我们过去所做的是将备份分解为两个步骤的过程,以便尽可能获得多处理的潜力(尽管这是在java中,并且对于写入备份文件,我们可以依靠同步来确保写入安全 - 不确定 php 端的交易是什么)。
基本上,我们有一个线程对域内的数据进行选择,但不是“SELECT * FROM ...”,而是“SELECT itemName FROM ...”来获取需要备份的条目的键。然后将它们放入项目键队列中,线程池使用 getItem API 读取该队列,并以线程安全的方式写入备份文件。
与在单个线程上旋转相比,这为我们在单个域上提供了更好的吞吐量。
但最终,由于夜间备份中存在大量域,我们最终恢复到在单线程和“SELECT * FROM domain”类型模型中执行每个域备份,主要是因为我们已经有大量线程正在进行,并且线程负担过重开始成为备份处理器上的一个问题,而且还因为备份程序开始变得危险地复杂。