在macOS下使用Docker搭建MongoDB分片副本集群

安装Docker

安装docker详情可以参与官方文档:https://docs.docker.com/install/

使用Docker启动单节点MongoDB

docker run --name mongo -it mongo mongo --host 172.17.0.1

查看运行状态:

docker ps

连接容器中的MongoDB:

docker run -it mongo:latest mongo --host 172.17.0.1

使用Docker搭建副本集和集群

使Docker搭建一个MongoDB集群:包含两组分片副本集,每个副本集一个主节点、一个从节点、一个仲裁节点。配置副本集包含三个节点,使用一个mongos路由(mongos_routing)。

#!/bin/sh
docker run --name rs1_container1 -p 27001:27018 -v ~/data/docker-mongo/db1:/data/db -d mongo:latest --shardsvr --replSet rs1 --port 27018 --bind_ip 0.0.0.0
docker run --name rs1_container2 -p 27002:27018 -v ~/data/docker-mongo/db2:/data/db -d mongo:latest --shardsvr --replSet rs1 --port 27018 --bind_ip 0.0.0.0
docker run --name rs1_container3 -p 27003:27018 -v ~/data/docker-mongo/db3:/data/db -d mongo:latest --shardsvr --replSet rs1 --port 27018 --bind_ip 0.0.0.0
docker run --name rs2_container1 -p 27004:27018 -v ~/data/docker-mongo/db4:/data/db -d mongo:latest --shardsvr --replSet rs2 --port 27018 --bind_ip 0.0.0.0
docker run --name rs2_container2 -p 27005:27018 -v ~/data/docker-mongo/db5:/data/db -d mongo:latest --shardsvr --replSet rs2 --port 27018 --bind_ip 0.0.0.0
docker run --name rs2_container3 -p 27006:27018 -v ~/data/docker-mongo/db6:/data/db -d mongo:latest --shardsvr --replSet rs2 --port 27018 --bind_ip 0.0.0.0
docker run --name config_container1 -p 27007:27018 -v ~/data/docker-mongo/db_config_1:/data/db -d mongo:latest --configsvr --dbpath /data/db --replSet rsc --port 27018 --bind_ip 0.0.0.0
docker run --name config_container2 -p 27008:27018 -v ~/data/docker-mongo/db_config_2:/data/db -d mongo:latest --configsvr --dbpath /data/db --replSet rsc --port 27018 --bind_ip 0.0.0.0
docker run --name config_container3 -p 27009:27018 -v ~/data/docker-mongo/db_config_3:/data/db -d mongo:latest --configsvr --dbpath /data/db --replSet rsc --port 27018 --bind_ip 0.0.0.0
docker run --name mongos_routing -p 27100:27018 -v ~/data/docker-mongo/db_mongos_1:/data/db -d mongo:latest mongos --port 27018 --configdb rsc/172.17.0.1:27007,172.17.0.1:27008,172.17.0.1:27008 --bind_ip 0.0.0.0

docker run 参数说明

-p 指定容器暴露的端口(本地端口:容器端口)
-v 给容器挂载存储卷,挂载到容器的某个目录(本地目录:容器目录)
-d 指定容器运行于前台还是后台
–name 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字

初始化副本集rs1

docker run -it mongo:latest mongo --host 172.17.0.1 --port 27001
> use admin
switched to db admin
> config = {_id:"rs1",members:[{_id:0,host:"172.17.0.1:27001"},{_id:1,host:"172.17.0.1:27002"},{_id:2,host:"172.17.0.1:27003",arbiterOnly:true}]}
{
	"_id" : "rs1",
	"members" : [
		{
			"_id" : 0,
			"host" : "172.17.0.1:27001"
		},
		{
			"_id" : 1,
			"host" : "172.17.0.1:27002"
		},
		{
			"_id" : 2,
			"host" : "172.17.0.1:27003",
			"arbiterOnly" : true
		}
	]
}
> rs.initiate(config)
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1585036570, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1585036570, 1)
}
rs1:SECONDARY> exit
bye

初始化副本集rs2

docker run -it mongo:latest mongo --host 172.17.0.1 --port 27004
> use admin
switched to db admin
> config = {_id:"rs2",members:[{_id:0,host:"172.17.0.1:27004"},{_id:1,host:"172.17.0.1:27005"},{_id:2,host:"172.17.0.1:27006",arbiterOnly:true}]}
{
	"_id" : "rs2",
	"members" : [
		{
			"_id" : 0,
			"host" : "172.17.0.1:27004"
		},
		{
			"_id" : 1,
			"host" : "172.17.0.1:27005"
		},
		{
			"_id" : 2,
			"host" : "172.17.0.1:27006",
			"arbiterOnly" : true
		}
	]
}
> rs.initiate(config)
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1585036607, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1585036607, 1)
}
rs2:SECONDARY> exit
bye

初始化配置副本集

docker run -it mongo:latest mongo --host 172.17.0.1 --port 27007
> use admin
switched to db admin
> config = {_id:"rsc",members:[{_id:0,host:"172.17.0.1:27007"}, {_id:1,host:"172.17.0.1:27008"},{_id:2,host:"172.17.0.1:27009"}]}
{
	"_id" : "rsc",
	"members" : [
		{
			"_id" : 0,
			"host" : "172.17.0.1:27007"
		},
		{
			"_id" : 1,
			"host" : "172.17.0.1:27008"
		},
		{
			"_id" : 2,
			"host" : "172.17.0.1:27009"
		}
	]
}
> rs.initiate(config)
{
	"ok" : 1,
	"$gleStats" : {
		"lastOpTime" : Timestamp(1585036628, 1),
		"electionId" : ObjectId("000000000000000000000000")
	},
	"lastCommittedOpTime" : Timestamp(0, 0),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1585036628, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1585036628, 1)
}
rsc:SECONDARY> exit
bye

通过mongos添加分片关系到configsvr

docker run -it mongo:latest mongo --host 172.17.0.1 --port 27100
mongos> use admin
switched to db admin
mongos> db.runCommand({addshard:"rs1/172.17.0.1:27001,172.17.0.1:27002,172.17.0.1:27003"})
{
	"shardAdded" : "rs1",
	"ok" : 1,
	"operationTime" : Timestamp(1585036697, 6),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1585036697, 6),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
mongos> db.runCommand({addshard:"rs2/172.17.0.1:27004,172.17.0.1:27005,172.17.0.1:27006"})
{
	"shardAdded" : "rs2",
	"ok" : 1,
	"operationTime" : Timestamp(1585036704, 5),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1585036704, 5),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
mongos> exit
bye

停止集群

docker stop $(docker ps -a | grep mongo | grep Up | awk '{print $1}')

删除集群容器

docker rm -f $(docker ps -a | grep mongo | awk '{print $1}')

在macOS下使用Docker搭建MongoDB分片副本集群
https://whh.zone/2020/03/mongodb-cluster/
作者
Simple
发布于
2020年3月24日
许可协议