操作系统:centos 6 x86_64
mongodb版本:3.4.3
集群主机拓扑:
主机
mongo shardsvr & replsetname
mongo configsvr & replsetname
mongos
test1.lan
shard-a shard-b
test2.lan
test3.lan
test4.lan
cfgshard
test5.lan
test6.lan
test7.lan
yes
test1-3 分别在一台主机上启动两个不同副本集名称的mongod实例。
test4-6 三台主机作为 config server 单独运行。
test7 主机作为 mongos 路由主机。
安装 mongodb
配置 repo 源
选择国内 阿里云 镜像资源。
配置 /etc/mongod.conf
replication 处配置 副本集 名,sharding 开启 shardsvr 模式。
启动 mongod 服务
配置 shard-a 副本集
这样,副本集 shard-a 就配置完成
接下来我们启动并配置副本集 shard-b
配置 shard-b 副本集
这样 shard-a shard-b 两个副本集已经配置完成
开始配置 config server,mongodb 从3.2版本之后开始规定 config server 也必须要开启副本集功能。
config server 的配置文件如下:config server 一般情况下是监听在 27019 端口
启动三台config server 的mongod 服务
同样,config server 的副本集配置如上文所示,这里的代码就省略了。
配置启动 mongos 路由主机
mongodb 版本 >3.2 启动mongos 的时候,需要跟上 config server 的副本集名称 (这里是 cfgreplset)
连接 mongos 测试
配置分片集群:shard
配置分片集合:接下来的步骤就是在数据库上启动分片。分片不会自动完成,而是需要在数据库里提前为集合做好设置才行。
来看看分片集合在单独分片副本集中的存在形式
首先需要找到该库已经被分配到了哪个分片之上(由于该库之前并没有数据,所以创建分片键的时候,会自动插入索引数据,自动按照默认配置路由到其中一个分片键集群之中)
写入数据到分片集群
表象背后,mongodb 底层依赖 2 个机制来保持集群的平衡:分割与迁移。
分割是把一个大的数据库分割为 2 个更小的数据块的过程。它只会在数据块大小超过最大限制的时候才会发生,目前的默认设置是 64mb。分割是必须的,因为数据块太大就难以在整个集合中分布。
迁移就是在分片之间移动数据块的过程。当某些分片服务器包含的数据块数量大大超过其他分片服务器就会触发迁移过程,这个触发器叫做迁移回合(migration round)。在一个迁移回合中,数据块从某些分片服务器迁移到其他分片服务器,直到集群看起来相对平衡为止。我们可以想象一下这两个操作,迁移比分割昂贵得多。
实际上,这些操作不应该影响我们,但是明白这一点非常有用,当遇到性能问题的时候就要想到可能它们正在迁移数据。如果插入的数据分布均匀,各个分片上的数据集应该差不多以相同的速度增长,则迁移应该不会频繁发生。