MongoDB分片集群部署

集群介绍

数据分片(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()
相关推荐
小陈工2 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花7 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸7 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain7 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希7 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神8 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员8 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java8 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿8 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴8 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存