0

我在这里问我的问题,因为我还没有在其他任何地方找到任何信息。

上下文:
-具有 3 个服务器的副本集架构。
- PHP 作为主要语言
- 图片平均大小约为 2Mo
- 用法:使用 storeFile() PHP 驱动程序函数将大量画廊存储到 mongodb

我担心主服务器崩溃期间和之后的存储。
如果我使用 storeFile() 存储一个完整的 80Mo 文件,客户端会将查询定向到副本集的主副本,然后副本集开始存储数据。
如果现在写操作完成了 60%,而主节点失败了,写操作会发生什么?
我知道我会得到一个异常,我会捕获并尝试重试该操作。但是已经写入的数据呢?

我将在数据库中有一个现有文件,该文件是原始图片的一部分,因此已损坏?
或者,它像事务一样工作,所以如果发生错误,mongodb 会回滚操作并抛出异常?

链接到我在谷歌群组上的主题:谷歌群组主题

4

1 回答 1

0

PHP MongoDB 驱动程序将尝试“清理”对 GridFS 的失败写入,但是如果主节点崩溃,那么我们将无法访问任何主节点以执行清理例程。

因此,数据仍将存在于块集合中,但元数据(和实际文件信息)不会,因为在整个 GridFS 写入成功完成之前不会写入。

一般来说,这不是问题,因为您不应该遇到很多故障转移。但是,如果这是一个实际问题,即您正在存储无法真正访问的几兆字节数据,那么您将需要创建某种类型的后台/cronjob 任务,该任务将遍历块集合并检测孤立块。不过要小心,因为您不想删除当前正在创建的块:)

于 2013-04-22T22:22:05.930 回答