准备工作:
docker安装(如果需要,参考https://blog.csdn.net/nickDaDa/article/details/92816938)
拉取镜像(这里使用3.6版本测试)
sudo docker pull mongo:3.6
创建宿主机数据挂载目录 /data/mongo0 /data/mongo1 /data/mongo2
安装:
sudo docker run --name mongo0 -p 27017:27017 -v /data/mongo0/:/data/db/ -d mongo:3.6 --replSet "mongoRs" --bind_ip_all
sudo docker run --name mongo1 -p 37017:27017 -v /data/mongo1/:/data/db/ -d mongo:3.6 --replSet "mongoRs" --bind_ip_all
sudo docker run --name mongo2 -p 47017:27017 -v /data/mongo2/:/data/db/ -d mongo:3.6 --replSet "mongoRs" --bind_ip_all
sudo docker exec -it mongo0 /bin/bash 。进入到mongo0的容器内部
执行 mongo 。 连接到mongodb
执行:rs.initiate({
_id : "mongoRs",
members: [
{ _id: 0, host: "10.0.0.5:27017" },
{ _id: 1, host: "10.0.0.6:37017" },
{ _id: 2, host: "10.0.0.7:47017" }
]
});
返回OK即可,间隔10s,执行rs.status(); 可以看到集群关系
连接:
以nodejs为例,其它语言同理:
var dbclient;
var db;
// mongo config
var cfg = {
"dbconn": "mongodb://宿主机IP:27017,宿主机IP:37017,宿主机IP:47017",
"dbname": "db-name",
"rsconf": {
replicaSet: 'mongoRs',
poolSize: 5,
autoReconnect: true,
useNewUrlParser: true
}
}
// connect
async function SetupConnection() {
try {
dbclient = await mongo.MongoClient.connect(cfg["dbconn"], cfg["rsconf"]);
db = dbclient.db(cfg["dbname"]);
} catch (error) {
console.log(`Connect to mongodb error for ${error.message}`);
}
}
测试:
- 程序连接成功之后,写入一条数据
- 以docker exec -it mongo0/1/2 /bin/bash 的方式分别进入三个容器,执行mongo命令连接之后查看,数据如果已经同步,则表示成功
- 如果在slave节点报错,不能查看,执行 rs.slaveOk(); 即可查看