Mongodb 分片实战

本文记录了从MongoDB主从模式迁移到分片结构过程中遇到的问题及解决策略,包括数据未均衡、片键选择不当、唯一索引与分片冲突、内存消耗过大等。通过分析和调整,实现了数据的合理分片与资源优化。
摘要由CSDN通过智能技术生成

上一篇文章尝试了从原有Mongodb主从模式迁移到分片结构的尝试,当上线正式环境中出现了一些问题,主要原因还是对分片的概念理解不到位,以下记录对出现问题的调整和一些思考,以作备忘。

分片的原则

1. 在数据库单表数据量超大(单表数据量达到1G以上),在查询或者写入的时候性能无法满足要求的时候才需要分片。
2. 可以只对库中的特定的表分片。
3. 分片是通过将数据分散到多台机器上以达到通过多台低配置的机器满足大数据量数据的操作。
4. 分片是对指定表中的数据进行化整为零,而不是对库中所有表去划分分片。分片的是表中的数据,不是库中的表。
5. 对表分片后对于原有的unique索引,必须是分片片键的子集。(因为分片后数据是各分片独立管理的)
6. 对于生产环境,尽量保证一台物理主机只运行一个mongod进程。

上篇文章分片结构线上出现的问题分析

  1. 数据没有被均衡器均衡到各个分片,数据仍旧集中在主分片上

分析:

这种情况只有一种原因就是选择片键不合适的问题,上一篇文章,我选择了用 ts_user_id(用户id)和 ts_table_id(用户表id)作为片键,因为原有数据中没有这些字段,我通过程序为所有分片的表写入了这两个字段,这里我违反了分片原则4.当时想法是把不同的表按照片键分配到不同的片区去。时刻要明确,分片的是表中的数据,而不是表本身。我再每张表中加入了这两个字段,这两个字段在表中是一个固定值(一个表属于指定用户),因此片键的取值只有一个,那自然无法根据片键去做均衡。

解决:

片键选择的时候一定要保证在表内的数据中作为片键的字段取值要足够多或者说片键的取值维度足

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值