当MongoDB集群中的一个分片磁盘空间不足时会发生什么?

时间:2014-10-21 19:36:12

标签: mongodb

铊组成; dr
当MongoDB集群中的一个分片空间不足时会发生什么?是否将所有新文档写入剩余的分片,整个群集将继续正常运行?或者这样的场景永远不会发生,因为平衡器将确保分片均匀分布?

上下文:
我有一个独立的mongod实例(A)在一台500GB磁盘空间的机器上运行,并且磁盘空间不足。我从那以后对数据库进行了分片,以便我们不会耗尽磁盘空间 - 该集群截至目前已有2个分片(A& B)。

成功分片后,我可以看到mongodb占用了大约100GB的空间,因为块正在迁移到新的分片。但是,我可以看到,它在shard A(原始的独立mongod实例)上占用了额外的30GB额外空间。经过一些研究,似乎〜28GB的内容被MoveChunk目录所占用,我想这是可以安全删除的吗?

MongoDB版本 - 2.6.5

1 个答案:

答案 0 :(得分:0)

首先,阅读我wrote here关于平衡块的内容,以了解其实际工作原理。 TL; DR版本不是,平衡器不会关心分片的完整程度,它只关心每个分片上的块计数是否相同。

回答标题问题:当一个分片空间不足时,插入到该分片上的分块范围将失败。它也可能会陷入糟糕的状态,最终可能会崩溃(尽管MongoDB在处理这类问题时已经变得更好)。

基本上我的建议是:不要让这种情况发生 - 你无法真实地预测当你的空间不足时数据库可能会处于什么状态,所以最好不要去那个要点之后再尝试处理它(稍后会详细介绍)。

关于moveChunk文件:是,it is safe to remove them once the shards are balanced

接下来,您应该阅读MongoDB中的how space is used/reused - 当您分片并且文档开始移动到新分片时,它们会在旧分片上被删除。但这并不意味着磁盘上的空间被回收,并且该碎片将继续看到通常添加的新文档(取决于您选择的分片键)。因此,即使您清理完毕,您仍可能看到数据增长。

我所得到的是,你最终可能会耗尽空间,而你想避免这种情况。您提到您正在运行单个节点,这意味着您基本上需要花时间来回收磁盘空间。因此,我看到两条可能的路径:

  1. 将独立转换为副本集(see guide),然后通过回收空间的节点进行旋转(转换的停机时间最短)
  2. 将碎片放下并run a repair(冗长的停机时间,通常受磁盘速度限制)
  3. 我会采取第一条道路。一旦完成了必要的工作,您甚至可以根据需要返回单个节点(单节点副本集=没有停机时间,独立mongod =一些停机时间从副本集转换回来)