docker-compose 部署mongo副本集集群,主从仲裁
1.生成keyFile文件
-
MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集。
-
keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。
-
有一点要注意是的:在UNIX系统中,keyFile必须没有组权限或完全权限(也就是权限要设置成X00的形式)。Windows系统中,keyFile权限没有被检查。
-
可以使用任意方法生成keyFile。例如,使用openssl生成复杂的随机的1024个字符串。然后使用chmod修改文件权限,只给文件拥有者提供读权限。
在部署目录中,新建conf文件夹,然后执行以下指令,使用openssl进行生成随机字符串,存入mongodb.key文件
# 400权限是要保证安全性,否则mongod启动会报错 # 存放目录随意,只要对应yaml文件中的地址即可。 openssl rand -base64 756 > mongodb.key chmod 400 mongodb.key
2.docker-compose.yml文件
version: "3"
services:
#主节点
mongodb0:
image: mongo:4.0.20
container_name: mongo0
restart: always
ports:
- 27017:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=meiyoumima2021
command: mongod --replSet rs0 --keyFile /mongodb.key
volumes:
- ./runtime/mongodb0/data:/data/db
- ./runtime/mongodb0/data/configdb:/data/configdb
- ./conf/mongodb.key:/mongodb.key
networks:
- mongo-network
entrypoint:
- bash
- -c
- |
chmod 400 /mongodb.key
chown 999:999 /mongodb.key
exec docker-entrypoint.sh $$@
#副节点
mongodb1:
image: mongo:4.0.20
container_name: mongo1
restart: always
ports:
- 27018:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=meiyoumima2021
command: mongod --replSet rs0 --keyFile /mongodb.key
volumes:
- ./runtime/mongodb1/data:/data/db
- ./runtime/mongodb1/data/configdb:/data/configdb
- ./conf/mongodb.key:/mongodb.key
networks:
- mongo-network
entrypoint:
- bash
- -c
- |
chmod 400 /mongodb.key
chown 999:999 /mongodb.key
exec docker-entrypoint.sh $$@
#仲裁节点
mongodb2:
image: mongo:4.0.20
container_name: mongo2
restart: always
ports:
- 27019:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=meiyoumima2021
command: mongod --replSet rs0 --keyFile /mongodb.key
volumes:
- ./runtime/mongodb2/data:/data/db
- ./runtime//mongodb2/data/configdb:/data/configdb
- ./conf/mongodb.key:/mongodb.key
networks:
- mongo-network
entrypoint:
- bash
- -c
- |
chmod 400 /mongodb.key
chown 999:999 /mongodb.key
exec docker-entrypoint.sh $$@
networks:
mongo-network:
external: false
注:
chown 999:999 /mongodb.key:999用户是容器中的mongod用户,通过chown修改文件用户权限
mongod --replSet rs0 --keyFile /mongodb.key 启动命令,--replSet rs0 以副本集形式启动并将副本集名字命名为 rs0
--keyFile /mongodb.key 设置keyFile,用于副本集通信,文件通过 volumes 映射到容器内
# 选择第一个容器mongo0,进入mongo 容器 docker exec -it mongo0 bash # 登录mongo mongo -u root -p root
或者通过以下方式进入Mongo容器链接Mongo
docker exec -it mongo0 mongo
通过以下指令配置mongo副本集集群
# 认证 use admin db.auth('root', 'meiyoumima2021')
成功返回1,失败返回0
初始化副本集:
rs.initiate()
无参初始化后,当前节点默认是PRIMARY
节点
添加节点:
# 副节点 rs.add('mongo1:27017') # 仲裁节点 rs.add('mongo2:27017', true)
查看副本集配置信息:
rs.conf()
查看副本集运行状态:
rs.status()
增长mongo0
的权重:
cfg = rs.conf() # 修改权重 cfg.members[0].priority=5 # 从新配置 rs.reconfig(cfg)
仲裁节点的权重默认为 0,其它节点默认为 1。调高mongo0节点的权重后,若是mongo0宕机,mongo1会成为新主节点,当mongo0恢复后会重新成为主节点。
切换节点查看同步状态:
rs.printReplicationInfo()
仅当建立了集合后副节点才会进行同步。