集群介绍

数据分片(Shards)
用来保存数据,保证数据的高可用性和一致性。可以是一个单独的mongod实例,也可以是一个副本集。在生产环境下Shard一般是一个Replica Set,以防止该数据片的单点故障。所有Shard中有一个PrimaryShard,里面包含未进行划分的数据集合
配置服务器(Config servers)
保存集群的元数据(metadata),包含各个Shard的路由规则。
查询路由(Query Routers)
Mongos是Sharded cluster的访问入口,其本身并不持久化数据(Sharded cluster所有的元数据都会存储到Config Server,而用户的数据则会分散存储到各个shard)。
Mongos启动后,会从config server加载元数据,开始提供服务,将用户的请求正确路由到对应的Shard Sharding。集群可以有一个mongos,也可以有多mongos以减轻客户端请求的压力。
1. 集群规划
1.1 节点规划
| hostname | ip地址 | port:27017 | port:27018 | port:27019 |
|---|---|---|---|---|
| MongoDB-01 | 10.0.0.31 | shard01-primary | configsvr | mongos |
| MongoDB-02 | 10.0.0.32 | shard01-slave1 | configsvr | mongos |
| MongoDB-03 | 10.0.0.33 | shard01-slave2 | configsvr | mongos |
| MongoDB-04 | 10.0.0.34 | shard02-primary | / | / |
| MongoDB-05 | 10.0.0.35 | shard02-slave1 | / | / |
| MongoDB-06 | 10.0.0.36 | shard02-slave2 | / | / |
1.2 路径规划
10.0.0.31-33
| /data/{mongod,mongos,cfgsvr}/conf | 配置文件目录 |
|---|---|
| /data/{mongod,mongos,cfgsvr}/data | 数据目录 |
| /data/{mongod,mongos,cfgsvr}/log | 日志目录 |
| /data/{mongod,mongos,cfgsvr}/pid | 进程文件目录 |
| /data/{mongod,mongos,cfgsvr}/key | key目录 |
10.0.0.34-36
| /data/mongod/conf | 配置文件目录 |
|---|---|
| /data/mongod/data | 数据目录 |
| /data/mongod/log | 日志目录 |
| /data/mongod/pid | 进程文件目录 |
| /data/mongod/key | key目录 |
2.环境准备
2.1 安装mongodb软件
sql
#(1)安装依赖
[root@MongoDB-01 ~]# yum install libcurl openssl
#(2)创建mongodb用户
[root@MongoDB-01 ~]# useradd mongodb
[root@MongoDB-01 ~]# passwd mongodb
Changing password for user mongodb.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
#(3)上传mongodb-linux-x86_64-rhel70-7.0.28版本tar包、db工具包,并解压
[root@MongoDB-01 ~]# cd /usr/local/
[root@MongoDB-01 local]# ll
-rw-r--r-- 1 root root 57318277 Nov 3 23:28 mongodb-database-tools-rhel70-x86_64-100.14.0.tgz
-rw-r--r-- 1 root root 133578928 Feb 2 05:17 mongodb-linux-x86_64-rhel70-7.0.28.tgz
[root@MongoDB-01 local]# tar xf mongodb-database-tools-rhel70-x86_64-100.14.0.tgz
[root@MongoDB-01 local]# tar xf mongodb-linux-x86_64-rhel70-7.0.28.tgz
#(4)将mongodb服务目录与mongodb-tools目录软连接到/usr/local下
[root@MongoDB-01 local]# ln -s mongodb-linux-x86_64-rhel70-4.2.23 mongodb
[root@MongoDB-01 local]# ln -s mongodb-database-tools-rhel70-x86_64-100.6.1 mongodb-database-tools
[root@MongoDB-01 local]# ll /usr/local/mongo*
lrwxrwxrwx 1 root root 39 Feb 2 05:33 mongodb -> /opt/mongodb-linux-x86_64-rhel70-4.2.23
lrwxrwxrwx 1 root root 49 Feb 2 05:33 mongodb-database-tools -> /opt/mongodb-database-tools-rhel70-x86_64-100.6.1
#(5)将mongodb相关命令添加到环境变量
[root@MongoDB-01 local]# echo "export PATH=$PATH:/usr/local/mongodb/bin:/usr/local/mongodb-database-tools/bin" >> /etc/profile
[root@MongoDB-01 local]# source /etc/profile
[root@MongoDB-01 local]# mongod --version
db version v7.0.28
Build Info: {
"version": "7.0.28",
"gitVersion": "cfc346c59d2cc3dbc903507fc642e22e3097f362",
"openSSLVersion": "OpenSSL 1.0.1e-fips 11 Feb 2013",
"modules": [],
"allocator": "tcmalloc",
"environment": {
"distmod": "rhel70",
"distarch": "x86_64",
"target_arch": "x86_64"
}
}
2.3 创建相关目录
sql
#(1)10.0.0.31-33,创建数据节点、mongos节点、配置节点目录
[root@MongoDB-01 local]# mkdir /data/mongod/{data,log,conf,key,pid} -p
[root@MongoDB-01 local]# mkdir /data/mongos/{data,log,conf,key,pid} -p
[root@MongoDB-01 local]# mkdir /data/cfgsvr/{data,log,conf,key,pid} -p
[root@MongoDB-01 local]# chown -R mongodb.mongodb /data
#(2)10.0.0.34-36创建数据节点目录
[root@MongoDB-01 local]# mkdir /data/mongod/{data,log,conf,key,pid} -p
[root@MongoDB-01 local]# chown -R mongodb.mongodb /data
2.4 创建keyfile
bash
# 创建key文件,并分发到所有节点的所有key目录中
[root@MongoDB-01 local]# openssl rand -base64 756 > /data/mongod/key/keyfile
[root@MongoDB-01 local]# chmod 400 /data/mongod/key/keyfile
[root@MongoDB-01 local]# for i in {1..6};do scp /data/mongod/key/keyfile 10.0.0.3$i:/data/mongod/key;done
[root@MongoDB-01 local]# for i in {1..3};do scp /data/mongod/key/keyfile 10.0.0.3$i:/data/mongos/key;done
[root@MongoDB-01 local]# for i in {1..3};do scp /data/mongod/key/keyfile 10.0.0.3$i:/data/cfgsvr/key;done
# 所有节点刷新权限
[root@MongoDB-01 local]# chown -R mongodb.mongodb /data
3. 编辑配置文件
3.1 shard01配置文件
yaml
[root@MongoDB-01 local]# vim /data/mongod/conf/mongod.conf
systemLog:
destination: file
path: "/data/mongod/log/mongod.log"
logAppend: true
storage:
dbPath: "/data/mongod/data"
directoryPerDB: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1 #50%(RAM-1 GB)
directoryForIndexes: true
collectionConfig:
blockCompressor: zstd #从 MongoDB 4.2 开始可以使用,提供比snappy和zlib更好的压缩率,并且比zlib具有更低的CPU成本
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /data/mongod/pid/mongod.pid
net:
bindIp: 0.0.0.0
port: 27017
maxIncomingConnections: 10240
operationProfiling:
slowOpThresholdMs: 100
mode: off
security:
authorization: enabled
keyFile: /data/mongod/key/keyfile
replication:
oplogSizeMB: 8192
replSetName: shard01
sharding:
clusterRole: shardsvr
3.2 shard02配置文件
yaml
#(2)根据shard01配置文件修改以下内容
[root@MongoDB-04 local]# vim /data/mongod/conf/mongod.conf
replication:
oplogSizeMB: 8192
replSetName: shard02
3.3 config配置文件
yaml
# 根据shard01配置文件修改以下内容
[root@MongoDB-01 local]#
sed -i 's/mongod/cfgsvr/g' /data/cfgsvr/conf/cfgsvr.conf
sed -i 's/27017/27018/g' /data/cfgsvr/conf/cfgsvr.conf
sed -i 's/shard01/config/g' /data/cfgsvr/conf/cfgsvr.conf
sed -i 's/shardsvr/configsvr/g' /data/cfgsvr/conf/cfgsvr.conf
3.4 mongos配置文件
yaml
[root@MongoDB-01 local]# vim /data/mongos/conf/mongos.conf
systemLog:
destination: file
path: /data/mongos/log/mongos.log
logAppend: true
net:
bindIp: 0.0.0.0
port: 27019
security:
keyFile: /data/mongos/key/keyfile
sharding:
configDB: config/10.0.0.31:27018,10.0.0.32:27018,10.0.0.32:27018
processManagement:
fork: true
4.编辑system启动文件
4.1 shard节点启动文件
bash
[root@MongoDB-01 local]# vim /usr/lib/systemd/system/mongod.service
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
# 如果一个节点上部署了多种服务,需要调整启动顺序。对于单纯的数据节点不需要设置启动顺序
After=network.target cfgsvr.service
Before=mongos.service
Requires=cfgsvr.service
[Service]
Type=forking
User=mongodb
Group=mongodb
ExecStart=/usr/bin/numactl --interleave=all /usr/local/mongodb/bin/mongod --config /data/mongod/conf/mongod.conf
TimeoutStopSec=300
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
LimitNOFILE=65535
LimitNPROC=65535
[Install]
WantedBy=multi-user.target
4.2 mongos节点启动文件
bash
# 根据shard节点启动文件修改
[root@MongoDB-01 local]# vim /usr/lib/systemd/system/mongos.service
[Unit]
# 如果一个节点上部署了多种服务,需要调整启动顺序。对于单纯的数据节点不需要设置启动顺序
After=network.target cfgsvr.service mongod.service
Requires=cfgsvr.service mongod.service
[Service]
ExecStart=/usr/bin/numactl --interleave=all /usr/local/mongodb/bin/mongos --config /data/mongos/conf/mongos.conf
4.3 cfgsvr节点启动文件
bash
# 根据shard节点启动文件修改
[root@MongoDB-01 local]# vim /usr/lib/systemd/system/cfgsvr.service
[Unit]
# 如果一个节点上部署了多种服务,需要调整启动顺序。对于单纯的数据节点不需要设置启动顺序
After=network.target
Before=mongod.service
[Service]
ExecStart=/usr/bin/numactl --interleave=all /usr/local/mongodb/bin/mongod --config /data/cfgsvr/conf/cfgsvr.conf
4.4 重新加载启动文件
bash
[root@mongodb-01 opt]# systemctl daemon-reload
5. 集群启动
5.1 启动shard01副本集
json
#(1)启动所有shard01副本集相关实例
[root@MongoDB-01 mongod]# systemctl start mongod
#(2)初始化shard01副本集
[root@MongoDB-01 mongod]# mongosh --port 27017
test> config = {_id: 'shard01', members: [
{_id: 1, host: '10.0.0.31:27017'},
{_id: 2, host: '10.0.0.32:27017'},
{_id: 3, host: '10.0.0.33:27017'}
]}
test> rs.initiate(config)
#(3)创建root用户
shard01 [direct: primary] test> use admin
switched to db admin
shard01 [direct: primary] admin> db.createUser({user: "root",pwd: "123",roles: [ { role: "root", db: "admin" } ]})
{ ok: 1 }
#(5)从节点验证root用户登录
[root@MongoDB-02 data]# mongosh 127.0.0.1:27017/admin -u root -p 123
shard01 [direct: secondary] admin>
5.2 启动shard02副本集
json
#(1)启动所有shard02副本集相关实例
[root@MongoDB-04 mongod]# systemctl start mongod
#(2)初始化shard02副本集
[root@MongoDB-04 mongod]# mongosh --port 27017
test> config = {_id: 'shard02', members: [
{_id: 1, host: '10.0.0.34:27017'},
{_id: 2, host: '10.0.0.35:27017'},
{_id: 3, host: '10.0.0.36:27017'}
]}
test> rs.initiate(config)
#(3)创建root用户
shard02 [direct: primary] test> use admin
switched to db admin
shard02 [direct: primary] admin> db.createUser({user: "root",pwd: "123",roles: [ { role: "root", db: "admin" } ]})
{ ok: 1 }
#(4)从节点验证root用户登录
[root@MongoDB-05 data]# mongosh 127.0.0.1:27017/admin -u root -p 123
shard02 [direct: secondary] admin>
5.3 启动config_server副本集
json
#(1)启动所有config副本集相关实例
[root@MongoDB-01 mongod]# systemctl start cfgsvr
#(2)初始化config副本集
[root@MongoDB-01 mongod]# mongosh --port 27018
test> config = {_id: 'config', members: [
{_id: 1, host: '10.0.0.31:27018'},
{_id: 2, host: '10.0.0.32:27018'},
{_id: 3, host: '10.0.0.33:27018'}
]}
test> rs.initiate(config)
#(3)创建root用户
config [direct: primary] test> use admin
switched to db admin
config [direct: primary] admin> db.createUser({user: "root",pwd: "123",roles: [ { role: "root", db: "admin" } ]})
{ ok: 1 }
#(4)从节点验证root用户登录
[root@MongoDB-02 data]# mongosh 127.0.0.1:27018/admin -u root -p 123
config [direct: secondary] admin>
5.4 启动mongos节点
bash
#(1)启动所有mongos
[root@MongoDB-01 mongod]# systemctl start mongos
5.5 将分片信息添加到config服务
json
#(1)连接到mongos的admin数据库
[root@MongoDB-01 mongod]# mongosh 127.0.0.1:27019/admin -u root -p 123
#(2)添加分片信息
db.runCommand( { addshard : "shard01/10.0.0.31:27017,10.0.0.32:27017,10.0.0.33:27017",name:"shard01"} )
db.runCommand( { addshard : "shard02/10.0.0.34:27017,10.0.0.35:27017,10.0.0.36:27017",name:"shard02"} )
5.6 列出分片
json
[direct: mongos] admin> db.runCommand( { listshards : 1 } )

5.7 查看集群状态
Plain
[direct: mongos] admin> sh.status()
