Mongodb系列~集群chunk(2)
2024-05-23 本文已影响0人
开心的蛋黄派
一、Big Chunk
0. 错误提示
- MongoDB chunk too big to move
1. 定义
当单个chunk的记录大小超过64MB,且无法依靠系统自动分割时,被称为big chunk或jumbo chunk,此时需要手动进行拆分。
2. 拆分方式
-
关闭Balancer:
sh.stopBalancer()
-
查询特大块:
use config
然后db.chunks.find({jumbo:true})
-
拆分特大块:
sh.splitAt("db.collection", {shardkey:"拆分临界值"})
-
手动挪动块(可选):
sh.moveChunk("db.collection", {shardkey:"拆分临界值"}, "shard_ID")
-
重启Balancer:
sh.startBalancer()
3. 造成big chunk的原因
主要是由于存在大量相似值在同一个分片中,导致chunk大小超过64MB且无法进行自动分割,此时只能手动指定切割点进行拆分。
二、片键的选择
- 高区分度: 片键本身或联合其他字段应具有高区分度,以避免形成无法分割的jumbo chunk。
- 避免单调递增或递减: 范围片键应避免单调递增或递减,以防止形成热点IO。虽然它适合范围查询,但需注意这一点。
- 唯一性索引约束: 若想做唯一性索引约束,必须包含片键。
- 片键必须是索引: 对于空集合,MongoDB会自动创建索引;对于已建立的集合,需要先手动创建索引,然后再进行分片。
三、我们需要考虑的方面
- 存储大小是否存在倾斜: 检查各分片的存储使用情况是否均衡。
- chunk数量分布: 确认chunk是否在各分片上均匀分布,因为move chunk操作会消耗大量资源。
- DML资源访问热点: 评估DML(数据操纵语言)操作是否存在资源访问热点,以确保扩展和分散访问压力。
- 唯一性约束: 考虑数据集中是否存在唯一性约束,并据此设计片键。
四、我们需要获取的信息
- 每日数据量: 估算或测量每天大约产生多少数据量,以预测分片需求和增长趋势。
- 分片规则: 确定想要使用的分片规则,如基于hash、混合或单调递增等,以优化数据分布和查询性能。