文章目录
分片机制
分片概念
分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。通过一个名为mongos的路由进程进行操作,mongos知道数据和片的对应关系(通过配置服务器)。大部分使用场景都是解决磁盘空间的问题,对于写入有可能跨分片,查询则尽量避免跨分片查询。
mongodb分片的主要使用场景:
- 数据量过大,单机磁盘空间不足;
- 单个mongod不能满足写数据的性能要求,需要通过分片让写压力分散到各个分片上面;
- 把大量数据放到内存里提高性能,通过分片使用分片服务器自身的资源。
mongodb分片优势**:**
减少单个分片需要处理的请求数,提高集群的存储容量和吞吐量 比如,当插入一条数据时,应用只需要访问存储这条数据的分片 减少单分片存储的数据,提高数据可用性,提高大型数据库查询服务的性能。 当MongoDB单点数据库服务器存储和性能成为瓶颈,或者需要部署大型应用以充分利用内存时,可以使用分片技术
分片集群架构
组件说明:
- **Config Server:配置服务器,**存储了整个 分片群集的配置信息,其中包括 chunk信息。
- **Shard:分片服务器,**用于存储实际的数据块,每一个shard都负责存储集群中的一部分数据。例如一个集群有3个分片,假设定义分片的规则为hash,那么整个集群的数据会按照相应规划分割到3个分片当中。任意一个分片挂掉,则整个集群数据不可用。所以在实际生产环境中一个shard server角色一般由一个3节点的replicaSet承担,防止分片的单点故障。
- **mongos:前端路由,**整个集群的入口。客户端应用通过mongos连接到整个集群,mongos让整个集群看上去像单一数据库,客户端应用可以透明使用
整个mongo分片集群的功能:
- 请求分流:通过路由节点将请求分发到对应的分片和块中
- 数据分流:内部提供平衡器保证数据的均匀分布,这是数据平均分布式、请求平均分布的前提
- 块的拆分:mongodb的单个chunk的最大容量为64M或者10w的数据,当到达这个阈值,触发块的拆分,一分为二
- 块的迁移:为保证数据在分片节点服务器分片节点服务器均匀分布,块会在节点之间迁移。一般相差8个分块的时候触发
分片集群部署
部署规划
shard 3 个副本集
config server 3 个副本集
mongos 3 个副本集
主机准备
shard
IP | role | port | shardname |
---|---|---|---|
192.168.142.157 | shard1 | 27181 | shard1 |
192.168.142.157 | shard2 | 27182 | shard1 |
192.168.142.157 | shard3 | 27183 | shard1 |
192.168.142.155 | shard1 | 27181 | shard2 |
192.168.142.155 | shard2 | 27182 | shard2 |
192.168.142.155 | shard3 | 27183 | shard2 |
192.168.142.156 | shard1 | 27181 | shard3 |
192.168.142.156 | shard2 | 27182 | shard3 |
192.168.142.156 | shard3 | 27183 | shard3 |
config server
IP | role | port | config name |
---|---|---|---|
192.168.142.157 | config server1 | 27281 | config1 |
192.168.142.157 | config server2 | 27282 | config1 |
192.168.142.157 | config server3 | 27283 | config1 |
192.168.142.155 | config server1 | 27281 | config2 |
192.168.142.155 | config server2 | 27282 | config2 |
192.168.142.155 | config server3 | 27283 | config2 |
192.168.142.156 | config server1 | 27281 | config3 |
192.168.142.156 | config server2 | 27282 | config3 |
192.168.142.156 | config server3 | 27283 | config3 |
mongos
IP | role | port |
---|---|---|
192.168.142.155 | mongos | 27381 |
192.168.142.155 | mongos | 27382 |
192.168.142.155 | mongos | 27383 |
开始部署
sharetype=blogdetail&sharerId=142671701&sharerefer=PC&sharesource=qq_62866151&spm=1011.2480.3001.8118)
创建搭建分片集群的文件夹
mkdir /docker/mongo-zone/{configsvr,shard,mongos} -p
进入 /docker/mongo-zone/
文件夹
configsvr 副本集文件夹准备
mkdir configsvr/{configsvr1,configsvr2,configsvr3}/{data,logs} -p
shard 副本集文件夹准备
mkdir shard/{shard1,shard2,shard3}/{data,logs} -p
mongos 副本集文件夹准备
mkdir mongos/{mongos1,mongos2,mongos3}/{data,logs} -p
生成密钥
openssl rand -base64 756 > mongo.key
发放给其他主机
scp mongo.key [email protected]:/home/slave
scp mongo.key [email protected]:/home/slave02
mv /home/slave02/mongo.key .
mv /home/slave/mongo.key .
chown root:root mongo.key
所有的节点都用的是同一密钥,并且都处于同一网络中
搭建 shard 副本集
cd /docker/mongo-zone/shard/shard1
docker-compose.yml
services:
mongo-shard1:
image: mongo:7.0
container_name: mongo-shard1
restart: always
volumes:
- /docker/mongo-zone/shard/shard1/data:/data/db
- /docker/mongo-zone/shard/shard1/logs:/var/log/mongodb
- /docker/mongo-zone/mongo.key:/etc/mongo.key
ports:
- "27181:27181"
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: 123456
MONGO_INITDB_REPLICA_SET_NAME: shard1
MONGO_INITDB_DATABASE: admin
command:
- /bin/sh
- -c
- |
chmod 400 /etc/mongo.key
chown 999:999 /etc/mongo.key
mongod --shardsvr --directoryperdb --replSet shard1 --bind_ip_all --auth --keyFile /etc/mongo.key --wiredTigerCacheSizeGB 1 --oplogSize 5000 --port 27181
mongo-shard2:
image: mongo:7.0
container_name: mongo-shard2
restart: always
volumes:
- /docker/mongo-zone/shard/shard2/data:/data/db
- /docker/mongo-zone/shard/shard2/logs:/var/log/mongodb
- /docker/mongo-zone/mongo.key:/etc/mongo.key
ports:
- "27182:27182"
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: 123456
MONGO_INITDB_REPLICA_SET_NAME: shard1
MONGO_INITDB_DATABASE: admin
command:
- /bin/sh
- -c
- |
chmod 400 /etc/mongo.key
chown 999:999 /etc/mongo.key
mongod --shardsvr --directoryperdb --r