mongodb sharding 原理学习与试用(三)

1. 什么时候启用分片?

  答: 虽然分片很强大,但是它也需要更多的硬件以及更加复杂的配置。对于采用分片的思路应该是宁可不用也不乱用。但是也要提前做好准备,不要到了快撑不住的时候才开始考虑,因为那个时候能给你思考的时间并不多。如果应用到最后仍是要采用分片的话,那在最开始就要考虑清楚到底是哪些集合会采用分片。以及设计好片键。

  当满足如下三个条件其中一个,也可以考虑采用分片:

  (一) 数据集大小接近单个节点的存储容量。

  (二) 活跃数据量接近节点最大内存容量。

  (三) 节点的写请求速度无法满足要求。(读请求速度无法满足要求的时候可以通过读写分离的方式或者replicSet模式)  

2. 标准配置:

  3个配置服务实例,每一个片都是一个replicSets,至少一个路由实例。路由实例不占资源可以跟存储数据节点布署在同一台机器。

3. 数据分片存储时默认块大小64MB。

4. 什么时候才会迁移数据(只考虑数据量这一方面)

  答:(一)在2.2版本之前,当最大数据量的节点的块数量比最小数据量的节点的块数据相差值达到8块,就会发生迁移。

    (二)在2.2版本之后,引入了迁移阀值。迁移阀值也是用来形容不同节点之间数据块的差值,只不过它会随着节点的数据块大小的增加而增加。

        当节点的数据块不超过20块时(所有节点的数据块之和),迁移阀值为2。即最大数量的数据块与最小数量的数据块的差值达到2块时就发生数据迁移 。

        当节点的数据块在20-80块之间,迁移阀值为4。同理。

        当节点的数据块超过80块,迁移阀值为8。同理。

    (三)当开始迁移数据后,直到任何两个节点之间的数据块的差值不超过2才停止。

5. 片键

  (一)片键是集合的列。且必须每条记录都存在这一列。不然一条不存在片键列的记录无法分配。

  (二)片键可以是单列,也可以是多列。

  (三)数据的分布是基于片键的范围规化。试想一下,如果以一个timestamp列为片键,那么对于插入而言,总是操作于最后一个数据节点。

  (四)片键一旦选择后是不可更改的。如果没有指定片键,系统默认使用ObjectID做片键。

6. 如何选择片键  

  (一)片键要有利于分块。每个块的片键范围必须是不同的。试想一下,如果片键的可能值很少只有几个。那么能分成的块至多就跟片键的可能值个数一样。这样一来,一个块的数据量超过默认块大小64MB后,无法分块。这样就影响读的速度。

  (二)片键要有利于分散写请求。不能因为片键的分布让写操作只操作于某一个节点。试想一下,如果以ObjectID为片键,ObjectID是按时间递增的,所以最新插入的数据的ObjectID肯定是最大的,也因此都会分配到同一个节点中。这时插入操作都操作于某一个节点。这个节点就有可能成为瓶颈。如果大部分写操作是update,那么性能影响要少一些。

  (三)分键要有利于查询数据。如果查询条件中有片键这个条件,那么路由就可以根据片键条件将查询直接转发到符合片键分布的节点然后再进行数据查询。试想一下,如果查询条件中不包含片键条件,那么路由就必须将请求转发到所有的节点进行数据查询。                                                                                                                                

 

posted @ 2012-12-24 19:10  雪刚  阅读(548)  评论(0编辑  收藏  举报