离线安装MongoDB集群

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 重启所有服务)
    • 四、验证部署
      • [4.1 测试认证连接](#4.1 测试认证连接)
      • [4.2 测试数据复制](#4.2 测试数据复制)
    • 五、管理和监控
      • [5.1 创建集群管理脚本](#5.1 创建集群管理脚本)
      • [5.2 常用管理命令](#5.2 常用管理命令)
    • 六、故障排除
    • 七、优化配置
      • [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 参考

相关推荐
ictI CABL5 小时前
redis连接服务
数据库·redis·bootstrap
苍煜5 小时前
SpringBoot单体应用到分布式下的数据库锁、事务、Redis事务、分布式锁、分布式事务协调
数据库·spring boot·分布式
且走且珍惜6 小时前
fdsad
mongodb
xmjd msup6 小时前
mysql的分区表
数据库·mysql
Lyyaoo.6 小时前
【JAVA Spring面经】Spring 事务失效情况
java·数据库·spring
MeAT ITEM6 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dovens6 小时前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
IOT.FIVE.NO.16 小时前
claude code desktop cowork报错解决和记录Workspace..The isolated Linux environment ...
linux·服务器·数据库
Rick19936 小时前
mysql 慢查询怎么快速定位
android·数据库·mysql
科技小花13 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化