最近准备自学mongodb集群的相关知识
鉴于项目部署已经全面使用docker,故准备将mongodb集群放在容器中
系统:
cat /etc/issue Ubuntu 16.04.2 LTS \n \l
宿主环境是ubuntu 16.04.2
docker的相关安装不在介绍,docker-compose相关也不在介绍有兴趣的小伙伴可以自行查阅资料。
-----------------------------------------------------------相关背景知识------------------------------------------------------------------
MongoDB复制集由一组MongoDB实例节点组成,包含一个Primary节点、多个Secondary节点。
客户端写入的数据会被写入Primary节点,Secondary节点从Primary节点自动同步数据,保持所有成员的数据相同,提供数据库的高可用性
MongoDB复制集的配置非常简单,只需要指定复制集中包含哪些节点就好了
不需要我们指定哪个节点是Primary,会自动选举出来,其他节点便成为Secondary,自动与Primary同步,当Primary坏掉后,也会自动从多个Secondary中重新选举出Primary
下面使用Docker的MongoDB镜像创建3个MongoDB实例,配置成复制集,然后测试一下数据自动复制的情况,并模拟Primary坏掉的情况
好了,先用docker 安装好 mongo
docker pull mongo
直接下载官方latest版本就OK
-----------------------------------------------------------构建docker网络层------------------------------------------------------------
由于复制集合应该在docker中同属于一个网络层,所以我们先创建一个network,执行命令
docker network create mongo-cluster
查看网络层
docker network ls
如图所示:
-----------------------------------------------------------docker-compose构建-------------------------------------------------------
现在创建文件 docker-compose.yml
mongo-replica-1-1: image: 'mongo' net: 'mongo-cluster' ports: - '30001:27017' volumes: - '/root/mondodb-cluster/replica-1-1-data:/data/db' command: mongod --replSet mongo-repliset
mongo-replica-1-2: image: 'mongo' net: 'mongo-cluster' ports: - '30002:27017' command: mongod --replSet mongo-repliset
mongo-replica-1-3: image: 'mongo' net: 'mongo-cluster' ports: - '30003:27017' command: mongod --replSet mongo-repliset
注意复制节点是不需要挂载的,执行构建命令
docker-compose up -d docker-compose ps
可以看到:
三个mongo实例已经运行起来了
-----------------------------------------------------------添加配置信息-----------------------------------------------------------------
OK 实例已经建立,现在我们让mongo1成为primary
执行命令:
docker-compose exec mongo-replica-1-1 mongo
进入mongo1的mongod的shell控制台
config = { "_id" : "mongo-repliset", "members" : [ { "_id" : 0, "host" : "mondodbcluster_mongo-replica-1-1_1:27017" }, { "_id" : 1, "host" : "mondodbcluster_mongo-replica-1-2_1:27017" }, { "_id" : 2, "host" : "mondodbcluster_mongo-replica-1-3_1:27017" } ] }
注意哦,host是指在docker ps 下原本的container 名字,config 中第一个 key "_id" 的值 "mongo-repliset" 就是 启动容器时 --replSet 参数的值,"members" 指定了复制集成员的信息 ,继续执行命令
rs.initiate(config)
返回{"ok":1},则成功了,多敲几次回车键你会发现shell变为
ok,mongo1已经变为主节点了,写数据必须使用本节点
-----------------------------------------------------------验证复制集------------------------------------------------------------
好使用mongoBooster创建三个mongo的连接
ok,都连接成功
我们创建testDB及collection,最后插入几条数据,可以看到3个数据库均有数据
OK到此,数据一致性一验证成功
最后我们模拟当有一个节点,比如primary节点爆炸了的情况
docker-compose stop mongo-replica-1-1
现在进入mongo2容器
docker-compose exec mongo-replica-1-2 mongo
你可以在shell上看到mongo2变为primary,此节点变为了主节点,图就不截了。
至此你已经成功构建了一个mongodb副本集
但是到mongo集群还有很多东西需要处理,config集,路由集等等。博主也在学习。