先看一张图
从图中可以看到有四个组件:mongos、config server、shard、replica set。
mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,防止数据丢失!
shard,分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。
replica set,中文翻译副本集,其实就是shard的备份,防止shard挂掉之后数据丢失。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
仲裁者(Arbiter),是复制集中的一个MongoDB实例,它并不保存数据。仲裁节点使用最小的资源并且不要求硬件设备,不能将Arbiter部署在同一个数据集节点中,可以部署在其他应用服务器或者监视服务器中,也可部署在单独的虚拟机中。为了确保复制集中有奇数的投票成员(包括primary),需要添加仲裁节点做为投票,否则primary不能运行时不会自动切换primary。
简单了解之后,我们可以这样总结一下,应用请求mongos来操作mongodb的增删改查,配置服务器存储数据库元信息,并且和mongos做同步,数据最终存入在shard(分片)上,为了防止数据丢失同步在副本集中存储了一份,仲裁在数据存储到分片的时候决定存储到哪个节点。
0.1、下载mongo镜像
docker pull docker.io/mongo:4.4.8
0.2、mongo组件默认端口
27017 if mongod is not a shard member or a config server member
27018 if mongod is a shard member
27019 if mongod is a config server member
官网说明 https:??/docs.mongodb.com/v3.4/reference/program/mongod/#cmdoption-mongod-port
0.3、单台物理机部署,端口规划(定义前两位端口段)
- mongos:20000
- config:21000
- shard1:27001
- shard2:27002
- shard3:27003
1.1、启动config server
docker run -d --name configsvr0 -p 21000:27019 -v /data/mongodb/configsvr0:/data/configdb --network mongo-net docker.io/mongo:4.4.8 --configsvr --replSet "rs_configsvr" --bind_ip_all
docker run -d --name configsvr1 -p 21001:27019 -v /data/mongodb/configsvr1:/data/configdb --network mongo-net docker.io/mongo:4.4.8 --configsvr --replSet "rs_configsvr" --bind_ip_all
docker run -d --name configsvr2 -p 21002:27019 -v /data/mongodb/configsvr2:/data/configdb --network mongo-net docker.io/mongo:4.4.8 --configsvr --replSet "rs_configsvr" --bind_ip_all
1.2、初始化配置服务复制集
docker exec -it configsvr0 bash
mongo --host 192.168.167.204 --port 21000
rs.initiate(
{
_id: "rs_configsvr",
configsvr: true,
members: [
{ _id: 0, host : "192.168.167.204:21000" },
{ _id: 1, host : "192.168.167.204:21001" },
{ _id: 2, host : "192.168.167.204:21002" }
]
}
);
2.1、创建分片复制集
docker run --name shardsvr00 -p 27001:27018 -d -v /data/mongodb/shardsvr00:/data/db --network mongo-net docker.io/mongo:4.4.8 --shardsvr --replSet "rs_shardsvr0" --bind_ip_all
docker run --name shardsvr10 -p 27002:27018 -d -v /data/mongodb/shardsvr10:/data/db --network mongo-net docker.io/mongo:4.4.8 --shardsvr --replSet "rs_shardsvr1" --bind_ip_all
docker run --name shardsvr01 -p 27003:27018 -d -v /data/mongodb/shardsvr01:/data/db --network mongo-net docker.io/mongo:4.4.8 --shardsvr --replSet "rs_shardsvr0" --bind_ip_all
docker run --name shardsvr11 -p 27004:27018 -d -v /data/mongodb/shardsvr11:/data/db --network mongo-net docker.io/mongo:4.4.8 --shardsvr --replSet "rs_shardsvr1" --bind_ip_all
2.2、初始化副本集
docker exec -it shardsvr00 bash
mongo --host 192.168.167.204 --port 27001
rs.initiate(
{
_id: "rs_shardsvr0",
members: [
{ _id: 0, host : "192.168.167.204:27001" },
{ _id: 1, host : "192.168.167.204:27003" }
]
}
);
rs.status()
docker exec -it shardsvr10 bash
mongo --host 192.168.167.204 --port 27002
rs.initiate(
{
_id: "rs_shardsvr1",
members: [
{ _id: 0, host : "192.168.167.204:27002" },
{ _id: 1, host : "192.168.167.204:27004" }
]
}
);
3.1、创建mongos,连接mongos到分片集群
docker run --name mongos0 -p 20000:27017 -d --network mongo-net docker.io/mongo:4.4.8 mongos --configdb rs_configsvr/192.168.167.204:21000,192.168.167.204:21001,192.168.167.204:21002 --bind_ip_all
docker run --name mongos1 -p 20001:27017 -d --network mongo-net docker.io/mongo:4.4.8 mongos --configdb rs_configsvr/192.168.167.204:21000,192.168.167.204:21001,192.168.167.204:21002 --bind_ip_all
3.2、添加分片到集群
docker exec -it mongos0 bash
mongo --host 192.168.167.204 --port 20000
3.2.1、添加分片到集群
sh.addShard("rs_shardsvr0/192.168.167.204:27001,192.168.167.204:27003")
sh.addShard("rs_shardsvr1/192.168.167.204:27002,192.168.167.204:27004")
3.2.2、数据库 启用 分片
sh.enableSharding("test")
3.2.3、分片集合
对 test.order 的 _id 字段进行哈希分片:
sh.shardCollection("test.order", {"_id": "hashed" })
3.2.4、插入数据
use test
for (i = 1; i <= 1001; i=i+1){
db.order.insert({"price": 1})
}
3.2.5、查看数据分布
db.order.stats()
4.1 其他
查看docker 容器闪退日志命令:
docker logs --since 30m 容器ID