ShardKey必须是一个索引。非空集合须在shardCollection前创建索引;空集合shardCollection自动创建索引
? MongoDB 基于 ShardKey 将 Collection 拆分成多个 数据子集,每个子集称为一个 Chunk
? shardedCollection 的数据按照 ShardKey 划分为 minKey ~ maxKey 的区间
? 每个 Chunk 有自己负责的一个区间(前闭后开)
? 存储 shardedCollection 的 Shard 上有该 Collection 的一个或多个 Chunk
Chunk 分裂
伴随着数据的写入,当 Chunk 增长到指定大小(默认为64MB)时,MongoDB会对 Chunk 进 行分裂,称为 Chunk Split
? 自动触发 – 插入&更新时会自动触发 Chunk Split。ChunkSize被调小时不会立即发生 Chunk Split
? 手动触发 -- sh.splitAt(xxx) / sh.splitFind(xxx)
? JunboChunk:一个最小的 Chunk 可以只包含一个唯一的 ShardKey,这样的 Chunk 不可以再 进行分裂,称为 JumboChunk
调整 ChunkSize
use config;
db.settings.save( { _id:"chunksize", value: <sizeInMB> } );
说明:
·只有在插入和更新操作才会触发对应 Chunk 分裂
-- 调ChunkSize会立即触发所有 Chunk 分裂为新 的大小;
·ChunkSize 取值范围 : 1 ~ 1024 MB;
·调小 ChunkSize 可以让 Chunk 更均衡的分布, 但是 Chunk 迁移次数会增加;
·调大 ChunkSize 会减少 Chunk 迁移,但会导致 Chunk 分布不均。
对现有集合数据大小
只有在其大小不超过特定限制时,才能对现有集合进行分片。这些限制可以根据所有分片键值的平均大小和配置的块大小来估计。
重要的
这些限制仅适用于初始分片操作。成功启用分片后,分片集合可以增长到任何大小。
初始分片成功后,您可以根据需要减小块大小。
MongoDB 默认的 chunkSize 为64MB,如无特殊需求,建议保持默认值;chunkSize 会直接影响到 chunk 分裂、迁移的行为。
chunkSize 越小,chunk 分裂及迁移越多,数据分布越均衡;反之,chunkSize 越大,chunk 分裂及迁移会更少,但可能导致数据分布不均。
chunkSize 太小,容易出现 jumbo chunk(即shardKey 的某个取值出现频率很高,这些文档只能放到一个 chunk 里,无法再分裂)而无法迁移;
chunkSize 越大,则可能出现 chunk 内文档数太多(chunk 内文档数不能超过 250000 )而无法迁移。
是指一个64M 的chunk 里的文档数不能超过250000,不是指chunk 的数量
chunk 自动分裂只会在数据写入时触发,所以如果将 chunkSize 改小,系统需要一定的时间来将 chunk 分裂到指定的大小。
chunk 只会分裂,不会合并,所以即使将 chunkSize 改大,现有的 chunk 数量不会减少,但 chunk 大小会随着写入不断增长,直到达到目标大小。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




