集群搭建
key生成
- MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集。
- keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。
- 有一点要注意是的:在UNIX系统中,keyFile必须没有组权限或完全权限(也就是权限要设置成X00的形式)。Windows系统中,keyFile权限没有被检查。
可以使用任意方法生成keyFile。例如,如下操作使用openssl生成复杂的随机的1024个字符串。然后使用chmod修改文件权限,只给文件拥有者提供读权限。
# 400权限是要保证安全性,否则mongod启动会报错
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key
docker-compose
version: '3.3'
services:
mongodb1:
image: mongo:4.4
volumes:
- ./mongo1:/data/db
- ./mongodb.key:/data/mongodb.key
user: root
environment:
- MONGO_INITDB_ROOT_USERNAME=intbee
- MONGO_INITDB_ROOT_PASSWORD=mongoPass
- MONGO_INITDB_DATABASE=intbee
container_name: mongodb1
ports:
- 37017:27017
command: mongod --replSet mongos --keyFile /data/mongodb.key
restart: always
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
mongodb2:
image: mongo:4.4
volumes:
- ./mongo2:/data/db
- ./mongodb.key:/data/mongodb.key
user: root
environment:
- MONGO_INITDB_ROOT_USERNAME=intbee
- MONGO_INITDB_ROOT_PASSWORD=mongoPass
- MONGO_INITDB_DATABASE=intbee
container_name: mongodb2
ports:
- 37018:27017
command: mongod --replSet mongos --keyFile /data/mongodb.key
restart: always
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
mongodb3:
image: mongo:4.4
volumes:
- ./mongo3:/data/db
- ./mongodb.key:/data/mongodb.key
user: root
environment:
- MONGO_INITDB_ROOT_USERNAME=intbee
- MONGO_INITDB_ROOT_PASSWORD=mongoPass
- MONGO_INITDB_DATABASE=intbee
container_name: mongodb3
ports:
- 37019:27017
command: mongod --replSet mongos --keyFile /data/mongodb.key
restart: always
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
mongodb-init:
image: mongo:4.4
depends_on:
- mongodb1
- mongodb2
- mongodb3
restart: on-failure:3
command:
- mongo
- mongodb://intbee:mongoPass@10.0.2.69:37017/admin
- --eval
- 'rs.initiate({ _id: "mongos", members: [{_id:1,host:"10.0.2.69:37017"},{_id:2,host:"10.0.2.69:37018"},{_id:3,host:"10.0.2.69:37019"}]})'
说明:
chown 999:999 /data/mongodb.key
999用户是容器中的mongod用户,通过chown修改文件用户权限
启动集群
# 集群启动
docker-compose -f docker-compose-set.yml up -d
# 进入任一容器
docker exec -it mongodb1 /bin/bash
# 登录
mongo -u intbee -p mongoPass
# 查看状态
rs.status()
# 初始化集群
rs.initiate({_id: "mongos",
members: [
{ _id : 0, host : "10.0.2.69:37017" },
{ _id : 1, host : "10.0.2.69:37018" },
{ _id : 2, host : "10.0.2.69:37019" }
]
});
集群管理
节点管理
必须在PRIMARY节点上执行
rs.remove("10.0.2.69:37018") #移除members
rs.reconfig()
rs.add({priority:0,votes:0,host:"10.0.2.69:37018"}) #添加members
rs.reconfig()
数据备份与导入
必须开启ReplicaSet模式进行导入,否则子节点无法同步
mongodump -h 192.168.56.201:37018 -u intbee -p mongoPass -o /backup/mongo
# Primary节点
mongorestore -h 192.168.56.201:37017 -u intbee -p mongoPass /backup/mongo
# 相关参数:--drop --numParallelCollections=8 --numInsertionWorkersPerCollection=5000 --noIndexRestore
关键参数
writeConcern
{ w:
, j: , wtimeout: } w:2 表示至少写入 2 个节点才返回。wtimeout 表示超时时间,还有一个参加 j 可以设置 true,false 表示是否是写入日志才返回