MongoDB Cluster 之 sharding module
一 工作原理
sharding 将数据水平切分到不同的物理节点,通过多台机器分配数据以大数据集和高吞吐量的操作,把计算量分摊到多个机器上同时运算,通过分布式来提高速度。这是MongoDB官方推荐的一种集群模式。
sharding module可以动态扩容、自动平衡数据,具有透明的使用接口。可以实现实例平滑升级,可以动态增加删除节点,响应数据快速增长。可以自动在节点间平衡数据量,避免负载集中在少数节点,而在这期间不影响数据库读写访问。对客户端,可以使用完全相同的驱动,大部分功能可复用,基本不需要更改任何代码。
一个功能完备的sharding module主要由shard,config,OS三个角色组成。其各自的职能如下:
shard:存储数据。
config存储元数据。
os:对客户端透明,提供客户端连接。
二 名词解释
Replica Sets :副本集合
Sharding :分片集合
Primary :主节点
Secondary :副本节点
Arbiter :仲裁调度
Elected :选主
Chunk :数据块
Range :数域,是一个左闭右开的区间
Balance :动态平衡
Split :动态扩容
Shard key :聚簇索引
HeartBeat :活性检测
三 相关逻辑图
1 Sharding Cluster
2 Elected Process
3 Replica Set
4 A Business Scenario
四 安装配置步骤及说明
Step 1 确认服务器平台信息【本次实验服务器平台信息为:Intel i5M480CPU,6GBDDR3RAM,CentOS7-1104版本】;
Step 2 下载 mongodb-linux-x86_64 源码包并作完整性校验【本次实验版本为 mongodb-linux-x86_64-4.0.6.tgz 】;
Step 3 规划服务器进程、目录、端口安排,并提供规划清单【本次实验规划清单如下所示:】
服务器 | 主机 IP | 服务 | 端口 | 目录 |
服务器 一 | 192.168.0.121 | Mongod s 1-1 | 27020 | /data/mongo/s1_1 |
Mongod s 2-1 | 27021 | /data/mongo/s2_1 | ||
Mongond c 1 | 27018 | /data/mongo/config | ||
Mongod os 1 | 27017 |
| ||
服务器 二 | 192.168.0.185 | Mongod s1-2 | 27020 | /data/mongo/s1_2 |
Mongod s2-2 | 27021 | /data/mongo/s2_1 | ||
Mongod c 2 | 27018 | /data/mongo/config | ||
Mongod os 2 | 27017 |
| ||
服务器 三 | 192.168.0.192 | Mongod s1-3 | 27020 | /data/mongo/s1_3 |
Mongod s2-3 | 27021 | /data/mongo/s2_3 | ||
Mongod c 3 | 27018 | /data/mongo/config | ||
Mongod os 3 | 27017 |
|
Step 4 检查并校准主机时间
date -s "20190224 16:12:00" &&hwclock --systohc
Step 5 在物理服务器上创建已规划的目录,如
mkdir -p /data/mongo/{s1_1,s2_1,config}
Step 6 上传经过完整性校验的mongodb-linux-x86_64 源码包至 /home/loginuser/temprory/
Step 7 将所上传的mongodb-linux-x86_64 源码包解压到 /opt/ ,并将加压后的目录以“ software_architecture_version_user_current-time ” 的形式重命名,如:
tar -xzvPf mongodb-linux-x86_64-4.0.6.tgz -C /opt/mongodb_linux64_406_loginuser_20190224/
Step 8 在三台服务器上分别创建
在三台服务器上分别创建
在三台服务器上分别创建
在三台服务器上分别运行
Step 9 配置节点:
1 示例为 Mongod s 1-1 节点:
systemLog:
quiet: false
path: /data/mongo/s1_1/logs/mongod.log
logAppend: false
destination: file
processManagement:
fork: true
pidFilePath: /data/mongo/s1_1/mongod.pid
net:
bindIp: 127.0.0.1
port: 27020
maxIncomingConnections: 65536
wireObjectCheck: true
ipv6: false
storage:
dbPath: /data/mongo/s1_1/db
indexBuildRetry: true
journal:
enabled: true
directoryPerDB: false
engine: mmapv1
syncPeriodSecs: 60
mmapv1:
quota:
enforced: false
maxFilesPerDB: 8
smallFiles: true
journal:
commitIntervalMs: 100
operationProfiling:
slowOpThresholdMs: 100
mode: off
sharding:
clusterRole: shardsvr
archiveMovedChunks: false
2 示例为 Mongond c 1 :
systemLog:
quiet: false
path:/data/mongo/config/logs/mongod.log
logAppend: false
destination: file
processManagement:
fork: true
pidFilePath:/data/mongo/config/mongod.pid
net:
bindIp: 127.0.0.1
port: 27018
maxIncomingConnections: 65536
wireObjectCheck: true
ipv6: false
storage:
dbPath:/data/mongo/config/db
indexBuildRetry: true
journal:
enabled: true
directoryPerDB: false
engine: mmapv1
syncPeriodSecs: 60
mmapv1:
quota:
enforced: false
maxFilesPerDB: 8
smallFiles: true
journal:
commitIntervalMs: 100
operationProfiling:
slowOpThresholdMs: 100
mode: off
sharding:
clusterRole: configsvr
3 示例为 Mongod os 1 :
systemLog:
quiet: false
path: /data/mongo/logs/mongod.log
logAppend: false
destination: file
processManagement:
fork: true
pidFilePath: /data/mongo/mongod.pid
net:
bindIp: 127.0.0.1
port: 27017
maxIncomingConnections: 65536
wireObjectCheck: true
ipv6: false
sharding:
configDB: 127.0.0.1:27018
chunkSize: 64
Step 10 配置relica set ,以配置shard1用到的RS为例:
在服务器一上:
mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_1/db --logpath=/data/mongo/s1_1/log/mongo.log --logappend --fork
mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_2/db --logpath=/data/mongo/s1_2/log/mongo.log --logappend --fork
mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_3/db --logpath=/data/mongo/s1_3/log/mongo.log --logappend --fork
连接三个节点的任一个初始化RS:
>use admin
>config = {_id:'s1',members:[{_id:0,host:'fuwuqiyi:27020',priority:1},{_id:1,host:'fuwuqier:27020'},{_id:2,host:'fuwuqisan:27020'}]}
>rs.initiate(config)
>rs.status()
另外对RS的所有节点都执行如下命令确保所有节点都能分担读取的压力
>db.getMongo().setSlaveOk();
Step 11 配置 config服务,以Mongond c 1为例:
mongod -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork
Step 12 配置 os 服务,以Mongond os 1为例:
mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb fuwuqiyi:27018,fuwuqier:27018,fuwuqisan:27018 --port 27017
Step 13 配置Shard Cluster:
use admin
db.runCommand({addShard:"shard1/fuwuqiyi:27020,fuwuqier:27020,fuwuqisan:27020"})
db.runCommand({addShard:"shard2/fuwuqiyi:27021,fuwuqier:27021,fuwuqisan:27021"})
db.printShardingStatus()
Step 14 激活数据库及集合的分片:
db.runCommand({enablesharding:"testdb"})
db.runCommand({shardcollection:"testdb.collection_test",key:{_id:1}})
Step 15 添加 OS 用户:
use admin
db.addUser("<user>","<password>")
db.addUser("<user>","<password>",true)
Step 16 生成keyfile:
openssl rand -base64 753 >keyfile
Step 17 指定 keyfile 重启服务,以启动 RS1 为例:
mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_1/db --logpath=/data/mongo/s1_1/log/mongo.log --logappend --fork --keyFile /data/mongo/s1_1/keyfile
mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_2/db --logpath=/data/mongo/s1_2/log/mongo.log --logappend --fork --keyFile /data/mongo/s1_2/keyfile
mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_3/db --logpath=/data/mongo/s1_3/log/mongo.log --logappend --fork --keyFile /data/mongo/s1_3/keyfile
mongod -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork --keyFile /data/mongo/config/keyfile
mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017 --keyFile /data/mongo/route/keyfile
五 应用建议
在真实业务场景中应用时,建议按需配置Replica Set 的Primary节点、Secondary节点、Arbiter节点、Election规则、OS路由规则和Collection配置。
附录:
本次安装配置清单:
序号 | 项目 | 规格 |
1 | 宿主机 | DELL N4010 |
2 | 宿主平台 | ArchLinux 201901 |
3 | 虚拟化组件 | Virtual Box 5.2 |
4 | 宿主机CPU | Inter i5 M480,2.67G |
5 | 宿主机RAM | DDR3,6GB |
6 | 服务器平台 | CentOS7,64,1104 |
7 | MongoDB版本 | mongodb-linux-x86_64-4.0.6.tgz |