Mongodb 实战:使用 Docker 搭建 mongodb 集群
写在前面
看完本文你将收获什么?
- Docker 网桥搭建
- 基于 Docker 搭建 mongodb 集群
本文搭建环境:
- 操作系统
MacOs
(10.14.5
) Docker
Mongo
镜像(版本4.4.3
)
注意事项:
- 了解 Docker 的网络驱动模式,后面涉及容器间的通讯;
- 注意当前系统用户对数据库文件的操作权限;
开始
Step1: 启动一个 docker bridge
使用 Docker 创建一个 network bridge
docker network create test-net
Step2: 启动三个 docker 容器
创建三个 mongdb 服务,一主俩从(采用 docker-compose
更加便捷,这里不做介绍,为啥?因为我还没用过~,回头我试试)
$ docker run --rm --network test-net --name mongo1 -d -v /data/mongo1/db:/data/db -p 27021:27017 mongo:latest --replSet replSet1
$ docker run --rm --network test-net --name mongo2 -d -v /data/mongo2/db:/data/db -p 27022:27017 mongo:latest --replSet replSet1
$ docker run --rm --network test-net --name mongo3 -d -v /data/mongo3/db:/data/db -p 27023:27017 mongo:latest --replSet replSet1
说明:
-v
参数:将 docker 容器内部 /data/db 目录挂载在宿主机 /data/mongo4/db 目录,防止容器重启时,数据丢失
--network
: 将 docker 容器划入 test-net 网桥;
--replSet
: 命名副本集名称为 replSet1;
Step3
3-1 .进入 mongo1 客户端
$ docker exec -it mongo1 mongo
3-2 .启动一个副本集(即采用 mongo1 作为主节点)
$ rs.initiate()
3-3 .为副本集添加新成员 mongo2
$ rs.add('mongo2:27017')
注意: 由于本篇采用的是
Docker
启动的 mongondb 服务, 在这里需要了解 Docker 容器之间通讯模式,前文也提醒大家了,因为目前我们启动的三个 mongo 服务是在同一个 bridge (test-net), 这个 bridge 是我们自定义的。换句话说,如果前文我们启动容器不指定--network test-net
,采用Docker
默认的 bridge, 那么使用rs.add('mongo2:27017')
添加新成员,响应就会超时。这一点本人在里面折腾挺长时间,网上类似文章都没有说明,也许他们以为我懂~,知识的诅咒!
3-4 .为副本集添加新成员 mongo3
$ rs.add('mongo3:27017')
3-4 .查看副本集状态
$ rs.status()
"members" : [
{
"_id" : 0,
"name" : "132895066d71:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
...
},
{
"_id" : 1,
"name" : "mongo2:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 195,
...
},
{
"_id" : 2,
"name" : "mongo3:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
...
}
],
这个时候集群已经创建好啦,一个主节点(mongo1),两个从节点(🇲mongo2, mongo3),接下来我们验证一下!
Step4 验证集群运作
在主节点 mongo1 添加一条数据:
replSet1:PRIMARY> db.foods.insert({"name":"西红柿"})
WriteResult({ "nInserted" : 1 })
在从节点 mongo2 mongo3 查看数据是否同步:
replSet1:SECONDARY> rs.secondaryOk() // 先允许读取操作在从节点执行
replSet1:SECONDARY> db.foods.find()
{ "_id" : ObjectId("605ca97350221c02825ceaa7"), "name" : "西红柿" }
如上,数据已从主节点同步到从节点啦!
总结
以上是本机模拟集群搭建教程,集群详细操作及其配置不是本文重点。过程中肯定会遇到各种问。因为它需要集成各种适配的环境,一个环境出错,就要折腾半天。耐心学习吧!
转载自:https://juejin.cn/post/6953636274389385246