集群搭建
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.keychmod 400 mongodb.key
docker-compose
version: '3.3'services:mongodb1:image: mongo:4.4volumes:- ./mongo1:/data/db- ./mongodb.key:/data/mongodb.keyuser: rootenvironment:- MONGO_INITDB_ROOT_USERNAME=intbee- MONGO_INITDB_ROOT_PASSWORD=mongoPass- MONGO_INITDB_DATABASE=intbeecontainer_name: mongodb1ports:- 37017:27017command: mongod --replSet mongos --keyFile /data/mongodb.keyrestart: alwaysentrypoint:- bash- -c- |chmod 400 /data/mongodb.keychown 999:999 /data/mongodb.keyexec docker-entrypoint.sh $$@mongodb2:image: mongo:4.4volumes:- ./mongo2:/data/db- ./mongodb.key:/data/mongodb.keyuser: rootenvironment:- MONGO_INITDB_ROOT_USERNAME=intbee- MONGO_INITDB_ROOT_PASSWORD=mongoPass- MONGO_INITDB_DATABASE=intbeecontainer_name: mongodb2ports:- 37018:27017command: mongod --replSet mongos --keyFile /data/mongodb.keyrestart: alwaysentrypoint:- bash- -c- |chmod 400 /data/mongodb.keychown 999:999 /data/mongodb.keyexec docker-entrypoint.sh $$@mongodb3:image: mongo:4.4volumes:- ./mongo3:/data/db- ./mongodb.key:/data/mongodb.keyuser: rootenvironment:- MONGO_INITDB_ROOT_USERNAME=intbee- MONGO_INITDB_ROOT_PASSWORD=mongoPass- MONGO_INITDB_DATABASE=intbeecontainer_name: mongodb3ports:- 37019:27017command: mongod --replSet mongos --keyFile /data/mongodb.keyrestart: alwaysentrypoint:- bash- -c- |chmod 400 /data/mongodb.keychown 999:999 /data/mongodb.keyexec docker-entrypoint.sh $$@mongodb-init:image: mongo:4.4depends_on:- mongodb1- mongodb2- mongodb3restart: on-failure:3command:- 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.key999用户是容器中的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") #移除membersrs.reconfig()rs.add({priority:0,votes:0,host:"10.0.2.69:37018"}) #添加membersrs.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 表示是否是写入日志才返回
