2012-02-06 61 views
5

我就像很多人正在考虑在Mongo中分割我的收藏的正确方法。主要问题是 - 自动分片如何工作?按ObjectID分片,是否正确?

官方医生说 - “MongoDB中通过自动分片(分区)架构水平缩放”和“划分一个集合,我们指定一个片键模式”。注意“为集合选择正确的分片键非常重要”:)。
http://www.mongodb.org/display/DOCS/Sharding+Introduction#ShardingIntroduction-ShardKeys
http://www.mongodb.org/display/DOCS/Choosing+a+Shard+Key

现在的问题是 - “这是正确的钥匙”(分片由对象ID)?

db.runCommand({ shardcollection : "test", key : { _id : 1 }}) 

Mongo内部会发生什么?在这种情况下,Mongo如何将数据拆分为块?假设我最初有两个分片服务器有10毫秒的记录 - 当Mongo方面当收集到20毫升记录时我想再添加2个分片服务器时会发生什么?我无法在与Mongo有关的来源的任何地方找到这种级别的细节。

考虑到自动生成_id的帐户随机性质和它的结构,

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

我会通过价值分裂至少显著字节(RTL顺序)块分片2-3字节 - 这将提供容易的方式由碎片服务器2^N至碎片 - 2,4,8,...,与更多或更少甚至256台碎片服务器上每个碎片,并用最小所需配置加载。据我了解,Mongo仅支持通过明确定义的范围进行分片/分块,并且我的想法不起作用。是真的吗?

+0

是的,我是在相积极的研究针对新项目 - 将审查我的所有问题,并在研究完成时接受最适用的问题。 – 2012-02-06 18:48:02

+0

@XtraCoder你的研究过程如何?这个答案似乎值得接受。 – 2012-08-10 16:45:20

回答

12

一个令人兴奋的新功能,在2.4版本是散列索引支持,并且可以用作碎片键。所以对主要问题的回答是“通过ObjectID分片,这是正确的方式吗?”可能是现在!

多个引用官方文档:

散列碎片键

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

散列索引

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

+0

如果您使用'ObjectId索引'作为日期字段,我不会使用'散列索引',除非您的应用程序真的是写密集型的。 – 2016-05-10 21:41:30

+1

请注意这里的重点**“以减少查询隔离为代价”**并将此链接引用(http://docs.mongodb.org/manual/faq/sharding/#can-you-shard-on -the-ID字段) – 2017-03-16 09:03:41

13

它一般不使用默认的对象ID作为片键,因为它有一个内置时间戳和单调增加的时间是个好主意。如果您进行大量更新以便以均匀分布的方式触及新旧文档,这可能会正常工作。但是,如果您的应用程序在插入时很繁重,那么这真是个坏消息,因为您的大部分写入操作都会进入单个分片。这是因为写入操作会转到拥有[nearCurrentTimestamp - > infinity]块的碎片。

每个mongos监视器写流量碎片,并用一个非常简单的启发式,以确定是否一大块已经变得太大,需要分成(阈值大小通过CHUNKSIZE配置)。

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

蒙戈支持基于范围分片,然而,这并不意味着该范围是固定的,因为块可以被分成更小的范围和群集四处移动随时间。

+0

接受这个答案,因为它确认了我所问的“我的想法不会工作”(不幸的是):(但是我想找到使它工作的方式:) – 2012-08-14 19:51:38

+2

这不再是真正的哈希分片键,对? – 2015-11-26 19:32:28