我使用MongoDB版本3.0.3部署了两个分片的分片集群
不幸的是,我选择了一个单调的分片键,如:
{insertTime: 1}
当数据大小较小且写入速度较慢时,平衡器可以平衡两个分片之间的数据。但是当数据量变大且写入速度更快时,平衡速度就会很慢
现在,名为shard2的两个分片之一的硬盘存储接近极限
如何在不停止服务和应用程序的情况下解决此问题?
答案 0 :(得分:1)
我强烈建议您更改分片密钥,同时为时尚早,以避免群集可预测的死亡。
当分片键单调增加时,所有写操作都将发送到单个分片。因此,此分片将增长,然后分成2个分片。你将继续锤击其中一个,直到它再次分裂。在某些时候,您的群集将不再平衡,您的群集将触发一些块移动并进一步减慢群集速度。
MongoDB在文档创建时生成ObjectId值,以生成对象的唯一标识符。但是,此值中最重要的数据位表示时间戳,这意味着它们以规则和可预测的模式递增。尽管此值具有高基数,但在使用此值,任何日期或其他单调递增的数字作为分片键时,所有插入操作都将数据存储到单个块中,因此将单个分片存储。因此,此分片的写入容量将定义群集的有效写入容量。
使用此分片键,您不会受益于分片的好处。它的性能实际上比单个节点差。
您应该阅读此内容以选择新的分片键并避免使用典型的反模式。 http://docs.mongodb.org/manual/tutorial/choose-a-shard-key/
答案 1 :(得分:0)
您可以向群集添加分片以增加容量。 来自docs:
在创建群集后或者需要向群集添加容量的任何时候,都会将分片添加到分片群集。如果尚未创建分片群集,请参阅部署分片群集。
将分片添加到群集时,请始终确保群集具有足够的容量来支持平衡群集所需的迁移,而不会影响合法的生产流量。