Mongodb系列~集群chunk(2)

2024-05-23  本文已影响0人  开心的蛋黄派

一、Big Chunk

0. 错误提示

1. 定义

当单个chunk的记录大小超过64MB,且无法依靠系统自动分割时,被称为big chunk或jumbo chunk,此时需要手动进行拆分。

2. 拆分方式

  1. 关闭Balancer: sh.stopBalancer()
  2. 查询特大块: use config 然后 db.chunks.find({jumbo:true})
  3. 拆分特大块: sh.splitAt("db.collection", {shardkey:"拆分临界值"})
  4. 手动挪动块(可选): sh.moveChunk("db.collection", {shardkey:"拆分临界值"}, "shard_ID")
  5. 重启Balancer: sh.startBalancer()

3. 造成big chunk的原因

主要是由于存在大量相似值在同一个分片中,导致chunk大小超过64MB且无法进行自动分割,此时只能手动指定切割点进行拆分。

二、片键的选择

  1. 高区分度: 片键本身或联合其他字段应具有高区分度,以避免形成无法分割的jumbo chunk。
  2. 避免单调递增或递减: 范围片键应避免单调递增或递减,以防止形成热点IO。虽然它适合范围查询,但需注意这一点。
  3. 唯一性索引约束: 若想做唯一性索引约束,必须包含片键。
  4. 片键必须是索引: 对于空集合,MongoDB会自动创建索引;对于已建立的集合,需要先手动创建索引,然后再进行分片。

三、我们需要考虑的方面

  1. 存储大小是否存在倾斜: 检查各分片的存储使用情况是否均衡。
  2. chunk数量分布: 确认chunk是否在各分片上均匀分布,因为move chunk操作会消耗大量资源。
  3. DML资源访问热点: 评估DML(数据操纵语言)操作是否存在资源访问热点,以确保扩展和分散访问压力。
  4. 唯一性约束: 考虑数据集中是否存在唯一性约束,并据此设计片键。

四、我们需要获取的信息

  1. 每日数据量: 估算或测量每天大约产生多少数据量,以预测分片需求和增长趋势。
  2. 分片规则: 确定想要使用的分片规则,如基于hash、混合或单调递增等,以优化数据分布和查询性能。
上一篇 下一篇

猜你喜欢

热点阅读