您的位置:首页 > 运维架构 > Docker

Docker Mongo数据库主从同步配置方法

2018-07-12 18:32 357 查看

 一、具体操作方法

1、启两个Mongo容器

docker run --name mongo1 -p 21117:27017 -d mongo --noprealloc --smallfiles --replSet rs1
docker run --name mongo2 -p 22117:27017 -d mongo --noprealloc --smallfiles --replSet rs1

 

也可以在启动容器的时候,自定义Mongo数据存放路径,且将mongo数据挂载到本地

docker run --name mongo_rs1 -v ~/test/mongo_sr1:/mongodb -p 21117:27017 -d mongo mongod --logpath /mongodb/mongo.log  --logappend --dbpath /mongodb --replSet rs1

docker run --name mongo_rs2 -v ~/test/mongo_sr2:/mongodb -p 22117:27017 -d mongo mongod --logpath /mongodb/mongo.log  --logappend --dbpath /mongodb --replSet rs1

 

 

2、查看正在运行的容器

docker ps | grep mongo

 

3、查看mongo1、mongo2容器ip

docker inspect mongo1 | grep IPA


 

4、使用本机(宿主机)mongo客户端连接到21117端口(即连接到mongo1容器)

mongo --port 21117

 

5、开始配置 复制集的成员信息

 

myconf = {"_id":"rs1","members":[{"_id":0,"host":"172.17.0.13:27017"},{"_id":1,"host":"172.17.0.14:27017"}]}

 

6、初始化同步复制集群

rs.initiate(myconf)

注意:在启动容器时,--replSet rs1 这个值mongo1和mongo2要保持一致,否则在初始化同步时,会出错。

 

7、查看当前复制集的节点信息

rs.isMaster()

 

 可以看出连接到的容器ip是172.17.0.13 也可以看见谁是主节点

 

查看状态

rs.status()

 查看配置

rs.conf()

 

 

8、另外在本地再开一个终端 连接到第二个容器 

mongo --port 22117

查看当前master

rs.isMaster()

可以看到主节点的信息 和上个容器的信息一致

 

rs.status()
{
"set" : "rs1",
"date" : ISODate("2018-07-07T01:53:14.330Z"),
"myState" : 2,
"term" : NumberLong(1),
"syncingTo" : "172.17.0.13:27017",
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1530928387, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1530928387, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1530928387, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1530928387, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "172.17.0.13:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 310,
"optime" : {
"ts" : Timestamp(1530928387, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1530928387, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-07-07T01:53:07Z"),
"optimeDurableDate" : ISODate("2018-07-07T01:53:07Z"),
"lastHeartbeat" : ISODate("2018-07-07T01:53:12.960Z"),
"lastHeartbeatRecv" : ISODate("2018-07-07T01:53:12.960Z"),
"pingMs" : NumberLong(0),
"electionTime" : Timestamp(1530928094, 1),
"electionDate" : ISODate("2018-07-07T01:48:14Z"),
"configVersion" : 1
},
{
"_id" : 1,
"name" : "172.17.0.14:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 366,
"optime" : {
"ts" : Timestamp(1530928387, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-07-07T01:53:07Z"),
"syncingTo" : "172.17.0.13:27017",
"configVersion" : 1,
"self" : true
}
],
"ok" : 1,
"operationTime" : Timestamp(1530928387, 1)
}

 

9、如果在从节点此时查看数据库会出错 ,信息显示不是主节点

show dbs;

 

设置从节点可以读

db.getMongo().setSlaveOk();

 或者用

rs.slaveOk()

 

10、在主节点mongo1中插入数据

show dbs;

use test;

db.user1.insert({"name":"mongodb is user1"})

db.user2.insert({"name":"mongodb is user2"})

 

11、在从节点mongo2中查看

show dbs;

use test;

show collections;

db.user1.find()

db.user2.find()

可以看到在mongo1插入的数据,同步到了mongo2数据库来了~

 

13、此时如果在mongo2从节点中插入数据

db.user3.insert({"name":"mongodb is user3"})

可以看到提示不是master主节点,无法写数据~

 

 

到此,就给大家介绍完了如何通过docker+mongo来实现主从同步的操作方法,喜欢的可以关注公众号哦~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: