docker 配置MONGO replica set 复制集和问题解决

1、 docker pull mongo:4.0

2、docker  主机上运行

docker run --name mongo1 -p 27018:27017  -v /mongo/db1:/data/db  -d  docker.io/mongo  --replSet "rs0"

docker run --name mongo2 -p 27019:27017  -v /mongo/db2:/data/db -d  docker.io/mongo  --replSet "rs0"

docker run --name mongo3 -p 27020:27017  -v /mongo/db3:/data/db -d  docker.io/mongo --replSet "rs0"

切记:

docker run --name mongo3 -p 27020:27017  -v /mongo/db:/data/db3 -d  docker.io/mongo  --auth --replSet "rs0"

要去掉 --auth

3、进入容器:

     docker exec -it mongo1 mongo

 

4、使用命令初始化复制集:

rs.initiate( { _id : "rs0", members: [ { _id: 0, host: "172.17.0.9:27017" }, { _id: 1, host: "172.17.0.8:27017" },{

_id: 2, host: "172.17.0.7:27017" }]})

 

 

遇到的问题1:

myclient=pymongo.MongoClient(host='mongodb://10.10.10.248:27020,10.10.10.248:27019,10.10.10.248:27018/?replicaSet=rs0')

外部应用主机连接不上复制集

 

报错:

pymongo.errors.ServerSelectionTimeoutError: 172.17.0.8:27017: timed out,172.17.0.9:27017: timed out,172.17.0.7:27017: timed out

 

 

尝试使用以下串 连接复制集的rs0:PRIMARY 没有问题,可以正常连接

myclient=pymongo.MongoClient(host='10.10.10.248',port=27020) #type:pymongo.MongoClient

 

 

 

错误原因分析如下:

1、因为之前初始化时  rs.initiate    使用的主机IP和端口为容器的  host: "172.17.0.7:27017" ,这个信息被 mongo复制集的配置文件记录下来了

rs.status():

    "members" : [

                {

                        "_id" : 0,

                        "name" : "172.17.0.9:27017",

                        "health" : 1,

                        "state" : 1,

                        "stateStr" : "PRIMARY",

                        "uptime" : 5054,

                        "optime" : {

                                "ts" : Timestamp(1548754356, 1),

                                "t" : NumberLong(1)

                        },

                        "optimeDate" : ISODate("2019-01-29T09:32:36Z"),

                        "syncingTo" : "",

                        "syncSourceHost" : "",

                        "syncSourceId" : -1,

                        "infoMessage" : "",

                        "electionTime" : Timestamp(1548751375, 1),

                        "electionDate" : ISODate("2019-01-29T08:42:55Z"),

                        "configVersion" : 1,

                        "self" : true,

                        "lastHeartbeatMessage" : ""

                },

                {

                        "_id" : 1,

                        "name" : "172.17.0.8:27017",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" : "SECONDARY",

                        "uptime" : 3001,

                        "optime" : {

                                "ts" : Timestamp(1548754356, 1),

                                "t" : NumberLong(1)

                        },

                        "optimeDurable" : {

                                "ts" : Timestamp(1548754356, 1),

                                "t" : NumberLong(1)

                        },

                        "optimeDate" : ISODate("2019-01-29T09:32:36Z"),

                        "optimeDurableDate" : ISODate("2019-01-29T09:32:36Z"),

                        "lastHeartbeat" : ISODate("2019-01-29T09:32:45.069Z"),

                        "lastHeartbeatRecv" : ISODate("2019-01-29T09:32:45.283Z"),

                        "pingMs" : NumberLong(0),

                        "lastHeartbeatMessage" : "",

                        "syncingTo" : "172.17.0.9:27017",

                        "syncSourceHost" : "172.17.0.9:27017",

                        "syncSourceId" : 0,

                        "infoMessage" : "",

                        "configVersion" : 1

                },

                {

                        "_id" : 2,

                        "name" : "172.17.0.7:27017",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" : "SECONDARY",

                        "uptime" : 3001,

                        "optime" : {

                                "ts" : Timestamp(1548754356, 1),

                                "t" : NumberLong(1)

                        },

                        "optimeDurable" : {

                                "ts" : Timestamp(1548754356, 1),

                                "t" : NumberLong(1)

                        },

                        "optimeDate" : ISODate("2019-01-29T09:32:36Z"),

                        "optimeDurableDate" : ISODate("2019-01-29T09:32:36Z"),

                        "lastHeartbeat" : ISODate("2019-01-29T09:32:45.070Z"),

                        "lastHeartbeatRecv" : ISODate("2019-01-29T09:32:45.283Z"),

                        "pingMs" : NumberLong(0),

                        "lastHeartbeatMessage" : "",

                        "syncingTo" : "172.17.0.9:27017",

                        "syncSourceHost" : "172.17.0.9:27017",

                        "syncSourceId" : 0,

                        "infoMessage" : "",

                        "configVersion" : 1


                }

 

 

2、应用服务器使用 以下串连接复制集 myclient=pymongo.MongoClient(host='mongodb://10.10.10.248:27020,10.10.10.248:27019,10.10.10.248:27018/?replicaSet=rs0')

外部应用服务器通过DOCKER主机的映射端口去连接复制集时,读了mongo复制集记录的容器IP加端口:"172.17.0.7:27017" ,这个容器的IP和端口是应用服务器无法访问的,所以报错了

 

 

 

如何解决呢?

 

1、如果你的应用主机刚好也是同一个DOCKER主机上的容器,且配置了同网络的IP,比如:,这个172.17.0.10 ,你可以通过

myclient=pymongo.MongoClient(host='mongodb://172.17.0.7:27017,172.17.0.8:27018,172.17.0.9:27017/?replicaSet=rs0')

访问,没有问题

如果,应用服务器不在同一个DOCKER主机上,则会报上面的错误

 

2、初步尝试使用 外部映射的端口初始化

    rs.initiate( { _id : "rs0", members: [ { _id: 0, host: "10.10.10.248:27018" }, { _id: 1, host: " 10.10.10.248:27019" },{ _id: 2, host: " 10.10.10.248:27020" } ] })

 

报错,因为容器无法通过外部映射的端口访问到 另外两个容器。

容器1 172.17.0.7无法通过 10.10.10.248:27018 这个外部IP+带端口访问到 容器2: 172.17.0.8 这个主机的,只能通过172.17.0.8 这个容器IP访问

 

关于容器网络教程请参考:

https://www.cnblogs.com/CloudMan6/p/7053617.html

 

3、知道问题的原因,则需要解决外部网络都可以直接访问 容器的网段 172.17.0.0/255.255.255.0 就可以了

 

举例:

    docker主机的IP为 10.10.10.248

    docker主机是可以直接PING通 docker容器的IP :172.17.0.7 ,172.17.0.8  ,172.17.0.9 

    如果 应用主机10.10.10.16 需要同样访问这三台容器,那么需要添加路由:

    route add -net 172.17.0.0 netmask 255.255.255.0 gw 10.10.10.248

    

    如果其它网段的应用主机 192.168.1.2 需要同样访问这三台容器,需要在路由器上配置路由:

    以华为的路由器为例:

    ip route-static 172.17.0.0 255.255.255.0 10.10.10.248

 

配置完路由后:

    就可以直接使用

    myclient=pymongo.MongoClient(host='mongodb://172.17.0.7:27017,172.17.0.8:27018,172.17.0.9:27017/?replicaSet=rs0')

    连接上复制集了

 

二、还有一个问题,就是docker容器的IP 172.17.0.7 这个IP 每次容器启动,自动分配的。这会导致一个问题,就是RS复制集记录了这个拓补的结构。一但这个IP变了,会复制集找不到成员

这个问题,就是解决 docker 网络配置的问题

可参考教程:https://www.cnblogs.com/CloudMan6/p/7077198.html

我的配置方式如下:

1、首先建立DOCKER网络,并指定网段

docker network create --driver bridge --subnet 172.22.0.0/24 --gateway 172.22.0.1 mongodb_net

2、验证网络配置如下:

docker network inspect mongodb_net

3、运行主机修改为指定IP:

docker run --name mongo1 -p 27018:27017 --network=mongodb_net --ip 172.22.0.8  -v /mongo/db1:/data/db  -d  docker.io/mongo  --replSet "rs0"

docker run --name mongo2 -p 27019:27017 --network=mongodb_net --ip 172.22.0.9  -v /mongo/db2:/data/db -d  docker.io/mongo  --replSet "rs0"

docker run --name mongo3 -p 27020:27017  --network=mongodb_net --ip 172.22.0.10  -v /mongo/db3:/data/db -d  docker.io/mongo --replSet "rs0"

3、添加路由:

rs.initiate( { _id : "rs0", members: [ { _id: 0, host: "172.22.0.8:27017" }, { _id: 1, host: "172.22.0.9:27017" },{

_id: 2, host: "172.22.0.10:27017" }]})

4、添加路由:

 route add -net 172.22.0.0 netmask 255.255.255.0 gw 10.10.10.248

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值