添加新的碎片-总是最好的?

添加新的碎片-总是最好的?

在我们的设置中,我们目前有 3 个分片集分片集群,每个分片都是 3 个副本集。为了实现新功能,我们的写入量即将大幅增加,我们知道额外的数据是必要的。我们的写入性质基本上都是 upsert(很可能是更新)和将特定字段增加 1 的更新。

我们的更新总是以 1 为增量,而我们的数据分布方式,并不是所有文档都得到同等对待,有些文档的字段增量更大。我认为可能有效的另一种解决方案是使用某种中间人,比如几个 Redis 数据库(或一些较小的 mongod),我们首先对它们进行更新,大约 5 分钟后(或使用一些排队系统),我们让一群工作人员使用数据并使用文档更新实际的实时集群。这将为我们的主集群节省大量写入,因为它将允许某些更新繁重的文档累积其更新,并可以为我们节省大量写入(确切的数字我将在编辑中很快发布)。

所以底线是,什么时候添加另一个分片不是正确的解决方案?

答案1

Redis 当然可以用作 MongoDB 的缓存/写回方法。

但是,如果您已经用尽了添加内存、使用更快的磁盘等选项,那么添加分片是增加应用程序写入容量的主要方法。

另外,请注意 MongoDB 的写锁倾向。Mongo 允许内核管理存储在 RAM 中的内容,因此执行 upsert 时的最佳做法是先读取对象(以便将其存储在 RAM 中),然后写入。如果不这样做,则在对象不在工作集中的情况下,写锁会持续更长时间,因为它会放置写锁,然后从磁盘读取文档,写入文档(现在在 RAM 中),然后释放锁。如果在写锁发生之前已经完成读取(将对象带入 RAM),那么所有这些都不会太麻烦。

相关内容