MongoDB分片配置的实时同步
本文内容适用于MongoDB v3.2及以上版本
分片集群在config server存储集群的各种配置信息,比如节点地址、分片配置、数据分布等,可连接mongos切换到config数据库查询相关信息。
分片操作包括enableSharding和shardCollection命令,分别作用于数据库和集合,下面从这两个方面分别说明。
数据库分片
enableSharding命令用于开启数据库的分片状态,只有当数据库开启分片后,其集合才能进一步分片。
config.database集合存储全部数据库的meta信息,例如:
|
|
| 字段 | 说明 |
|---|---|
| _id | 数据库名称 |
| primary | 主shard |
| partitioned | 分片状态(true / false) |
数据库的meta记录遵循以下规则:
- 创建数据库,对应的meta记录写入
config.databases - 删除数据库,对应的meta记录从
config.databases删除 - 对于一个已存在但未开启分片的数据库执行分片操作,其meta记录的
partitioned字段产生状态变化(false => true)
集合分片
shardCollection命令用于对集合分片。
config.collections仅存储分片集合的meta信息,例如:
|
|
| 字段 | 说明 |
|---|---|
| _id | 集合namespace |
| lastmodEpoch | 更新时间点相关 |
| lastmod | 更新时间点相关 |
| dropped | 是否已删除(true / false) |
| key | 片键 |
| unique | 片键唯一性约束(true / false) |
集合的meta记录遵循以下规则:
- 对一个新集合分片,对应的meta记录写入
config.collections - 删除一个分片集合,其meta记录的
dropped字段产生状态变化(false => true,meta记录不会从config.collections删除) - 对一个已经删除的分片集合重新分片,其meta记录的
dropped字段产生状态变化(true => false,此时meta记录已经存在)
实时同步原理
从MongoDB 3.2版本起,分片集群config server支持复制集,为实时同步提供了基础。
分片配置同步的原理与数据同步类似,监听并回放config server的oplog,只是回放逻辑需要依据以下规则:
-
{ns: ‘config.databases’, op: ’i‘, partitioned: false}新建数据库
-
{ns: 'config.databases', op: 'i', partitioned: true}新建数据库并执行分片
-
{ns: 'config.databases', op: 'd'}删除数据库
-
{ns: 'config.databases', op: 'u'}对数据库执行分片,此oplog表示对未分片的数据库执行分片
-
{ns: 'config.collections', op: 'i'}新建集合并执行分片
-
{ns: 'config.collections', op: 'u', dorpped: false}对集合执行分片,此oplog表示对一个已经删除的分片集合重新分片
-
{ns: 'config.collections', op: 'u', dorpped: true}删除集合