MongoDB 5.0.9 集群分片模式部署

MongoDB 5.0.9 集群分片模式部署

  • 文档材料
  • 依赖服务
  • 集群架构
  • 创建数据路径
  • 部署 configsrv
    • 1. 配置 configsrv.conf
    • 2. 启动 configsrv 实例
    • 3. 部署 configsrv 复制集
  • 部署 shardsrv
    • 1. 配置 shardsrv.conf
    • 2. 启动 shardsrv 实例
    • 3. 部署 shardsrv 复制集
  • 部署 mongossrv
    • 1. 配置 mongossrv.conf
    • 2. 启动 mongossrv 实例
    • 3. 部署 mongossrv
  • 启用 Sharding

文档材料

  • 官方介质路径:https://www.mongodb.com/try/download/community

  • 官方部署文档:https://www.mongodb.com/docs/v5.0

  • 官方配置文件描述 - mongod.conf:https://www.mongodb.com/docs/manual/reference/configuration-options

依赖服务

  • numactl:用于关闭 NUMA 功能

  • net-snmp:mongodb 依赖包

  • cyrus-sasl && cyrus-sasl-gssapi:mongodb 管理工具依赖包

  • mongodb-database-tools:mongoDB 官方管理工具

集群架构

主机名 IP 地址 MongoDB 角色 MongoDB 分片
redis1 10.10.10.21 mongossrvconfigsvr sharedsrv1:2311 sharedsrv2:2312 sharedsrv3:2313
redis2 10.10.10.22 configsvr sharedsrv1:2321 sharedsrv2:2322 sharedsrv3:2323
redis3 10.10.10.23 configsvr sharedsrv1:2331 sharedsrv2:2332 sharedsrv3:2333

创建数据路径

  • 所有节点都需创建
mkdir -p /data/service/mongodb/mongossrv/log
mkdir -p /data/service/mongodb/configsrv/{data,log}
mkdir -p /data/service/mongodb/shardsrv1/{data,log}
mkdir -p /data/service/mongodb/shardsrv2/{data,log}
mkdir -p /data/service/mongodb/shardsrv3/{data,log}

部署 configsrv

  • configsrv 实例数量必须为奇数

1. 配置 configsrv.conf

  • 每个 configsrv 都需部署

  • bindIp 需按节点实际信息调整

  • port 需按上述规划配置

vi /data/service/mongodb/configsrv/configsrv-${configsrv-port}.conf
# 系统日志
systemLog:
  # 日志输出目标,一般配置为file,须于path同时配置
  destination: file
  # 以追加方式写入数据
  logAppend: true
  # 日志存放路径
  path: /data/service/mongodb/configsrv/log/configsrv-${configsrv-port}.log

# 存储
storage:
  # 数据存放路径
  dbPath: /data/service/mongodb/configsrv/data
  # 启动持久性日志。以确保数据文件保持有效和可恢复。
  journal: 
    enabled: true

# 进程
processManagement:
  # 以守护进程方式运行
  fork: true
  # PID 存放路径
  pidFilePath: /data/service/mongodb/configsrv/configsrv-${configsrv-port}.pid

# 网络
net:
  # 指定端口
  port: ${configsrv-port}
  # 指定 IP 地址。多个用逗号分开
  bindIp: ${configsrv-ip}

# 复制集
replication:
  # 指定复制集名称
  replSetName: config
# Sharding 架构
sharding:
  # 指定集群内此实例的角色
  clusterRole: configsvr

2. 启动 configsrv 实例

  • 每个 configsrv 都需启动

  • 禁用 NUMA,以避免其导致的性能异常

numactl --interleave=all /data/service/mongodb/mongodb5.0.9/bin/mongod --config /data/service/mongodb/configsrv/configsrv-${configsrv-port}.conf

3. 部署 configsrv 复制集

  • 可在任意节点进行操作

  • 登录 mongodb 交互界面

mongo ${configsrv-ip}:${configsrv-port}
  • 配置 configsrv 副本集

  • id 需与配置中 replSetName 参数相同

  • 后缀 priority:${number} 可增加权重,更容易被选举为 Primary

  • 后缀 arbiterOnly:true 可将实力设置为仲裁实例,则只参与仲裁,不读写数据

  • host 内参数之间,用逗号分开

rs.initiate( 
  {
    _id : "config",
      members : [
        {_id : 0, host : "${configsrv-ip}:${configsrv-port}" },
        {_id : 1, host : "${configsrv-ip}:${configsrv-port}" },
        {_id : 2, host : "${configsrv-ip}:${configsrv-port}" }
      ]
  }
)
  • 验证配置状态
rs.status()

部署 shardsrv

1. 配置 shardsrv.conf

  • 每个 shardsrv 都需部署

  • bindIp 需按节点实际信息调整

  • port 需按上述规划配置

vi /data/service/mongodb/shardsrv{1-3}/shardsrv-${shardsrv-port}.conf
# 系统日志
systemLog:
  # 日志输出目标,一般配置为file,须于path同时配置
  destination: file
  # 以追加方式写入数据
  logAppend: true
  # 日志存放路径
  path: /data/service/mongodb/shardsrv{1-3}/log/shardsrv-${shardsrv-port}.log

# 存储
storage:
  # 数据存放路径
  dbPath: /data/service/mongodb/shardsrv{1-3}/data
  # 启动持久性日志。以确保数据文件保持有效和可恢复。
  journal: 
    enabled: true

# 进程
processManagement:
  # 以守护进程方式运行
  fork: true
  # PID 存放路径
  pidFilePath: /data/service/mongodb/shardsrv{1-3}/shardsrv-${shardsrv-port}.pid

# 网络
net:
  # 指定端口
  port: ${shardsrv-port}
  # 指定 IP 地址。多个用逗号分开
  bindIp: ${shardsrv-ip}

# 复制集
replication:
  # 指定复制集名称
  # 3 个 shard 实例为 1 个复制集,而单个复制集内的所有实例需配置同一个复制集名称
  replSetName: shard{1-3}

# Sharding 架构
sharding:
  # 指定集群内此实例的角色
  clusterRole: shardsvr

2. 启动 shardsrv 实例

  • 每个 shardsrv 都需启动

  • 禁用 NUMA,以避免其导致的性能异常

numactl --interleave=all /data/service/mongodb/mongodb5.0.9/bin/mongod --config /data/service/mongodb/shardsrv{1-3}/shardsrv-${shardsrv-port}.conf

3. 部署 shardsrv 复制集

  • 可在任意节点进行操作

  • 登录 mongodb 交互界面

mongo ${shardsrv-ip}:${shardsrv-port}
  • 配置 shardsrv 副本集

  • id 需与配置中 replSetName 参数相同

  • shardsrv1

rs.initiate( 
  {
    _id : "shard1",
      members : [
        {_id : 0, host : "${shardsrv1-ip}:${shardsrv1-port}" },
        {_id : 1, host : "${shardsrv1-ip}:${shardsrv1-port}" },
        {_id : 2, host : "${shardsrv1-ip}:${shardsrv1-port}" }
      ]
  }
)
  • shardsrv2
rs.initiate( 
  {
    _id : "shard1",
      members : [
        {_id : 0, host : "${shardsrv2-ip}:${shardsrv2-port}" },
        {_id : 1, host : "${shardsrv2-ip}:${shardsrv2-port}" },
        {_id : 2, host : "${shardsrv2-ip}:${shardsrv2-port}" }
      ]
  }
)
  • shardsrv3
rs.initiate( 
  {
    _id : "shard3",
      members : [
        {_id : 0, host : "${shardsrv3-ip}:${shardsrv3-port}" },
        {_id : 1, host : "${shardsrv3-ip}:${shardsrv3-port}" },
        {_id : 2, host : "${shardsrv3-ip}:${shardsrv3-port}" }
      ]
  }
)
  • 验证配置状态
rs.status()

部署 mongossrv

1. 配置 mongossrv.conf

  • 每个 mongossrv 都需部署

  • bindIp 需按节点实际信息调整

  • port 需按上述规划配置

vi /data/service/mongodb/mongossrv/mongossrv-${mongossrv-port}.conf
# 系统日志
systemLog:
  # 日志输出目标,一般配置为file,须于path同时配置
  destination: file
  # 以追加方式写入数据
  logAppend: true
  # 日志存放路径
  path: /data/service/mongodb/mongossrv/log/mongossrv-${mongossrv-port}.log

# 进程
processManagement:
  # 以守护进程方式运行
  fork: true
  # PID 存放路径
  pidFilePath: /data/service/mongodb/mongossrv/mongossrv-${mongossrv-port}.pid

# 网络
net:
  # 指定端口
  port: ${mongossrv-port}
  # 指定 IP 地址。多个用逗号分开
  bindIp: ${mongossrv-ip}

# Sharding 架构
sharding:
  # 指定 Sharding 架构内的 configsrv
  # 用逗号隔开
  configDB: config/${configsrv1-ip}:${configsrv1-port},${configsrv2-ip}:${configsrv2-port},${configsrv3-ip}:${configsrv3-port}

2. 启动 mongossrv 实例

  • 每个 mongossrv 都需启动

  • 由于 mongossrv 只用于路由,并不存放实际数据。所以无需禁用 NUMA

  • mongossrv 需要通过 mongos 命令启动,而非 mongod

/data/service/mongodb/mongodb5.0.9/bin/mongos --config /data/service/mongodb/mongossrv/mongossrv-${mongossrv-port}.conf

3. 部署 mongossrv

  • 在 Sharding 架构中,mongossrv 之间并没有 HA 功能

  • 若需要部署 mongossrv HA,需要借助其它服务

启用 Sharding

  • 可在任意 mongossrv 实例进行操作

  • 登录 mongodb 交互界面

mongo ${mongossrv-ip}:${mongossrv-port}
  • 添加分片复制集

  • 实例之间用逗号隔开

sh.addShard( "${shard1-repliname}/${shardsrv1-ip}:${shardsrv1-port},${shardsrv2-ip}:${shardsrv2-port},${shardsrv3-ip}:${shardsrv3-port}" )
sh.addShard( "${shard2-repliname}/${shardsrv1-ip}:${shardsrv1-port},${shardsrv2-ip}:${shardsrv2-port},${shardsrv3-ip}:${shardsrv3-port}" )
sh.addShard( "${shard3-repliname}/${shardsrv1-ip}:${shardsrv1-port},${shardsrv2-ip}:${shardsrv2-port},${shardsrv3-ip}:${shardsrv3-port}" )
  • 验证分片复制集状态
sh.status()