通过ObjectID进行分片,这是正确的方法吗?

Xtr*_*der 7 mongodb

我就像许多人正在考虑在Mongo中对我的收藏品进行分类的正确方法.主要问题是 - 自动分片是如何工作的?

官方文档称 - "MongoDB通过自动分片(分区)架构进行水平扩展"和"要对分区进行分区,我们指定了一个分片键模式." 注意"为集合选择正确的分片键很重要":).
http://www.mongodb.org/display/DOCS/Sharding+Introduction#ShardingIntroduction-ShardKeys
http://www.mongodb.org/display/DOCS/Choosing+a+Shard+Key

现在的问题是 - "这是正确的密钥"(通过ObjectID进行分片)?

db.runCommand({ shardcollection : "test", key : { _id : 1 }})
Run Code Online (Sandbox Code Playgroud)

Mongo内部会发生什么?在这种情况下,Mongo如何将数据拆分为块?假设我最初拥有10ml带有2个分片服务器的记录 - 当我想在集合达到20mln记录时再添加2个分片服务器时,Mongo方面会发生什么?我无法在Mongo相关来源的任何地方找到这种级别的详细信息.

考虑到自生生_id及其结构的随机性,

... http://www.mongodb.org/display/DOCS/Object+IDs ......

我将通过最低有效字节(rtl顺序)进行分片,其中块分为2-3个字节的值 - 这将提供简单的方法来分片2 ^ N的分片服务器--2,4,8,...,256个分片服务器在每个分片上具有或多或少的均匀负载,并且具有最少的所需配置.据我所知,Mongo仅通过明确定义的范围支持分片/分块,并且我的想法不起作用.是真的吗?

小智 16

使用默认对象id作为分片键通常不是一个好主意,因为它具有嵌入的时间戳并且在时间上单调增加.如果您进行大量更新,以便以均匀分布的方式触及旧文档和新文档,这可能会正常工作.但是,如果您的应用程序对插入很重要,那么这是非常坏的消息,因为大多数写入将转到单个分片.这是因为写入将转到拥有[nearCurrentTimestamp - > infinity]块的分片.

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

向集群添加新分片时,均衡器(http://www.mongodb.org/display/DOCS/Sharding+Administration#ShardingAdministration-Balancing)将看到块不平衡,并将开始将块迁移到新分片.

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

  • 给定散列的分片键不再是这样,对吗? (3认同)

小智 14

版本2.4中的一个新的令人兴奋的功能是支持Hashed索引,并且可以用作分片键.那么你的主要问题"通过ObjectID进行分片,这是正确的方法吗?"的答案.现在可能是的!

更多参考资料在官方文档中:

哈希碎片键

http://docs.mongodb.org/manual/core/sharded-cluster-internals/#hashed-shard-keys

哈希指数

http://docs.mongodb.org/manual/core/indexes/#hashed-index