配置(三个配置服务副本集 + 六个分片副本集 + 一个mongos路由服务),如果对性能有较高的要求,可以在配置服务器和副本集中分别添加一个仲裁节点
- 分片利用到了四个组件:
mongos、config server、shard、repl set
- 说明
- 配置服务器(
configsvr
):主要用于存储分片集群的元数据和配置信息,通常以副本集的形式部署。 - 副本集(
replSet
):主要提供了MongoDB的高可用性、数据冗余和容错能力,以及读取扩展性和负载均衡的功能。 - 路由服务器(
mongos
):它使得客户端可以透明地与整个分片集群进行交互,提供了查询路由、元数据管理、数据迁移和故障转移等功能,从而实现了数据的分布式存储和查询的扩展性。 - 分片服务器(
shard server
):它是MongoDB分片集群中存储和管理数据的节点。它们存储数据、划分数据集、处理查询和参与数据迁移,从而实现数据的分布式存储、负载均衡和扩展性。通过增加分片服务器,可以实现MongoDB系统的水平扩展,提高性能和容量。
- 拉取镜像
docker pull mongo -
一、运行配置服务容器
- 指定配置服务器名称 -
config-0、config-1、config-2
,指定容器内部端口--port 27017
,--configsvr
表示该副本集是用于存储配置数据的,指定副本集名称--replSet config
docker run -d --name config-0 -p 27018:27017 mongo mongod --configsvr --replSet config --bind_ip_all --port 27017
docker run -d --name config-1 -p 27019:27017 mongo mongod --configsvr --replSet config --bind_ip_all --port 27017
docker run -d --name config-2 -p 27020:27017 mongo mongod --configsvr --replSet config --bind_ip_all --port 27017
三个容器的地址
docker inspect config-0
docker inspect config-1
docker inspect config-2
本次测试的三个配置服务器地址分别如下:
config-0 => 172.17.0.7:27017
config-1 => 172.17.0.8:27017
config-2 => 172.17.0.9:27017
进入副本集容器
docker exec -it config-0 bash
mongosh
可以指定运行的端口(--port 27017
)和地址(--host 127.0.0.1
)初始化配置服务的副本集
rs.initiate({
_id:"config",
configsvr: true,
members:[
{_id:0, host:"172.17.0.7:27017"},
{_id:1, host:"172.17.0.8:27017"},
{_id:2, host:"172.17.0.9:27017"},
]
})
- 上述参数剖析
键名 | 键值 | 备注 |
---|---|---|
_id | config | --replSet config,和指定的副本集名称一致 |
configsvr | true | 表示该副本集是用于存储配置数据的 |
members._id | 0 | 申明的 _id必须唯一,它是成员的唯一标识符,用于区分不同的成员,可以是数字、字符串,但是通常是数字 |
members.host | host | 需要添加副本集的地址,地址查看方法:docker inspect 容器ID/容器名称 |
-
二、创建分片副本集
docker run -d --name shard-0 -p 27021:27018 mongo mongod --shardsvr --replSet shard --bind_ip_all --port 27018
docker run -d --name shard-1 -p 27022:27018 mongo mongod --shardsvr --replSet shard --bind_ip_all --port 27018
docker run -d --name shard-2 -p 27023:27018 mongo mongod --shardsvr --replSet shard --bind_ip_all --port 27018
docker run -d --name shard-3 -p 27024:27018 mongo mongod --shardsvr --replSet shard1 --bind_ip_all --port 27018
docker run -d --name shard-4 -p 27025:27018 mongo mongod --shardsvr --replSet shard1 --bind_ip_all --port 27018
docker run -d --name shard-5 -p 27026:27018 mongo mongod --shardsvr --replSet shard1 --bind_ip_all --port 27018
- 上述分片集服务器指定端口为:
27018
- 本次测试的六个分片服务器地址分别如下:
mongo-shard-0: 172.17.0.10:27018
mongo-shard-1: 172.17.0.11:27018
mongo-shard-2: 172.17.0.12:27018
mongo-shard-10: 172.17.0.13:27018
mongo-shard-11: 172.17.0.14:27018
mongo-shard-12: 172.17.0.15:27018
- 进入容器,初始化第一组分片副本集
docker exec -it shard-1 bash
mongosh --port 27018
- 初始化分片副本集
rs.initiate({
_id:"shard",
members:[
{_id:0, host:"172.17.0.10:27018"},
{_id:1, host:"172.17.0.11:27018"},
{_id:2, host:"172.17.0.12:27018"},
]
})
可以用
rs.status()
来查看副本集的状态,上一篇文章有详细的记载退出当前容器或者重新开一个shell窗口,进入容器,初始化第二组分片副本集
docker exec -it shard-1 bash
mongosh --port 27018
初始化分片副本集,注意这里的
_id:shard1
,不是shard
rs.initiate({
_id:"shard1",
members:[
{_id:0, host:"172.17.0.13:27018"},
{_id:1, host:"172.17.0.14:27018"},
{_id:2, host:"172.17.0.15:27018"},
]
})
同样也可以用
rs.status()
来查看副本集的状态-
三、创建mongos路由服务,连接mongos到分片集群
docker run -d
--name mongos
-p 27017:27017 mongo mongos
--configdb config/172.17.0.7:27017,172.17.0.8:27017,172.17.0.9:27017
--bind_ip_all
--port 27017
- 参数剖析
键名 | 说明 |
---|---|
-d | 后台运行容器 |
--name | 设置容器名为:mongos |
-p | 主机端口 :容器端口,将容器的 27017 端口映射到主机的 27017 端口 |
--configdb | 用于指定分片集群的配置服务器的连接信息,即:服务容器信息 |
--bind_ip_all | 表示服务器可以接受来自任何网络接口的连接请求,即:表示将mongo配置文件中的 bindIp 设置成 0.0.0.0
|
--port | 表示指定容器内的端口为27017 ,即:表示将mongo配置文件中的 port 设置成 27017
|
- 添加分片集群
- 进入容器
docker exec -it mongos bash
- 进入mongodb
mongosh
- 添加分片
sh.addShard("shard/172.17.0.10:27018,172.17.0.11:27018,172.17.0.12:27018")
sh.addShard("shard1/172.17.0.13:27018,172.17.0.14:27018,172.17.0.15:27018")
- 启用分片
use admin
sh.enableSharding("test")
sh.shardCollection("test.user", {"_id": "hashed"})
- 两组分片服务器上都有了
test
集合,配置完成!
- 测试插入数据
use test
db.user.insertMany([
{ _id: 1, name: "Item 1",num:1, category: "Category A" },
{ _id: 2, name: "Item 2",num:2, category: "Category B" },
{ _id: 3, name: "Item 3",num:3, category: "Category A" },
{ _id: 4, name: "Item 4",num:4, category: "Category B" },
{ _id: 5, name: "Item 5",num:5, category: "Category A" }
])
查看插入数据
-
mongos集群服务器
-
第一组分片服务器
-
第二组分片服务器