Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 按ObjectID切分,这是正确的方法吗?_Mongodb - Fatal编程技术网

Mongodb 按ObjectID切分,这是正确的方法吗?

Mongodb 按ObjectID切分,这是正确的方法吗?,mongodb,Mongodb,我和其他许多人一样,也在考虑在Mongo中切分我的收藏的正确方法。主要问题是-自动切分是如何工作的 官方文档说:“MongoDB通过自动切分(分区)架构水平扩展”和“为了对集合进行分区,我们指定了切分键模式。”注意“为集合选择正确的切分键非常重要”: 现在的问题是“这是正确的键吗”(ObjectID切分) Mongo内部发生了什么?在这种情况下,Mongo将如何将数据分割成块?假设我最初有10百万条记录和2个碎片服务器——当收集达到20百万条记录时,如果我想再添加2个碎片服务器,Mongo端

我和其他许多人一样,也在考虑在Mongo中切分我的收藏的正确方法。主要问题是-自动切分是如何工作的

官方文档说:“MongoDB通过自动切分(分区)架构水平扩展”和“为了对集合进行分区,我们指定了切分键模式。”注意“为集合选择正确的切分键非常重要”:


现在的问题是“这是正确的键吗”(ObjectID切分)

Mongo内部发生了什么?在这种情况下,Mongo将如何将数据分割成块?假设我最初有10百万条记录和2个碎片服务器——当收集达到20百万条记录时,如果我想再添加2个碎片服务器,Mongo端会发生什么?我在Mongo相关来源的任何地方都找不到这种级别的详细信息

考虑到自动生成的id及其结构的随机性,


我将按最低有效字节(rtl顺序)进行分块,分块的值为2-3个字节-这将提供一种简单的方法,通过2^N个分块服务器进行分块-2、4、8、…、256个分块服务器,每个分块上的负载或多或少相等,所需配置最少。据我所知,Mongo只支持显式定义范围的切分/分块,我的想法行不通。是真的吗?

使用默认对象id作为分片键通常不是一个好主意,因为它有一个嵌入的时间戳并且时间单调增加。如果您进行大量更新,使其以均匀分布的方式接触旧文档和新文档,这可能会很好地工作。然而,如果您的应用程序大量使用插入,这确实是一个坏消息,因为您的大多数写入都将进入一个碎片。这是因为写入将转到拥有[nearCurrentTimestamp->infinity]块的碎片

每个mongos都会监控碎片的写入流量,并使用一个非常简单的启发式方法来确定块是否变得太大,是否需要拆分(阈值大小可通过chunkSize配置)

当您向集群添加一个新的分片时,平衡器()将看到块不平衡,并将开始将块迁移到新的分片


Mongo支持基于范围的分片,但这并不意味着范围是固定的,因为块可以被分割成更小的范围,并随着时间的推移在集群中移动。

版本2.4中一个令人兴奋的新特性是支持哈希索引,并且可以用作分片键。因此,您的主要问题“ObjectID切分,这是正确的方法吗?”的答案现在可能是肯定的

更多参考资料见官方文件:

散列切分键

散列索引


是的,我正处于新项目的积极研究阶段-研究完成后,我将回顾我所有的问题并接受最适用的问题。@XtraCoder你的研究进展如何?这个答案似乎值得接受。接受这个答案,因为它证实了我所问的“我的想法将不起作用”(不幸):(-但是我想找到使它起作用的方法:)考虑到散列切分键,这不再是真的,对吗?使用默认的\u id作为散列切分键怎么样?_id是由mongos还是mongod生成的?如果您使用'ObjectId index'作为日期字段,除非您的应用程序是真正的写密集型应用程序,否则我不会使用'Hashed index'。请注意这里的要点“以减少查询隔离为代价”&请参阅此
db.runCommand({ shardcollection : "test", key : { _id : 1 }})