Mongodb 实战:使用 Docker 搭建 mongodb 集群

3,776 阅读2分钟

写在前面

看完本文你将收获什么?

  • Docker 网桥搭建
  • 基于 Docker 搭建 mongodb 集群

本文搭建环境:

  • 操作系统 MacOs ( 10.14.5)
  • Docker
  • Mongo 镜像(版本 4.4.3

注意事项:

  1. 了解 Docker 的网络驱动模式,后面涉及容器间的通讯;
  2. 注意当前系统用户对数据库文件的操作权限;

开始

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" : "西红柿" }

如上,数据已从主节点同步到从节点啦!

总结

以上是本机模拟集群搭建教程,集群详细操作及其配置不是本文重点。过程中肯定会遇到各种问。因为它需要集成各种适配的环境,一个环境出错,就要折腾半天。耐心学习吧!