抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

MongoDB集群搭建

MongoDB集群简介

mongodb 集群搭建的方式有三种:

  1. 主从备份(Master - Slave)模式,或者叫主从复制模式。
  2. 副本集(Replica Set)模式
  3. 分片(Sharding)模式

其中,第一种方式基本没什么意义,官方也不推荐这种方式搭建。另外两种分别就是副本集和分片的方式。

Mongo分片高可用集群搭建

概述

​ 为解决mongodb在replica set每个从节点上面的数据库均是对数据库的全量拷贝,从节点压力在高并发大数据量的场景下存在很大挑战,同时考虑到后期mongodb集群的在数据压力巨大时的扩展性,应对海量数据引出了分片机制。

什么是分片

​ 分片是将数据库进行拆分,将其分散在不同的机器上的过程,无需功能强大的服务器就可以存储更多的数据,处理更大的负载,在总数据中,将集合切成小块,将这些块分散到若干片中,每个片只负载总数据的一部分,通过一个知道数据与片对应关系的组件mongos的路由进程进行操作。

基础组件

其利用到了四个组件:mongos,config server,shard,replica set

mongos

​ 数据库集群请求的入口,所有请求需要经过mongos进行协调,无需在应用层面利用程序来进行路由选择,mongos其自身是一个请求分发中心,负责将外部的请求分发到对应的shard服务器上,mongos作为统一的请求入口,为防止mongos单节点故障,一般需要对其做HA。

config server

​ 配置服务器,存储所有数据库元数据(分片,路由)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是存缓存在内存中来读取数据,mongos在第一次启动或后期重启时候,就会从config server中加载配置信息,如果配置服务器信息发生更新会通知所有的mongos来更新自己的状态,从而保证准确的请求路由,生产环境中通常也需要多个config server,防止配置文件存在单节点丢失问题。

shard

​ 在传统意义上来讲,如果存在海量数据,单台服务器存储1T压力非常大,无论考虑数据库的硬盘,网络IO,又有CPU,内存的瓶颈,如果多台进行分摊1T的数据,到每台上就是可估量的较小数据,在mongodb集群只要设置好分片规则,通过mongos操作数据库,就可以自动把对应的操作请求转发到对应的后端分片服务器上。

replica set

​ 在总体mongodb集群架构中,对应的分片节点,如果单台机器下线,对应整个集群的数据就会出现部分缺失,这是不能发生的,因此对于shard节点需要replica set来保证数据的可靠性,生产环境通常为2个副本+1个仲裁。

整体架构

整体架构涉及到15个节点,我们这里使用Docker容器进行部署

那么我们先来总结一下我们搭建一个高可用集群需要多少个Mongo

  • mongos: 3台

  • configserver : 3台

  • shard : 3片; 每个分片由三个节点构成

容器部署情况
角色 端口 暴漏端口 描述 角色
config-server1 27017 配置节点1
config-server2 27017 配置节点2
config-server3 27017 配置节点3
mongos-server1 27017 30001 路由节点1
mongos-server2 27017 30002 路由节点2
mongos-server3 27017 30003 路由节点3
shard1-server1 27017 分片1节点1 Primary
shard1-server2 27017 分片1节点2 Secondry
shard1-server3 27017 分片1节点3 Arbiter
shard2-server1 27017 分片2节点1 Primary
shard2-server2 27017 分片2节点2 Secondry
shard2-server3 27017 分片2节点3 Arbiter
shard3-server1 27017 分片3节点1 Primary
shard3-server2 27017 分片3节点2 Secondry
shard3-server3 27017 分片3节点3 Arbiter
整体架构预览

image-20210423163515625

基础环境准备

安装Docker

本次使用Docker环境进行搭建,需要提前准备好Docker环境

创建Docker网络

因为需要使用MongoDB搭建Docker集群,所以先创建Docker网络

1
2
docker network create mongo-cluster
docker network ls

image-20210422145928254

搭建ConfigServer副本集

我们先来搭建ConfigServer的副本集,这里面涉及到三个节点,我们需要创建配置文件以及启动容器

创建挂载目录

我们需要创建对应的挂载目录来存储配置文件以及以及日志文件

1
2
3
4
5
6
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/config-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/config-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/config-server/logs/{1..3}

image-20210426140439905

创建密钥文件

因为我们知道搭建的话一定要高可用而且一定要权限这里mongo之间通信采用秘钥文件,所以我们先进行生成密钥文件

1
2
3
4
# 创建密钥文件
openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key
# 设置
chmod 600 /tmp/mongo-cluster/config-server/conf/mongo.key

image-20210426140535497

创建配置文件

因为由多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log

# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: configsvr #副本集名称
sharding:
clusterRole: configsvr # 集群角色,这里配置的角色是配置节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/config-server/conf/mongo.conf

image-20210426141036208

启动容器
启动config-server1
1
2
3
4
5
6
7
docker run --name config-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/config-server:/data/configdb \
-v /tmp/mongo-cluster/config-server/data/1:/data/db \
-v /tmp/mongo-cluster/config-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426142411086

启动config-server2
1
2
3
4
5
6
7
docker run --name config-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/config-server:/data/configdb \
-v /tmp/mongo-cluster/config-server/data/2:/data/db \
-v /tmp/mongo-cluster/config-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426142616057

启动config-server3
1
2
3
4
5
6
7
docker run --name config-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/config-server:/data/configdb \
-v /tmp/mongo-cluster/config-server/data/3:/data/db \
-v /tmp/mongo-cluster/config-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426142702240

初始化config-server
登录容器

进入第一台容器

1
2
docker exec -it config-server1 bash
mongo -port 27017

image-20210426142802563

执行命令

执行以下命令进行MongoDB容器的初始化

1
2
3
4
5
6
7
8
9
10
rs.initiate(
{
_id: "configsvr",
members: [
{ _id : 1, host : "config-server1:27017" },
{ _id : 2, host : "config-server2:27017" },
{ _id : 3, host : "config-server3:27017" }
]
}
)

如果出现OK表示MongoDB配置服务器已经初始化成功

image-20210426142907060

创建用户

因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是root

1
2
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

这样就在MongoDB的admin数据库添加了一个用户名为root 密码是root的用户

image-20210426143059744

搭建Shard分片组

由于mongos是客户端,所以我们先搭建好config以及shard之后再搭建mongos。

创建挂载目录

我们先创建挂载目录

1
2
3
4
5
6
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/logs/{1..3}

image-20210426143754999

搭建shard1分片组

在同一台服务器上初始化一组分片

创建密钥文件

因为集群只需要一个密钥文件,我们可以将config-server中的密钥文件复制过来

1
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard1-server/conf/

image-20210426143957911

配置配置文件

因为由多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log

# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard1 #复制集名称是 shardsvr
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard1-server/conf/mongo.conf

image-20210426144225668

启动shard1-server1
1
2
3
4
5
6
7
docker run --name shard1-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard1-server:/data/configdb \
-v /tmp/mongo-cluster/shard1-server/data/1:/data/db \
-v /tmp/mongo-cluster/shard1-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426144735683

启动shard1-server2
1
2
3
4
5
6
7
docker run --name shard1-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard1-server:/data/configdb \
-v /tmp/mongo-cluster/shard1-server/data/2:/data/db \
-v /tmp/mongo-cluster/shard1-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426144830499

启动shard1-server3
1
2
3
4
5
6
7
docker run --name shard1-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard1-server:/data/configdb \
-v /tmp/mongo-cluster/shard1-server/data/3:/data/db \
-v /tmp/mongo-cluster/shard1-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426144913738

初始化shard1分片组

并且制定第三个副本集为仲裁节点

1
2
docker exec  -it shard1-server1 bin/bash
mongo -port 27017

image-20210426145005460

登录后进行初始化节点,这里面arbiterOnly:true是设置为仲裁节点

1
2
3
4
5
6
7
8
9
10
11
#进行副本集配置
rs.initiate(
{
_id : "shard1",
members: [
{ _id : 0, host : "shard1-server1:27017" },
{ _id : 1, host : "shard1-server2:27017" },
{ _id : 2, host : "shard1-server3:27017",arbiterOnly:true }
]
}
);

显示OK即副本集创建成功

image-20210426145453429

创建用户

因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是root

1
2
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

image-20210426145556449

查看节点信息
1
rs.isMaster()

image-20210423140355334

搭建shard2分片组
创建密钥文件

因为集群只需要一个密钥文件,我们可以将config-server中的密钥文件复制过来

1
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard2-server/conf/

image-20210426145726786

配置配置文件

因为由多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log

# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard2 #复制集名称是 shard2
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard2-server/conf/mongo.conf

image-20210426145833616

启动shard2-server1
1
2
3
4
5
6
7
docker run --name shard2-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard2-server:/data/configdb \
-v /tmp/mongo-cluster/shard2-server/data/1:/data/db \
-v /tmp/mongo-cluster/shard2-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426150028020

启动shard2-server2
1
2
3
4
5
6
7
docker run --name shard2-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard2-server:/data/configdb \
-v /tmp/mongo-cluster/shard2-server/data/2:/data/db \
-v /tmp/mongo-cluster/shard2-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426150050885

启动shard2-server3
1
2
3
4
5
6
7
docker run --name shard2-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard2-server:/data/configdb \
-v /tmp/mongo-cluster/shard2-server/data/3:/data/db \
-v /tmp/mongo-cluster/shard2-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426150113753

初始化shard2分片组

登录节点后进行初始化分片2

1
2
docker exec -it shard2-server1 bin/bash
mongo -port 27017

image-20210426150228124

执行下面的命令进行初始化分片2,arbiterOnly:true参数是设置为为仲裁节点

1
2
3
4
5
6
7
8
9
10
11
#进行副本集配置
rs.initiate(
{
_id : "shard2",
members: [
{ _id : 0, host : "shard2-server1:27017" },
{ _id : 1, host : "shard2-server2:27017" },
{ _id : 2, host : "shard2-server3:27017",arbiterOnly:true }
]
}
);

返回ok就表示

image-20210426150547206

创建用户

因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是root

1
2
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

image-20210426151531640

搭建shard3分片组
创建密钥文件

因为集群只需要一个密钥文件,我们可以将config-server中的密钥文件复制过来

1
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard3-server/conf/

image-20210426151753703

配置配置文件

因为由多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log

# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard3 #复制集名称是 shard3
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard3-server/conf/mongo.conf

image-20210426151842100

启动shard3-server1
1
2
3
4
5
6
7
docker run --name shard3-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard3-server:/data/configdb \
-v /tmp/mongo-cluster/shard3-server/data/1:/data/db \
-v /tmp/mongo-cluster/shard3-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426152011362

启动shard3-server2
1
2
3
4
5
6
7
docker run --name shard3-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard3-server:/data/configdb \
-v /tmp/mongo-cluster/shard3-server/data/2:/data/db \
-v /tmp/mongo-cluster/shard3-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426152148639

启动shard3-server3
1
2
3
4
5
6
7
docker run --name shard3-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard3-server:/data/configdb \
-v /tmp/mongo-cluster/shard3-server/data/3:/data/db \
-v /tmp/mongo-cluster/shard3-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426152215113

初始化shard3分片组

登录节点后进行初始化分片2

1
2
docker exec -it shard3-server1 bin/bash
mongo -port 27017

image-20210426152306109

执行下面的命令进行初始化分片3,arbiterOnly:true参数是设置为为仲裁节点

1
2
3
4
5
6
7
8
9
10
11
#进行副本集配置
rs.initiate(
{
_id : "shard3",
members: [
{ _id : 0, host : "shard3-server1:27017" },
{ _id : 1, host : "shard3-server2:27017" },
{ _id : 2, host : "shard3-server3:27017",arbiterOnly:true }
]
}
);

image-20210426152335482

创建用户

因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是root

1
2
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

image-20210426152412135

搭建Mongos

mongos负责查询与数据写入的路由,是实例访问的统一入口,是一个无状态的节点,每一个节点都可以从config-server节点获取到配置信息

创建挂载目录

我们需要创建对应的挂载目录来存储配置文件以及以及日志文件

1
2
3
4
5
6
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/logs/{1..3}

image-20210426153000440

创建密钥文件

因为集群只需要一个密钥文件,我们可以将config-server中的密钥文件复制过来

1
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/mongos-server/conf/

image-20210426153102929

创建配置文件

因为由多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可,y因为Mongos只负责路由,就不需要数据文件了,并且mongos服务是不负责认证的,需要将authorization配置项删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
echo "
# 日志文件
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log

# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
# 配置分片,这里面配置的是需要读取的配置节点的信息
sharding:
configDB: configsvr/config-server1:27017,config-server2:27017,config-server3:27017
security:
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/mongos-server/conf/mongo.conf

image-20210426161944755

启动mongos集群
启动mongos1
1
2
3
4
5
6
7
8
docker run --name mongos-server1 -d \
-p 30001:27017 \
--net=mongo-cluster \
--privileged=true \
--entrypoint "mongos" \
-v /tmp/mongo-cluster/mongos-server:/data/configdb \
-v /tmp/mongo-cluster/mongos-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426161735554

启动mongos2
1
2
3
4
5
6
7
8
docker run --name mongos-server2 -d \
-p 30002:27017 \
--net=mongo-cluster \
--privileged=true \
--entrypoint "mongos" \
-v /tmp/mongo-cluster/mongos-server:/data/configdb \
-v /tmp/mongo-cluster/mongos-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426162053949

启动mongos3
1
2
3
4
5
6
7
8
docker run --name mongos-server3 -d \
-p 30003:27017 \
--net=mongo-cluster \
--privileged=true \
--entrypoint "mongos" \
-v /tmp/mongo-cluster/mongos-server:/data/configdb \
-v /tmp/mongo-cluster/mongos-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf

image-20210426162430101

配置mongos-server1

因为mongos是无中心的配置,所有需要每一台都需要进行分片配置

进入容器
1
2
docker exec -it mongos-server1 /bin/bash
mongo -port 27017

image-20210426163843824

登录Mongos

使用前面设置的root用户密码

1
2
use admin;
db.auth("root","root");

image-20210426163942102

配置分片

进行配置分片信息

1
2
3
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")

image-20210426165006557

配置mongos-server2

因为mongos是无中心的配置,所有需要每一台都需要进行分片配置

进入容器
1
2
docker exec -it mongos-server2 /bin/bash
mongo -port 27017

image-20210426170155460

登录Mongos

使用前面设置的root用户密码

1
2
use admin;
db.auth("root","root");

image-20210426163942102

配置分片

进行配置分片信息

1
2
3
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")

image-20210426170245466

配置mongos-server3

因为mongos是无中心的配置,所有需要每一台都需要进行分片配置

进入容器
1
2
docker exec -it mongos-server3 /bin/bash
mongo -port 27017

image-20210426170329767

登录Mongos

使用前面设置的root用户密码

1
2
use admin;
db.auth("root","root");

image-20210426163942102

配置分片

进行配置分片信息

1
2
3
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")

image-20210426170245466

Docker-comps方式搭建

环境准备

初始化目录脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 创建config-server 目录
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/config-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/config-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/config-server/logs/{1..3}

# 创建shard-server 目录
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/logs/{1..3}

# 创建mongos-server 目录
# 创建配置文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/conf
# 创建数据文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/data/{1..3}
# 创建日志文件目录
mkdir -p /tmp/mongo-cluster/mongos-server/logs/{1..3}

image-20210428145855959

生成密钥文件
1
2
3
4
5
6
7
8
9
10
11
12
# 创建密钥文件
openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key
# 设置
chmod 600 /tmp/mongo-cluster/config-server/conf/mongo.key

cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard1-server/conf/

cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard2-server/conf/

cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard3-server/conf/

cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/mongos-server/conf/

image-20210428145949709

创建配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log

# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: configsvr #副本集名称
sharding:
clusterRole: configsvr # 集群角色,这里配置的角色是配置节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/config-server/conf/mongo.conf


echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log

# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard1 #复制集名称是 shardsvr
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard1-server/conf/mongo.conf


echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log

# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard2 #复制集名称是 shard2
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard2-server/conf/mongo.conf



echo "
# 日志文件
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: /data/db
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log

# 网络设置
net:
port: 27017 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:
replSetName: shard3 #复制集名称是 shard3
sharding:
clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
security:
authorization: enabled #是否开启认证
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/shard3-server/conf/mongo.conf


echo "
# 日志文件
systemLog:
destination: file
logAppend: true
path: /data/logs/mongo.log

# 网络设置
net:
port: 27017 #端口号
bindIp: 0.0.0.0 #绑定ip
# 配置分片,这里面配置的是需要读取的配置节点的信息
sharding:
configDB: configsvr/config-server1:27017,config-server2:27017,config-server3:27017
security:
keyFile: /data/configdb/conf/mongo.key #keyFile路径
" > /tmp/mongo-cluster/mongos-server/conf/mongo.conf

启动服务

docker-compos配置文件

使用docker-compos方式启动Docker容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
version: '2'
services:
config-server1:
image: mongo
container_name: config-server1
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/config-server:/data/configdb
- /tmp/mongo-cluster/config-server/data/1:/data/db
- /tmp/mongo-cluster/config-server/logs/1:/data/logs

config-server2:
image: mongo
container_name: config-server2
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/config-server:/data/configdb
- /tmp/mongo-cluster/config-server/data/2:/data/db
- /tmp/mongo-cluster/config-server/logs/2:/data/logs

config-server3:
image: mongo
container_name: config-server3
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/config-server:/data/configdb
- /tmp/mongo-cluster/config-server/data/3:/data/db
- /tmp/mongo-cluster/config-server/logs/3:/data/logs

shard1-server1:
image: mongo
container_name: shard1-server1
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard1-server:/data/configdb
- /tmp/mongo-cluster/shard1-server/data/1:/data/db
- /tmp/mongo-cluster/shard1-server/logs/1:/data/logs

shard1-server2:
image: mongo
container_name: shard1-server2
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard1-server:/data/configdb
- /tmp/mongo-cluster/shard1-server/data/2:/data/db
- /tmp/mongo-cluster/shard1-server/logs/2:/data/logs

shard1-server3:
image: mongo
container_name: shard1-server3
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard1-server:/data/configdb
- /tmp/mongo-cluster/shard1-server/data/3:/data/db
- /tmp/mongo-cluster/shard1-server/logs/3:/data/logs

shard2-server1:
image: mongo
container_name: shard2-server1
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard2-server:/data/configdb
- /tmp/mongo-cluster/shard2-server/data/1:/data/db
- /tmp/mongo-cluster/shard2-server/logs/1:/data/logs

shard2-server2:
image: mongo
container_name: shard2-server2
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard2-server:/data/configdb
- /tmp/mongo-cluster/shard2-server/data/2:/data/db
- /tmp/mongo-cluster/shard2-server/logs/2:/data/logs

shard2-server3:
image: mongo
container_name: shard2-server3
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard2-server:/data/configdb
- /tmp/mongo-cluster/shard2-server/data/3:/data/db
- /tmp/mongo-cluster/shard2-server/logs/3:/data/logs

shard3-server1:
image: mongo
container_name: shard3-server1
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard3-server:/data/configdb
- /tmp/mongo-cluster/shard3-server/data/1:/data/db
- /tmp/mongo-cluster/shard3-server/logs/1:/data/logs

shard3-server2:
image: mongo
container_name: shard3-server2
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard3-server:/data/configdb
- /tmp/mongo-cluster/shard3-server/data/2:/data/db
- /tmp/mongo-cluster/shard3-server/logs/2:/data/logs

shard3-server3:
image: mongo
container_name: shard3-server3
privileged: true
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/shard3-server:/data/configdb
- /tmp/mongo-cluster/shard3-server/data/3:/data/db
- /tmp/mongo-cluster/shard3-server/logs/3:/data/logs

mongos-server1:
image: mongo
container_name: mongos-server1
privileged: true
entrypoint: "mongos"
networks:
- mongo-cluster-network
command: --config /data/configdb/conf/mongo.conf
ports:
- "30001:27017"
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/mongos-server:/data/configdb
- /tmp/mongo-cluster/mongos-server/logs/1:/data/logs
command: --config /data/configdb/conf/mongo.conf

mongos-server2:
image: mongo
container_name: mongos-server2
privileged: true
entrypoint: "mongos"
networks:
- mongo-cluster-network
ports:
- "30002:27017"
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/mongos-server:/data/configdb
- /tmp/mongo-cluster/mongos-server/logs/2:/data/logs
command: --config /data/configdb/conf/mongo.conf

mongos-server3:
image: mongo
container_name: mongos-server3
privileged: true
entrypoint: "mongos"
networks:
- mongo-cluster-network
ports:
- "30003:27017"
volumes:
- /etc/localtime:/etc/localtime
- /tmp/mongo-cluster/mongos-server:/data/configdb
- /tmp/mongo-cluster/mongos-server/logs/3:/data/logs
command: --config /data/configdb/conf/mongo.conf

networks:
mongo-cluster-network:
driver: bridge
启动服务
1
docker-compose up -d

image-20210428145534251

初始化文件

执行下面脚本进行容器初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
docker exec -it config-server1 bash
mongo -port 27017
rs.initiate(
{
_id: "configsvr",
members: [
{ _id : 1, host : "config-server1:27017" },
{ _id : 2, host : "config-server2:27017" },
{ _id : 3, host : "config-server3:27017" }
]
}
)
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})

docker exec -it shard1-server1 bin/bash
mongo -port 27017
#进行副本集配置
rs.initiate(
{
_id : "shard1",
members: [
{ _id : 0, host : "shard1-server1:27017" },
{ _id : 1, host : "shard1-server2:27017" },
{ _id : 2, host : "shard1-server3:27017",arbiterOnly:true }
]
}
);
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})

docker exec -it shard2-server1 bin/bash
mongo -port 27017
#进行副本集配置
rs.initiate(
{
_id : "shard2",
members: [
{ _id : 0, host : "shard2-server1:27017" },
{ _id : 1, host : "shard2-server2:27017" },
{ _id : 2, host : "shard2-server3:27017",arbiterOnly:true }
]
}
);
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})


docker exec -it shard3-server1 bin/bash
mongo -port 27017
#进行副本集配置
rs.initiate(
{
_id : "shard3",
members: [
{ _id : 0, host : "shard3-server1:27017" },
{ _id : 1, host : "shard3-server2:27017" },
{ _id : 2, host : "shard3-server3:27017",arbiterOnly:true }
]
}
);
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

初始化分片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
docker exec -it mongos-server1 /bin/bash
mongo -port 27017
use admin;
db.auth("root","root");
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")

docker exec -it mongos-server2 /bin/bash
mongo -port 27017
use admin;
db.auth("root","root");
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")


docker exec -it mongos-server3 /bin/bash
mongo -port 27017
use admin;
db.auth("root","root");
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")

评论