[转载]MongoDB auto shard介绍
m ongodb 从 v1.6 开始支持 auto-shard ,这无疑给管理工作带来了很大方便。
Mongodb 可以实现负载均衡和故障自动切换
一、 Mongodb 自动分片
1 、 shard 简介
Shard 指的是水平方向的多节点数据分散存储。例如:我们可以将不同省份居民信息存储到不同的 shard server 中。
应用程序可以通过 mongos process 登陆 shard 集群, mongos process 负责进行路由调度,将请求分发到合适的 shard server 上。对应用来说 shard cluster 就像一个单节点数据库,但是数据库的存储空间无限扩大。假如要写大量数据到 users 集合,这些数据会分发到多个 shared server 中,查询也是如此,因此查询效率会较高。
Shard 的分片单元是集合,而不是整个数据库。由于应用不同,可能某个集合的数据量要远大于其它的集合 , Mongodb 未作分片的集合数据存储在单一 shard 节点上
2 、负载均衡和失效切换
当某个 shard 的负载超过一定阀值后,便会自动重新分发数据,以保证系统负载均衡
每个 shards 中应该由 2 台以上设备组,设备组称为 replica set . replica set . 有 n 台服务器构成,每台服务器包含一份完整数据。在 replica set 中有一台设备为主,其它为从。当主服务器宕机后,会自动重启将一台从服务器切换为主服务。
3 、 shard 架构图
架构一
架构二、
4 、 shard key
要实现分片功能,我们需要指定集合的分片 key (相当于 oracle 分区字段),这个分片 key 通常需要创建一个索引。分片 key 可以由一个或多个字段构成。
5 、 chunks
Chunk 是一个集合中的一段连续数据。当一个 chunk 达到一定大小时就会自动分裂成两个新 trunks 。当一个 shard 超过一定量数据时, chunk 会被迁移到其它 shard 中。新增 shard 也会影响 chunk 的移动。
选择 shard key 是需要注意选择选数据均匀分布的 key ,这样能够保证数据均衡分布及其查询速度的均衡。例如我们选择按姓名进行分片,我们需要考虑重名情况,如果有大量重名的话,一个 chunk 会变得很大,并且难以分割,这种情况下我们可以考虑采用多个字段组合成一个 shard key 。
6 、 Config server
Config server 保存集群的源数据,包含每个 shard server 的进步信息和 chunk 信息等。
每个 config server 都好好一份完整的所有 trunk 信息。当配置信息修改时所有 config server 修改成功才能生效,这样才能确保数据的一致性。
任意 config server 宕机后,集群的源数据变成只读。但是这不能影响 MongoDB 集群中 mongod 数据的读写。
7 、 route process
路由进程负责调度客户端程序数据操作需求,将需求分发到各个 shard 中,然后将数据返回给客户端。对于客户端来说就是一个独立的 DB 。
Mongos 进程包含 trunk 等状态信息不是持续不变的,启动时从 config server 获取所有状态信息,在 config server 做的任何修改都会同步到 mongos 中。
Mongos 可以部署在任意机器上,不会对系统负载造成多大影响。