上一篇文章尝试了从原有Mongodb主从模式迁移到分片结构的尝试,当上线正式环境中出现了一些问题,主要原因还是对分片的概念理解不到位,以下记录对出现问题的调整和一些思考,以作备忘。
分片的原则
1. 在数据库单表数据量超大(单表数据量达到1G以上),在查询或者写入的时候性能无法满足要求的时候才需要分片。
2. 可以只对库中的特定的表分片。
3. 分片是通过将数据分散到多台机器上以达到通过多台低配置的机器满足大数据量数据的操作。
4. 分片是对指定表中的数据进行化整为零,而不是对库中所有表去划分分片。分片的是表中的数据,不是库中的表。
5. 对表分片后对于原有的unique索引,必须是分片片键的子集。(因为分片后数据是各分片独立管理的)
6. 对于生产环境,尽量保证一台物理主机只运行一个mongod进程。
上篇文章分片结构线上出现的问题分析
- 数据没有被均衡器均衡到各个分片,数据仍旧集中在主分片上
分析:
这种情况只有一种原因就是选择片键不合适的问题,上一篇文章,我选择了用 ts_user_id(用户id)和 ts_table_id(用户表id)作为片键,因为原有数据中没有这些字段,我通过程序为所有分片的表写入了这两个字段,这里我违反了分片原则4.当时想法是把不同的表按照片键分配到不同的片区去。时刻要明确,分片的是表中的数据,而不是表本身。我再每张表中加入了这两个字段,这两个字段在表中是一个固定值(一个表属于指定用户),因此片键的取值只有一个,那自然无法根据片键去做均衡。
解决:
片键选择的时候一定要保证在表内的数据中作为片键的字段取值要足够多或者说片键的取值维度足