日期:2014-05-16  浏览次数:20505 次

mongodb的Sharding和replica Sets

为什么要用replica Sets
?
?1、数据冗余
?? replica Sets为你存储多份数据备份提供了一个自动算法
? 允许驱动对write concern的控制,这样可以确保多个节点的数据全部write成功以后才给client发送成功的反馈。
? ? ? writeconcern_safe

2、自动故障转移
?? replica Sets中的每一个节点都是对等的,只有一个primary节点
?? 驱动可以感知到replica Sets中的primary的变化
??
? 3、read Scaling 读刻度
?? 默认情况下,primary节点可以读和写
?? 大部分驱动提供slaveOk函数,声明一些操作可以在secondary节点上进行。当使用slaveOk时,可以将read操作分摊到几个节点上。

?

Sharding

?

MongoDB 提供一个自动分片的体系,通过多节点来进行水平扩展。

?

Chunk:

?????? 每个 collection 都是分 chunk 的,一个 chunk 是一个 range ,按照 key 来实现的 range

?????? 例如 ,? sharding-key {time : 1} ,某个 chunk 可能是

{time : “2011-01-01”} …… {time : “2011-10-01”}

?????? 每个 chunk 有固定的 size ,默认是 64M ,如果超过这个阀值,那么就分裂。 migrate

?????? 的时候很耗时间,相当不好,只有当 add 一个新的 shard 的时候会发生。

## 以下假设数据有某一属性 TYPE 包括 video channal text ##

Sharding key 的选择,从以下几个方面考虑:

1、? Cardinality 平均分配,确保颗粒性

2、? Write scaling 写入的尺度,比如说,我们将 time 作为 key 的话,那么所有新写入的数据将都指向最新的那个 chunk ,会对这个 shard 造成很大的压力。如果以 {TYPE : 1, time:1} 作为 key 的话,那么就会避免上面的问题。另外以默认的 ObjectID 作为 key 的时候,因为 objectID time-based 的,那么同样会产生上面的问题。

3、? query isolation 尽量使得 query 的结果可以在同一个 shard 上得到,比如说数据有某一属性 TYPE 包括 video channal text 等,那么我们又知道当查询的时候通常把这一属性加入到 condition 中,那么我们可以将 sharding-key TYPE 为开头,自己组装 key ,这样的话,可以使 query 更加有效率。 ( 例如: TYPE_md5( 可以用 url md5))

4、? sorting

5、? reliability 可靠性,衡量 sharding 的原则就是要看如果一个 shard 出现故障,那么对系统的影响到底会有多大。用一个 twitter-like 的系统做例子:

{_id : ObjectID()