OpenEuler 服务器离线安装 MongoDB 8.0 集群部署
- [OpenEuler 服务器离线安装 MongoDB 8.0 集群部署文档](#OpenEuler 服务器离线安装 MongoDB 8.0 集群部署文档)
- 一、环境准备
- [1.1 系统要求](#1.1 系统要求)
- [1.2 网络规划](#1.2 网络规划)
- [1.3 下载离线包(需要网络环境)](#1.3 下载离线包(需要网络环境))
- 二、安装部署
- [2.1 传输文件到所有节点](#2.1 传输文件到所有节点)
- [2.2 所有节点通用安装步骤](#2.2 所有节点通用安装步骤)
- 三、分阶段部署
- [3.1 第一阶段:无认证初始化](#3.1 第一阶段:无认证初始化)
- [3.1.1 创建无认证配置文件(所有节点)](#3.1.1 创建无认证配置文件(所有节点))
- [3.1.2 启动所有节点](#3.1.2 启动所有节点)
- [3.1.3 初始化副本集(在主节点执行)](#3.1.3 初始化副本集(在主节点执行))
- [3.1.4 创建管理员用户](#3.1.4 创建管理员用户)
- [3.2 第二阶段:启用认证](#3.2 第二阶段:启用认证)
- [3.2.1 生成并分发 keyFile](#3.2.1 生成并分发 keyFile)
- [3.2.2 创建生产配置文件(所有节点)](#3.2.2 创建生产配置文件(所有节点))
- [3.2.3 重启所有服务](#3.2.3 重启所有服务)
- [3.1 第一阶段:无认证初始化](#3.1 第一阶段:无认证初始化)
- 四、验证部署
- [4.1 测试认证连接](#4.1 测试认证连接)
- [4.2 测试数据复制](#4.2 测试数据复制)
- 五、管理和监控
- [5.1 创建集群管理脚本](#5.1 创建集群管理脚本)
- [5.2 常用管理命令](#5.2 常用管理命令)
- 六、故障排除
- [6.1 常见问题及解决方案](#6.1 常见问题及解决方案)
- [问题1:无法启动 MongoDB](#问题1:无法启动 MongoDB)
- 问题2:副本集成员无法连接
- 问题3:认证失败
- [6.2 重置副本集](#6.2 重置副本集)
- [6.1 常见问题及解决方案](#6.1 常见问题及解决方案)
- 七、优化配置
- [7.1 内核参数优化](#7.1 内核参数优化)
- [7.2 文件描述符限制](#7.2 文件描述符限制)
- [7.3 MongoDB 配置优化](#7.3 MongoDB 配置优化)
- 八、备份与恢复
- [8.1 创建备份脚本](#8.1 创建备份脚本)
- 九、附录
- [9.1 配置文件模板](#9.1 配置文件模板)
- [9.2 重要文件位置](#9.2 重要文件位置)
- [9.3 参考](#9.3 参考)
- 一、环境准备
一、环境准备
1.1 系统要求
- 操作系统:OpenEuler 20.03/22.03 LTS
- 服务器数量:3台(推荐配置)
- 网络要求:服务器间网络互通,防火墙开放27017端口
- 磁盘空间:至少10GB可用空间
- 内存要求:至少4GB RAM
1.2 网络规划
主节点:192.168.1.110 (mongodb-node1)
从节点1:192.168.1.111 (mongodb-node2)
从节点2:192.168.1.112 (mongodb-node3)
副本集名称:rs0
端口:27017
1.3 下载离线包(需要网络环境)
在有网络的机器上去官网下载所需软件包:
bash
# 创建下载目录
mkdir -p /opt/offline-packages
cd /opt/offline-packages
# 下载 MongoDB 8.0
mongodb-org-server-8.2.2-1.el9.x86_64.rpm
# 下载 MongoDB Shell (mongosh)
mongosh-2.5.10-linux-x64.tgz
# 下载 OpenEuler 依赖包
yum install --downloadonly --downloaddir=./deps \
cyrus-sasl \
cyrus-sasl-gssapi \
cyrus-sasl-plain \
openssl \
libcurl \
numactl \
numactl-libs \
libicu
二、安装部署
2.1 传输文件到所有节点
bash
# 将文件传输到所有服务器
for node in 192.168.1.110 192.168.1.111 192.168.1.112; do
scp /opt/offline-packages/mongodb-org-server-8.2.2-1.el9.x86_64.rpm root@$node:/opt/
scp /opt/offline-packages/mongosh-2.5.10-linux-x64.tgz root@$node:/opt/
scp -r /opt/offline-packages/deps root@$node:/opt/
done
2.2 所有节点通用安装步骤
在所有三台服务器上执行:
bash
# 1. 安装依赖包
cd /opt
rpm -ivh deps/*.rpm --nodeps --force
# 2. 安装 MongoDB
rpm -ivh mongodb-org-server-8.2.2-1.el9.x86_64.rpm --nodeps --force
# 3. 安装 MongoDB Shell (mongosh)
tar -xvf mongosh-2.5.10-linux-x64.tgz -C /opt/
mv /opt/mongosh-2.5.10-linux-x64.tgz /opt/mongosh
ln -sf /opt/mongosh/bin/mongosh /usr/local/bin/mongo
ln -sf /opt/mongosh/bin/mongosh /usr/local/bin/mongosh
三、分阶段部署
3.1 第一阶段:无认证初始化
3.1.1 创建无认证配置文件(所有节点)
bash
# 新建目录
mkdir -p /data1/mongodb/{data,logs}
chown -R mongod:mongod /data1/mongodb
cat > /etc/mongod.conf << EOF
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data1/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /data1/mongodb/data
# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
# 配置完集群再开启
#security:
#security:
# keyFile: /data1/mongodb/keyfile
# authorization: enabled
#operationProfiling:
#replication:
replication:
replSetName: rs0
#sharding:
## Enterprise-Only Options
#auditLog:
EOF
3.1.2 启动所有节点
bash
# 停止可能存在的旧服务
systemctl stop mongod 2>/dev/null || true
# 使用无认证配置启动
systemctl enable mongod && systemctl start mongod && systemctl status mongod
3.1.3 初始化副本集(在主节点执行)
bash
# 在 192.168.1.110 节点执行
mongosh --host 192.168.1.110 --eval "
rs.initiate({
_id: 'rs0',
members: [
{ _id: 0, host: '192.168.1.110:27017' },
{ _id: 1, host: '192.168.1.111:27017' },
{ _id: 2, host: '192.168.1.112:27017' }
]
})"
# 等待选举完成(30秒)
sleep 30
# 查看状态
mongosh --host 192.168.1.110 --eval "rs.status()"
3.1.4 创建管理员用户
bash
# 确定 Primary 节点
PRIMARY=$(mongosh --host 192.168.1.110 --quiet --eval "rs.isMaster().primary" | cut -d: -f1)
echo "Primary节点: $PRIMARY"
# 创建管理员用户(使用强密码替换 'MongoDB@Admin123')
mongosh --host $PRIMARY --eval "
use admin
db.createUser({
user: 'admin',
pwd: 'MongoDB@Admin123',
roles: [{ role: 'root', db: 'admin' }],
mechanisms: ['SCRAM-SHA-256']
})"
3.2 第二阶段:启用认证
3.2.1 生成并分发 keyFile
bash
# 在主节点生成 keyFile
openssl rand -base64 756 > /data1/mongodb/keyfile
chmod 400 /data1/mongodb/keyfile
chown -R mongod:mongod /data1/mongodb
# 分发到其他节点
scp /data1/mongodb/keyfile root@192.168.1.111:/data1/mongodb
scp /data1/mongodb/keyfile root@192.168.1.112:/data1/mongodb
# 在其他节点设置权限
ssh root@192.168.1.111 "chmod 400 /data1/mongodb/keyfile && chown mongod:mongod /data1/mongodb/keyfile"
ssh root@192.168.1.112 "chmod 400 /data1/mongodb/keyfile && chown mongod:mongod /data1/mongodb/keyfile"
3.2.2 创建生产配置文件(所有节点)
bash
cat > /etc/mongod.conf << EOF
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data1/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /data1/mongodb/data
# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
# 配置完集群再开启
#security:
#security:
# keyFile: /data1/mongodb/keyfile
# authorization: enabled
#operationProfiling:
#replication:
replication:
replSetName: rs0
#sharding:
## Enterprise-Only Options
#auditLog:
EOF
3.2.3 重启所有服务
bash
# 重启
systemctl restart mongod
四、验证部署
4.1 测试认证连接
bash
# 测试连接和基本操作
mongosh --host 192.168.1.110 -u admin -p 'MongoDB@Admin123' --authenticationDatabase admin --eval "
print('=== 连接测试 ===');
db.runCommand({ping: 1});
print('=== 副本集状态 ===');
rs.status();
print('=== 用户列表 ===');
use admin;
db.getUsers();
"
4.2 测试数据复制
bash
# 写入测试数据
mongosh --host 192.168.1.110 -u admin -p 'MongoDB@Admin123' --authenticationDatabase admin --eval "
use testdb;
db.products.insertOne({name: '测试产品', price: 100, timestamp: new Date()});
print('数据写入成功');
"
# 在从节点读取数据
mongosh --host 192.168.1.111 -u admin -p 'MongoDB@Admin123' --authenticationDatabase admin --eval "
rs.secondaryOk();
use testdb;
db.products.find();
"
五、管理和监控
5.1 创建集群管理脚本
bash
cat > /opt/mongodb/manage_cluster.sh << 'EOF'
#!/bin/bash
NODES=("192.168.1.110" "192.168.1.111" "192.168.1.112")
USER="admin"
PASSWORD="MongoDB@Admin123"
case "$1" in
status)
echo "=== 集群状态 ==="
for node in "${NODES[@]}"; do
echo -n "节点 $node: "
if mongosh --host $node -u $USER -p $PASSWORD --authenticationDatabase admin --quiet --eval "db.runCommand({ping:1})" &>/dev/null; then
STATE=$(mongosh --host $node -u $USER -p $PASSWORD --authenticationDatabase admin --quiet --eval "rs.status().myState")
case $STATE in
1) echo "PRIMARY" ;;
2) echo "SECONDARY" ;;
*) echo "状态码: $STATE" ;;
esac
else
echo "离线"
fi
done
;;
restart)
echo "=== 重启集群 ==="
for node in "${NODES[@]}"; do
echo "重启节点 $node..."
ssh root@$node "systemctl restart mongod"
done
;;
stop)
echo "=== 停止集群 ==="
for node in "${NODES[@]}"; do
echo "停止节点 $node..."
ssh root@$node "systemctl stop mongod"
done
;;
start)
echo "=== 启动集群 ==="
for node in "${NODES[@]}"; do
echo "启动节点 $node..."
ssh root@$node "systemctl start mongod"
done
;;
*)
echo "用法: $0 {status|start|stop|restart}"
exit 1
;;
esac
EOF
chmod +x /opt/mongodb/manage_cluster.sh
5.2 常用管理命令
bash
# 查看集群状态
/opt/mongodb/manage_cluster.sh status
# 重启集群
/opt/mongodb/manage_cluster.sh restart
# 查看日志
tail -f /data1/mongodb/mongod.log
# 查看服务状态
systemctl status mongod
# 查看端口监听
netstat -tlnp | grep 27017
六、故障排除
6.1 常见问题及解决方案
问题1:无法启动 MongoDB
bash
# 检查错误日志
tail -f /data1/mongodb/mongod.log
# 检查权限
ls -la /data1/mongodb
# 检查端口占用
netstat -tlnp | grep 27017
问题2:副本集成员无法连接
bash
# 检查网络连通性
ping 192.168.1.111
telnet 192.168.1.111 27017
# 检查防火墙
firewall-cmd --list-ports | grep 27017
问题3:认证失败
bash
# 验证用户名密码
mongosh --host 192.168.1.110 -u admin -p '密码' --authenticationDatabase admin --eval "db.runCommand({ping:1})"
# 检查 keyFile 权限
ls -la /data1/mongodb/keyfile
6.2 重置副本集
bash
# 如果需要完全重新初始化
# 1. 停止所有节点
systemctl stop mongod
# 2. 备份并清理数据目录
mv /data1/mongodb/data /data1/mongodb/data_backup
mkdir -p /data1/mongodb/data
chown -R mongod:mongod /data1/mongodb/data
# 3. 重新从 "3.1 第一阶段" 开始
七、优化配置
7.1 内核参数优化
bash
cat >> /etc/sysctl.conf << 'EOF'
# MongoDB 优化参数
vm.swappiness = 1
net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 120
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
EOF
sysctl -p
7.2 文件描述符限制
bash
cat >> /etc/security/limits.conf << 'EOF'
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000
EOF
7.3 MongoDB 配置优化
bash
# 修改 /etc/mongod.conf 添加以下内容
cat >> /etc/mongod.conf << 'EOF'
# 性能优化
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 1 # 根据内存调整,建议是内存的50%
journalCompressor: snappy
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100
rateLimit: 100
EOF
八、备份与恢复
8.1 创建备份脚本
bash
cat > /data1/mongodb/backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/backup/mongodb"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_PATH="$BACKUP_DIR/$DATE"
# 创建备份目录
mkdir -p $BACKUP_PATH
# 执行备份
mongodump --host 192.168.1.110 -u admin -p 'MongoDB@Admin123' --authenticationDatabase admin --oplog --gzip --out $BACKUP_PATH
# 备份 keyFile
cp /data1/mongodb/keyfile $BACKUP_PATH/
# 保留最近7天的备份
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;
echo "备份完成: $BACKUP_PATH"
EOF
chmod +x /data1/mongodb/backup.sh
九、附录
9.1 配置文件模板
完整配置文件模板位于 /etc/mongod.conf
9.2 重要文件位置
- 数据目录:
/data1/mongodb/data - 日志文件:
/data1/mongodb/mongod.log - 配置文件:
/etc/mongod.conf - keyFile:
/data1/mongodb/keyfile
9.3 参考
- MongoDB 官方文档:https://docs.mongodb.com
- OpenEuler 官方文档:https://docs.openeuler.org