mongodb 集群搭建的方式有三种:
其中,第一种方式基本没什么意义,官方也不推荐这种方式搭建。另外两种分别就是副本集和分片的方式。今天介绍副本集的方式搭建mongodb高可用集群
首先我们先来了解一下Mongo集群的概念,Mongo集群有3个主要组件
ConfigServer:在集群中扮演存储整个集群的配置信息,负责配置存储,如果需要高可用的ConfigServer那么需要3个节点。
Shard:分片,存储真实的数据,每一个Shard分片都负责存储集群中的数据,例如一个集群有3个分片,然后我们定义分片规则为哈希,那么整个集群的数据就会(分割)到3个分片中的某一个分片,那么分片是特别重要的,如果集群中的一个分片全部崩溃了那么集群将不可用,所以我们要保证集群的高可用,那么我们需要一个分片配置3个节点,2个副本集一个仲裁节点,仲裁节点类似于Redis的哨兵模式,如果发现主节点挂了那么让另一个副本集进行数据存储。
Mongos:Mongos我们可以理解为整个集群的入口,类似于Kafka的Broker代理,也就是客户端,我们通过客户端连接集群进行查询。
下面是MongoDB的官方集群架构图,我们看到Mongos是一个路由,他们的信息都存储在ConfigServer中,我们通过Mongos进行添加,然后根据条件将数据进行分片到分片的副本集中
首先我们搭建两个config-server
创建两个config-server的配置文件
#创建config-server-1
mkdir -p /docker/mongo-cluster/mongo-server1/{data,conf}
#创建config-server-2
mkdir -p /docker/mongo-cluster/mongo-server2/{data,conf}
然后配置文件中配置端口
#创建第一个配置文件
#写入配置信息,端口号
echo "# mongodb.conf
logappend=true
# bind_ip=127.0.0.1
port=20011
auth=false" > /docker/mongo-cluster/mongo-server1/conf/mongo.conf
#创建第二个配置文件
#写入配置信息,端口号
echo "# mongodb.conf
logappend=true
# bind_ip=127.0.0.1
port=20012
auth=false" > /docker/mongo-cluster/mongo-server2/conf/mongo.conf
然后启动容器
#启动Server1
docker run --name mongo-server1 -d \
--net=host \
--privileged=true \
-v /docker/mongo-cluster/mongo-server1/conf:/data/configdb \
-v /docker/mongo-cluster/mongo-server1/data:/data/db \
docker.io/mongo:latest mongod -f /data/configdb/mongo.conf --configsvr --replSet "rs_config_server" --bind_ip_all
docker run --name mongo-server2 -d \
--net=host \
--privileged=true \
-v /docker/mongo-cluster/mongo-server2/conf:/data/configdb \
-v /docker/mongo-cluster/mongo-server2/data:/data/db \
docker.io/mongo:latest mongod -f /data/configdb/mongo.conf --configsvr --replSet "rs_config_server" --bind_ip_all
然后进入容器初始化
#进入容器
docker exec -it mongo-server1 bash
mongo -port 20011
#初始化
rs.initiate(
{
_id: "rs_config_server",
configsvr: true,
members: [
{ _id : 0, host : "114.67.80.169:20011" },
{ _id : 1, host : "114.67.80.169:20012" }
]
}
);
如果ok为1表示成功
下面我们给每个server创建2个分片
创建挂载文件
#创建config-server-1的两个分片目录
mkdir -p /docker/mongo-cluster/mongo-server1-shard1/{data,conf}
mkdir -p /docker/mongo-cluster/mongo-server1-shard2/{data,conf}
#创建config-server-2的两个分片目录
mkdir -p /docker/mongo-cluster/mongo-server2-shard1/{data,conf}
mkdir -p /docker/mongo-cluster/mongo-server2-shard2/{data,conf}
创建配置文件
#创建config-server-1的两个分片配置文件
echo "# mongodb.conf
logappend=true
# bind_ip=127.0.0.1
port=20021
auth=false" > /docker/mongo-cluster/mongo-server1-shard1/conf/mongo.conf
echo "# mongodb.conf
logappend=true
# bind_ip=127.0.0.1
port=20022
auth=false" > /docker/mongo-cluster/mongo-server1-shard2/conf/mongo.conf
#创建config-server-2的两个分片配置文件
echo "# mongodb.conf
logappend=true
# bind_ip=127.0.0.1
port=20023
auth=false" > /docker/mongo-cluster/mongo-server2-shard1/conf/mongo.conf
echo "# mongodb.conf
logappend=true
# bind_ip=127.0.0.1
port=20024
auth=false" > /docker/mongo-cluster/mongo-server2-shard2/conf/mongo.conf
然后启动容器
#启动config-server-1的两个分片容器
docker run --name mongo-server1-shard1 -d \
--net=host \
--privileged=true \
-v /docker/mongo-cluster/mongo-server1-shard1/conf:/data/configdb \
-v /docker/mongo-cluster/mongo-server1-shard1/data:/data/db \
docker.io/mongo:latest mongod -f /data/configdb/mongo.conf --shardsvr --replSet "rs_shard_server1" --bind_ip_all
docker run --name mongo-server1-shard2 -d \
--net=host \
--privileged=true \
-v /docker/mongo-cluster/mongo-server1-shard2/conf:/data/configdb \
-v /docker/mongo-cluster/mongo-server1-shard2/data:/data/db \
docker.io/mongo:latest mongod -f /data/configdb/mongo.conf --shardsvr --replSet "rs_shard_server1" --bind_ip_all
#启动config-server-2的两个分片容器
docker run --name mongo-server2-shard1 -d \
--net=host \
--privileged=true \
-v /docker/mongo-cluster/mongo-server2-shard1/conf:/data/configdb \
-v /docker/mongo-cluster/mongo-server2-shard1/data:/data/db \
docker.io/mongo:latest mongod -f /data/configdb/mongo.conf --shardsvr --replSet "rs_shard_server2" --bind_ip_all
docker run --name mongo-server2-shard2 -d \
--net=host \
--privileged=true \
-v /docker/mongo-cluster/mongo-server2-shard2/conf:/data/configdb \
-v /docker/mongo-cluster/mongo-server2-shard2/data:/data/db \
docker.io/mongo:latest mongod -f /data/configdb/mongo.conf --shardsvr --replSet "rs_shard_server2" --bind_ip_all
进入第一个分片
docker exec -it mongo-server1-shard1 bash
mongo -port 20021
#进行分片
rs.initiate(
{
_id : "rs_shard_server1",
members: [
{ _id : 0, host : "114.67.80.169:20021" },
{ _id : 1, host : "114.67.80.169:20022" }
]
}
);
进入第二个分片
docker exec -it mongo-server2-shard1 bash
mongo -port 20023
#进行分片
rs.initiate(
{
_id : "rs_shard_server2",
members: [
{ _id : 0, host : "182.61.2.16:20023" },
{ _id : 1, host : "182.61.2.16:20024" }
]
}
);
创建挂载文件
mkdir -p /docker/mongo-cluster/mongos1/{data,conf}
echo "# mongodb.conf
logappend=true
# bind_ip=127.0.0.1
port=20099
auth=false" > /docker/mongo-cluster/mongos1/conf/mongo.conf
然后启动Mongo
docker run --name mongo-mongos1 -d \
--net=host \
--privileged=true \
-p 27017:27017 \
--entrypoint "mongos" \
-v /docker/mongo-cluster/mongos1/conf:/data/configdb \
-v /docker/mongo-cluster/mongos1/data:/data/db \
docker.io/mongo:latest \
--configdb rs_config_server/114.67.80.169:20011,114.67.80.169:20012 --bind_ip_all
mongo添加分片组
sh.addShard("rs_shard_server1/114.67.80.169:20021,114.67.80.169:20022")
sh.addShard("rs_shard_server2/182.61.2.16:20023,182.61.2.16:20024")
新建数据启用分片
sh.enableSharding("test")
对test.order的_id进行哈希分片
sh.shardCollection("test.order", {"_id": "hashed" })
插入数据后查看分片数据
use test
for (i = 1; i <= 1000; i=i+1){db.order.insert({'price': 1})}
那么我们先来总结一下我们搭建一个高可用集群需要多少个Mongo
mongos : 3台
configserver : 3台
shard : 3片
每一片shard 分别 部署两个副本集和一个仲裁节点 : 3台
那么就是 3 + 3 + 3 * 3 = 15 台,我这里演示采用3台服务器
114.67.80.169 4核16g 部署一个configserver,一个mongos,2个分片组
182.61.2.16 2核4g 部署一个configserver,一个mongos,1个分片组
106.12.113.62 1核2g 部署一个configserver,一个mongos,不搭建分片组
由于此处服务器原因所以不是均衡分布,请根据自身实际情况搭建
角色 | ip |
---|