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()
相关推荐
indexsunny2 小时前
互联网大厂Java面试实战:Spring Boot与微服务在电商场景中的应用解析
java·数据库·spring boot·微服务·maven·flyway·电商
zhujian826372 小时前
二十七、【鸿蒙 NEXT】如何实时查看数据库
数据库·华为·harmonyos·查看数据库
数据知道2 小时前
PostgreSQL实战:窗口函数详解
数据库·postgresql
狂龙骄子2 小时前
MySQL表字段批量修改SQL实战技巧
数据库·sql·mysql·alter table·批量修改·sql实战技巧
catchadmin2 小时前
2026 年 PHP 函数式编程 优势与实际应用
数据库·php
roman_日积跬步-终至千里2 小时前
【SQL】SQL 语句的解析顺序:理解查询执行的逻辑
java·数据库·sql
ascarl20102 小时前
达梦与 Oracle 的关系及数据库架构差异
数据库·oracle·数据库架构
Mao.O2 小时前
Redis三大缓存问题及布隆过滤器详解
数据库·redis·缓存
悟能不能悟2 小时前
在Oracle中,包分为包头(PACKAGE)和包体(PACKAGE BODY),存储过程的实现代码在包体中。以下是几种查找方法
数据库·oracle