MongoDB学习笔记之分片机制概述

分片是mongodb对数据进行水平扩展的一种方式,通过选择合适的片键将数据均匀地存储在shard server集群中。

分片组件由shard server集群、config server和mongos进程组成。如下图所示:

MongoDB学习笔记之分片机制概述_第1张图片

config server中保存与分片相关的元数据,即有哪些shard server,有哪些chunk,chunk位于哪个shard server上等。

mongos主要负责路由,将客户端的请求转发到对应的shard server上。

shard server上存放了真正的数据,shard server可以是一个mongod,也可以是一个副本集。


config server

config server是一个特殊的mongod实例,存储shard集群的元数据。一台config server容易出现单点故障,官方建议3台config server,既保证数据安全,又降低了多台config server之间数据同步开销。只要有任何一台config server不可用,config server集群就变为只读,如果都挂了,重启之前的读写请求会丢失。可以在不停机的情况下修改config server的名称和数量。

config server通过config database来保存元数据,mongos则把元数据缓存起来。config database中与分片有关的集合有:

config.changelog 记录元数据的变更;

config.chunks 记录每个chunk的信息,包括chunk所属shard,以及chunk的min与max值;

config.lockpings与config.locks保存了分布式锁相关信息,当均衡器在做工作之前需要先获取锁; 

config.mongos 存储mongos实例信息,mongos实例间每隔30秒会有心跳检测;

config.settings 分片相关配置,比如chunk大小,是否启用均衡器等

config.shards 记录每个shard对应的机器,如果shard是一个副本集,则为对应副本集的名称。


chunk

shard中的数据被划分为多个chunk,每个chunk的默认大小为64M,如果chunk的大小超过64M时,mongos会尝试对其进行分割,分割后会导致每个shard对应的chunk数不一致,mongos会对这些不均匀的分片进行迁移。

如果发现64M迁移过程太长,可以减小块大小提高迁移速度,修改块大小时,已经存在的块不会立即拆分,而是在下一次拆分时进行。


均衡器

由于迁移是有开销的,mongodb并不是在发现chunk数不一致时立即进行迁移,有一个migration thresholds概念存在,migration thresholds取值如下:

小于20 2
20~79 4
>=80  8

迁移过程如下:

(1)mongos发送movechunk命令给源分片

(2)源分片执行内部的moveChunk操作,这时对chunk的写操作写到源分片

(3)目的分片从源分片拷贝数据,一次一个chunk

(4)拷贝完最后一个chunk后,紧接着执行一个同步操作,把迁移过程中的修改同步到目的分片

(5)同步完成后,目的分片连接到config database,更新元数据,修改迁移块对应的shard信息

(6)更新元数据成功后,在源分片上删除chunk数据

均衡器分为手动均衡和自动均衡,通过setBalancerState(false)设置后,均衡器不会进入均衡过程,可以在locks表中查看均衡器的状态。当向集群中添加新分片时,均衡器会尝试为该分片写数据,从而触发一系列的迁移过程,影响应用程序性能,在添加分片时一般应关闭均衡器,或者控制均衡器的启动时间范围。


你可能感兴趣的:(mongodb,NoSQL,shard)