温馨提示×

MongoDB在Ubuntu上的集群搭建指南

小樊
34
2025-11-11 04:19:36
栏目: 云计算

MongoDB在Ubuntu上的集群搭建指南(副本集与分片集群)

一、准备工作

1. 系统与环境要求

  • Ubuntu版本:建议使用Ubuntu 22.04 LTS及以上(兼容MongoDB最新版本)。
  • MongoDB版本:选择稳定版(如6.0+),所有节点需安装相同版本。
  • 节点规划
    • 副本集:至少3个节点(1主2从),用于高可用。
    • 分片集群:需配置服务器(3个,副本集)、分片服务器(每个分片至少3个节点,副本集)、路由服务器(1个或多个,mongos)。
  • 网络要求:节点间网络互通,关闭防火墙或开放MongoDB端口(默认27017,分片集群需额外开放配置服务器27019、mongos 27017等端口)。
  • 依赖工具apt包管理器、ssh(远程管理)、vim/nano(文本编辑)。

2. 安装MongoDB

在所有节点上执行以下命令,添加MongoDB官方源并安装:

# 导入MongoDB公钥
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
# 添加MongoDB源(Ubuntu 22.04)
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
# 更新包列表并安装
sudo apt update
sudo apt install -y mongodb-org

二、副本集集群搭建(高可用)

副本集是MongoDB的核心高可用方案,通过自动故障转移保证数据一致性。

1. 配置每个节点的mongod.conf

编辑每个节点的/etc/mongod.conf,修改以下关键参数:

storage:
  dbPath: /var/lib/mongodb  # 数据存储路径(需提前创建:sudo mkdir -p /var/lib/mongodb)
  journal:
    enabled: true  # 启用日志,保证数据持久性

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log  # 日志路径

net:
  port: 27017  # 监听端口
  bindIp: 0.0.0.0  # 允许所有IP连接(生产环境建议指定节点IP,如192.168.1.101)

replication:
  replSetName: rs0  # 副本集名称(所有节点必须一致)

2. 启动MongoDB服务

在每个节点上启动mongod并设置开机自启:

sudo systemctl start mongod
sudo systemctl enable mongod
# 检查服务状态
sudo systemctl status mongod

3. 初始化副本集

连接到任意一个节点(如节点1),进入mongo shell并初始化:

mongo --host <节点1_IP> --port 27017

在shell中执行初始化命令(替换为实际节点IP):

rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "<节点1_IP>:27017" },
    { _id: 1, host: "<节点2_IP>:27017" },
    { _id: 2, host: "<节点3_IP>:27017" }
  ]
})

初始化成功后,会返回"ok": 1

4. 验证副本集状态

在mongo shell中执行rs.status(),检查:

  • 所有节点状态为SECONDARYPRIMARY(至少1个主节点)。
  • health字段为1(健康)。

5. 测试数据同步

在主节点插入数据,从节点查询验证:

// 主节点(PRIMARY)插入数据
use testdb
db.testcoll.insert({ name: "MongoDB Replica Set", version: "6.0" })

// 从节点(SECONDARY)查询(需开启slaveOk)
rs.slaveOk()  // 允许从节点读取
db.testcoll.find()

三、分片集群搭建(水平扩展)

分片集群通过将数据分散到多个分片,实现水平扩展,适用于大规模数据场景。

1. 配置配置服务器(Config Server)

配置服务器存储集群元数据(如分片信息、chunk分布),需3个节点组成副本集。

1.1 配置每个配置服务器的mongod.conf

编辑每个配置服务器的/etc/mongod.conf

storage:
  dbPath: /var/lib/mongodb/configdb  # 配置服务器数据路径
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/configsvr.log

net:
  port: 27019  # 配置服务器端口
  bindIp: 0.0.0.0

replication:
  replSetName: configReplSet  # 配置服务器副本集名称
sharding:
  clusterRole: configsvr  # 指定为配置服务器角色

1.2 启动配置服务器并初始化副本集

# 启动配置服务器(每个节点)
sudo systemctl start mongod
sudo systemctl enable mongod

# 连接到任意配置服务器,初始化副本集
mongo --port 27019
rs.initiate({
  _id: "configReplSet",
  configsvr: true,
  members: [
    { _id: 0, host: "cfg1.example.com:27019" },
    { _id: 1, host: "cfg2.example.com:27019" },
    { _id: 2, host: "cfg3.example.com:27019" }
  ]
})

2. 配置分片服务器(Shard Server)

每个分片是一个副本集,用于存储实际数据。

2.1 配置每个分片服务器的mongod.conf

编辑每个分片服务器的/etc/mongod.conf(以分片1为例):

storage:
  dbPath: /var/lib/mongodb/shard1  # 分片数据路径
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/shard1.log

net:
  port: 27018  # 分片端口
  bindIp: 0.0.0.0

replication:
  replSetName: shard1ReplSet  # 分片副本集名称
sharding:
  clusterRole: shardsvr  # 指定为分片角色

2.2 启动分片服务器并初始化副本集

# 启动分片服务器(每个节点)
sudo systemctl start mongod
sudo systemctl enable mongod

# 连接到任意分片服务器,初始化副本集
mongo --port 27018
rs.initiate({
  _id: "shard1ReplSet",
  members: [
    { _id: 0, host: "shard1a.example.com:27018" },
    { _id: 1, host: "shard1b.example.com:27018" },
    { _id: 2, host: "shard1c.example.com:27018" }
  ]
})

3. 配置路由服务器(Mongos)

mongos是应用程序与分片集群的接口,负责路由请求。

3.1 启动mongos服务

编辑/etc/mongod.conf(mongos无需单独配置文件,通过命令行参数启动):

mongos --configdb configReplSet/cfg1.example.com:27019,cfg2.example.com:27019,cfg3.example.com:27019 --port 27017

(若需后台运行,可使用--fork参数,并指定日志路径--logpath /var/log/mongodb/mongos.log

4. 添加分片到集群

连接到mongos,添加分片:

mongo --port 27017
sh.addShard("shard1ReplSet/shard1a.example.com:27018,shard1b.example.com:27018,shard1c.example.com:27018")

5. 启用数据库与集合分片

5.1 启用数据库分片

sh.enableSharding("mydatabase")  // 启用数据库分片

5.2 对集合分片(选择合适的分片键)

sh.shardCollection("mydatabase.mycollection", { "user_id": 1 })  // 按user_id分片

注意:分片键选择至关重要,需根据查询模式选择高区分度、低频率变更的字段(如user_idorder_id)。

四、安全配置(可选但推荐)

1. 创建管理员用户

连接到mongos,创建管理员账户:

mongo --port 27017
use admin
db.createUser({
  user: "admin",
  pwd: "StrongPassword123!",
  roles: ["root"]  // 全局管理员
})

2. 启用身份验证

修改所有节点的/etc/mongod.conf,添加:

security:
  authorization: enabled

重启mongod服务:

sudo systemctl restart mongod

3. 连接认证

客户端连接时需指定用户名密码:

mongo --port 27017 -u admin -p StrongPassword123 --authenticationDatabase admin

五、验证集群状态

1. 副本集验证

mongo --port 27017
rs.status()  # 检查副本集节点状态

2. 分片集群验证

mongo --port 27017
sh.status()  # 查看分片集群状态(包括分片、chunk分布)

3. 数据写入与查询

use mydatabase
db.mycollection.insert({ user_id: 1, name: "Alice" })
db.mycollection.find().explain("executionStats")  # 查看查询是否路由到正确分片

六、常见问题排查

1. 节点无法连接

  • 检查防火墙是否开放对应端口(27017、27019、27017等)。
  • 检查bindIp配置是否允许远程连接(生产环境建议指定节点IP)。

2. 副本集初始化失败

  • 确保所有节点replSetName一致。
  • 确保至少3个数据承载节点(或2个数据节点+1个仲裁节点)。

3. 分片集群无法添加分片

  • 确保mongos配置了正确的configdb(3个配置服务器)。
  • 确保分片服务器已启动并组成副本集。

通过以上步骤,可在Ubuntu上搭建高可用的MongoDB副本集或水平扩展的分片集群。根据业务需求选择合适的集群类型,并定期监控集群状态(如使用mongostatmongotop或第三方工具)。

0