在Docker中搭建mongodb副本集
拉取 Mongodb 镜像
docker pull mongo
创建要挂载的文件夹
mkdir -p mongodb-cluster/data/master
mkdir -p mongodb-cluster/data/secondary
mkdir -p mongodb-cluster/data/arbiter
创建 docker-compose.yaml 文件
vim docker-compose.yaml
# ----------------------- 内容开始 -------------------------
version: '2.1'
services:
master:
image: mongo
container_name: master
restart: always
ports:
- 27017:27017
volumes:
- ./data/master:/data/db
command: mongod --dbpath /data/db --replSet testSet --oplogSize 128
secondary:
image: mongo
container_name: secondary
restart: always
ports:
- 27018:27017
volumes:
- ./data/secondary:/data/db
command: mongod --dbpath /data/db --replSet testSet --oplogSize 128
arbiter:
image: mongo
container_name: arbiter
restart: always
ports:
- 27019:27017
volumes:
- ./data/arbiter:/data/db
command: mongod --replSet testSet --oplogSize 128
# ----------------------- 内容结束 -------------------------
# 运行 docker-compose.yaml 文件
docker-compose up -d
# 停止并删除由 docker-compose 创建出来的容器
# docker-compose down
配置副本集
# 进入 docker 容器内部
docker exec -it master mongo
# 初始化副本集
rs.initiate()
# 表示将secondary添加进副本集
rs.add('192.168.20.255:27018')
# 其中true表示这个节点是仲裁节点
rs.add('192.168.20.255:27019',true)
# 查看配置
rs.conf()
# 查看状态
rs.status()
# 如果想要修改副本集的配置,可以采用以下方法:下方该语句表示修改副本集配置中第一个成员的host。
conf=rs.conf()
conf.members[0].host="192.168.20.255:27017"
# 然后调用 reconfig() 函数,将修改好的副本集配置设置进去。
rs.reconfig(conf,{"force":true})
测试
-
在 secondary 节点输入命令 show databases,发现无法查看,查看报错信息发现:
"errmsg" : "not master and slaveOk=false"
-
当前从节点只是一个备份,不是奴隶节点,无法读取数据,写当然更不行。因为默认情况下,从节点是没有读写权限的,可以增加读的权限,但需要进行设置:
# 设置为奴隶节点,允许在从成员上运行读的操作 # rs.slaveOk(true) 按回车后发现警告 # WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead. # 翻译:警告:slaveOk()已被弃用,并可能在下一个主要版本中删除。 请改用secondaryOk()。所以这里用: rs.secondaryOk() # 再重新执行 show databases 发现从节点可以执行命令了。 # 取消该节点作为奴隶节点的读权限: rs.secondaryOk(false)