MongoDB在一台机器上按日期分片

MongoDB在一台机器上按日期分片,mongodb,sharding,Mongodb,Sharding,我们从一个mongodb开始,但没有一个我们有一个集合增长到~300GB。集合包含具有日期字段的对象。但大多数情况下,我们只需要查询最近的对象,而不是历史对象。所以我的问题是:是否可以在一台服务器上按日期字段对该集合进行切分?更明确地说,我希望将较新的对象分片到一个节点,将较旧的对象分片到另一个节点。而不是在n个碎片上均匀分布所有对象 还有一个教程,介绍如何将现有的单个数据库(没有任何副本集)分片到分片集群中?从技术上讲,您不需要分片内容,只需要索引字段即可。是的,您可以在日期字段上创建索引,您

我们从一个mongodb开始,但没有一个我们有一个集合增长到~300GB。集合包含具有日期字段的对象。但大多数情况下,我们只需要查询最近的对象,而不是历史对象。所以我的问题是:是否可以在一台服务器上按日期字段对该集合进行切分?更明确地说,我希望将较新的对象分片到一个节点,将较旧的对象分片到另一个节点。而不是在n个碎片上均匀分布所有对象


还有一个教程,介绍如何将现有的单个数据库(没有任何副本集)分片到分片集群中?

从技术上讲,您不需要分片内容,只需要索引字段即可。是的,您可以在日期字段上创建索引,您可以访问查询计划db.collection.explain(“executionStats”)

但是,选择碎片密钥非常重要。在选择碎片键

时,很少有需要考虑的事情。
- Write scaling (high cardinality, Randomization)
- Query Isolation. (read)
选择日期字段实际上提供了一个非常高的基数,但它无法进行随机化,因此所有文档都存储在单个碎片中,从而限制了系统的写入容量。出于同样的原因,不鼓励ObjectId用作碎片键

来自上述链接的内容。。
“MongoDB在创建文档时生成ObjectId值,以生成对象的唯一标识符。但是,此值中最重要的数据位表示一个时间戳,这意味着它们以规则和可预测的模式递增。即使此值具有很高的基数,在使用此值、任何日期或其他单调调用时也是如此y增加数字作为分片键,所有插入操作都将把数据存储到一个块中,因此是一个分片。因此,此分片的写入容量将定义群集的有效写入容量。“

从您的描述中,听起来您可能不需要分片,而是按日期把你的大收藏分成小收藏。因此,live集合只包含最近的数据,而较旧的数据会定期移动到其自己的归档集合。假设您不同时查询新数据和旧数据,这将起作用

。。。这意味着在某个时候,“旧”数据会从一台服务器迁移到另一台服务器?为什么要进行碎片化?您仍然需要在所述日期字段上建立一个索引,以防您需要访问旧的值,并且通过施加不必要的开销来减少可用RAM的数量。如果您真的不需要旧数据,只需将其删除,或者(如果您想保存宝贵的RAM,但保留旧数据)将其移动到具有较少数据的集合中indices@MarkusW Mahlberg通常的行为是,只有索引在使用的ram中。因此,由于我们通常查询较新的数据,较新的索引位于ram中。是的,当有大范围的查询时,我们会进行资源竞争,但这种情况可能每周发生两次。你说的是工作集吗?是的,但我还是看不出在一台机器上进行切分对你有什么帮助。您将至少有两个额外的mongod实例需要RAM和IO,但不提供任何好处,因为我们仍然可以访问同一个集合。我们在日期字段上有一个索引,但很快就不再适合RAM。但90%的查询是关于最近的数据,只有少数查询涉及广泛的历史范围。分片还应该分割索引,因为“历史”节点通常不会被查询,所以节点不会永远在ram中保存索引,也不会为最近的节点释放资源(我希望如此)。我怀疑在分片集群中,是否只有索引的一部分会加载到ram中。索引总是在RAM中,而不管查询路由到哪个分片。你为什么不做这两件事中的任何一件呢。1) 使用水平缩放并增加机器(我认为这在时间戳字段的情况下可能没有帮助)2)考虑删除旧的和冗余的记录。这将是计划b,但由于我们在所有范围内都有查询(只是不经常),这不是首选方法。