MongoDB副本集模式部署
主要参考文件
【MongoDB】docker部署mongdb多机集群(跨主机副本集)_docker mongodb集群-CSDN博客
一、网络配置
前置操作
主master | 从slave1 | 从slave2 |
hostname master-host; bash; | hostname slave1-host; bash; | hostname slave2-host; bash; |
三台主机下
vi /etc/hosts
192.168.247.128 master-host
192.168.247.129 slave1-host
192.168.247.130 slave2-host
二、拉取mongo最新版本镜像
docker pull mongo:latest
三、创建配置文件目录进行映射
mkdir /docker/mongo/data/mongo_replication
mkdir /docker/mongo/conf
mkdir /docker/mongo/data/mongo_replication/data
四、创建密钥文件(其他节点进行远程复制)
openssl rand -base64 741 > mongodb-keyfile;
下载后,上传相同密钥文件到其他虚拟机的相同文件目录下
五、修改文件权限
chmod 400 mongodb-keyfile;
chown polkitd mongodb-keyfile;
六、容器创建
docker run --network host --name mongo-master
-v /docker/mongo/data/mongo_replication/data:/data/db \
-v /docker/mongo/data/mongo_replication:/opt/keyfile --hostname="master-host" \
-p 27017:27017 -d mongo \
# 进入容器进行用户创建
docker exec -it mongo-master mongosh admin
七、用户创建
# 创建用户
db.createUser({user:"UserAdmin", pwd:"user_123456", roles:[{role:"userAdminAnyDatabase", db: "admin"}]});
# 创建管理员用户
db.createUser({user:"RootAdmin", pwd:"root_123456", roles:[{role:"root", db: "admin"}]});
八、删除容器
docker stop mongo-master;
docker rm mongo-master;
=========================== 副本集 ========================
九、利用密钥文件重新启动容器
(1)主节点:
docker run --network host --name mongo-master0 -v /docker/mongo/data/mongo_replication/data:/data/db \
-v /docker/mongo/data/mongo_replication:/opt/keyfile --hostname="master-host" \
--add-host master-host:192.168.247.128 \
--add-host slave1-host:192.168.247.129 \
--add-host slave2-host:192.168.247.130 \
-p 27017:27017 -d mongo \
--keyFile /opt/keyfile/mongodb-keyfile --replSet "rs0"
(2)副节点
docker run --network host --name mongo-slave01 -v /docker/mongo/data/mongo_replication/data:/data/db \
-v /docker/mongo/data/mongo_replication:/opt/keyfile --hostname="slave1-host" \
-v /docker/mongo/data/mongo_replication/mongodb-keyfile:/opt/keyfile/mongodb-keyfile \
--add-host master-host:192.168.247.128 \
--add-host slave1-host:192.168.247.129 \
--add-host slave2-host:192.168.247.130 \
-p 27017:27017 -d mongo \
--keyFile /opt/keyfile/mongodb-keyfile --replSet "rs0"
(3)仲裁节点
docker run --network host --name mongo-slave02 -v /docker/mongo/data/mongo_replication/data:/data/db \
-v /docker/mongo/data/mongo_replication:/opt/keyfile --hostname="slave2-host" \
-v /docker/mongo/data/mongo_replication/mongodb-keyfile:/opt/keyfile/mongodb-keyfile \
--add-host master-host:192.168.247.128 \
--add-host slave1-host:192.168.247.129 \
--add-host slave2-host:192.168.247.130 \
-p 27017:27017 -d mongo \
--keyFile /opt/keyfile/mongodb-keyfile --replSet "rs0"
十、主节点初始化副本集
# 进入容器进行用户创建
docker exec -it mongo-master0 mongosh admin
db.auth("RootAdmin", "root_123456"); # 登录用户
config = {
"_id" : "rs0",
"members" : [
{
"_id" : 0,
"host" : "master-host:27017",
"priority" : 2
},
{
"_id" : 1,
"host" : "slave1-host:27017",
"priority" : 1
},
{
"_id" : 2,
"host" : "slave2-host:27017",
"arbiterOnly" : true
}
]
}
rs.initiate(config)
副节点添加
rs.add({ "_id" : 1,host: "slave1-host:27017", priority: 1, votes: 0 })
仲裁节点添加
rs.addArb("slave2-host:27017")
十一、验证查看副本集状态
rs.status()
可看到主机名称和分配角色name,stateStr
十二、测试主从同步
进入其他容器
docker exec -it mongo-slave1 mongosh admin
docker exec -it mongo-slave2 mongosh admin
(1)主节点插入
use test-db
db.createCollection("test-collection");
db.test.insertOne({"name" : "xuban"})
db.test.find()
(2)从节点同步
# 登录用户
db.auth("RootAdmin", "root_123456");
use test-db
#默认不允许从从节点读取数据,需要做一个配置才可以读取
rs.secondaryOk()
db.test.find()
附(常见问题解决):容器启动失败解决:
-
1、 Error: Unable to acquire security key[s]:
执行:chown polkitd mongodb-keyfile;
将密钥文件所有者改为与mongo的数据存储文件夹相同
执行:chmod 400 mongodb-keyfile;
权限改为可读
2、强制修改配置(配置发现有误时)
rs.reconfig(restConfig,{force:true})
rs.status()
查看