1.Docker部署MongoDB副本集
1.1 创建docker桥接网络(非必须)
sudo docker network create mongo-rs
1.2 启动3个MongoDB实例,注意要指定上一步创建的桥接网络 (非必须)
sudo docker run --name mongo1 --net mongo-rs -p 27011:27017 -v /data/db/mongo1:/data/db -d mongo:4.0.4 --replSet "rs0"
sudo docker run --name mongo2 --net mongo-rs -p 27012:27017 -v /data/db/mongo2:/data/db -d mongo:4.0.4 --replSet "rs0"
sudo docker run --name mongo3 --net mongo-rs -p 27013:27017 -v /data/db/mongo3:/data/db -d mongo:4.0.4 --replSet "rs0"
更多参数说明参考docker hub
1.3 通过docker进入其中一个容器
sudo docker exec -it mongo1 /bin/bash
1.4 然后使用容器中的mongo客户端连接MongoDB服务,再执行副本集初始化命令
rs.initiate({
_id:"rs0",
members:[
{_id:1,host:"mongo1:27017"},
{_id:2,host:"mongo2:27017"},
{_id:3,host:"mongo3:27017"}
]
})
如果副本集希望给宿主机外部环境使用,请使用宿主机ip及相应实例的映射端口作为host,如:
rs.initiate({
_id:"rs0",
members:[
{_id:1,host:"172.18.20.35:27011"},
{_id:2,host:"172.18.20.35:27012"},
{_id:3,host:"172.18.20.35:27013"}
]
})
1.5 初始化成功以后,会显示以下结果
{
"ok" : 1,
"operationTime" : Timestamp(1541000706, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1541000706, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
这一步完成以后,MongoDB副本集就完成初始化了。另外,命令行提示也变成了rs0:SECONDARY>
。
特别需要注意的是SECONDARY节点默认情况下不能读写,每次连接到SECONDARY节点都需要设定slaveOk为true。
rs0:SECONDARY> rs.slaveOk()
rs0:SECONDARY> rs.slaveOk()
rs0:PRIMARY>
不过最新版的MongoDB中已经不需要这么操作了,rs.slaveOk()也已经废弃了,直接退出重新进入,就是PRIMARY。
副本集初始化完成以后,可以使用rs.conf()
查看配置,rs.status()
查看状态。
更多的副本集相关命令可以通过rs.help()
查看。
2.MongoDB副本集配置安全认证
以上操作部署的副本集,并没有启用安全认证,还是存在比较大的风险。
2.1 设置管理员账号
rs:PRIMARY> use admin
switched to db admin
rs:PRIMARY> db.createUser({user:"admin",pwd:"123456",roles:["userAdminAnyDatabase"]})
Successfully added user: { "user" : "admin", "roles" : [ "userAdminAnyDatabase" ] }
rs:PRIMARY> show users
{
"_id" : "admin.admin",
"userId" : UUID("cb06641e-265e-472a-9752-6050d39bf6d7"),
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
2.2 准备security.keyFile
sudo openssl rand -base64 128 > mongo.key & sudo cp mongo.key /data/configdb/
2.3 准备配置文件
net:
port: 27017
bindIp: 0.0.0.0
systemLog:
logAppend: true
security:
keyFile: "/data/configdb/mongo.key"
authorization: enabled
replication:
replSetName: "rs"
2.4 重新运行新的容器
停止并移除原来的mongo容器,保留数据库文件
docker run --name mongo -p 27011:27017 -v /data/configdb:/data/configdb -v /data/db/mongo:/data/db -d mongo:4.4.4 --config /data/configdb/mongod.conf
2.5 进入容器设置其他用户账号
docker exec -it mongo bash
mongo -u admin -p 123456 --authenticationDatabase "admin"
rs:PRIMARY> use some-db
switched to db some-db
rs:PRIMARY> db.createUser({user: "app", pwd: "secret", roles: ["readWrite"]})
Successfully added user: { "user" : "app", "roles" : [ "readWrite" ] }
这一步切换到some-db这个数据库下,并且创建了一个具有“readWrite”角色的用户“app”,后续如果想对some-db进行常规的读写操作,就可以使用app这个用户了。
需要注意的是一定要指定认证的数据库
mongo 192.168.1.100:27011 -u app -p secret --authenticationDatabase "some-db"