离线安装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 参考

相关推荐
Ralph_Y2 小时前
C++数据库操作
开发语言·数据库·c++
Access开发易登软件2 小时前
Access 数据可视化:如何制作箱形图
前端·数据库·vba·access·access开发
啊西:2 小时前
SuperMap iObjects Java地图生成栅格瓦片并保存到mongodb
java·开发语言·mongodb
醉风塘2 小时前
MongoDB内嵌文档深度解析:使用MongoTemplate进行高效操作
数据库·mongodb
电商API_180079052472 小时前
淘宝商品数据爬虫技术实践指南
大数据·数据库·人工智能·爬虫
酸菜牛肉汤面2 小时前
17、什么是脏读?幻读?不可重复读?
java·数据库·mysql
ClouGence2 小时前
数据实时迁移同步工具 CloudCanal-v5.3.1.0 发布,支持金仓数据库
大数据·数据库·mysql·数据分析·dba
怪我冷i2 小时前
GORM 的 Migration API
数据库·postgresql·golang·ai编程·ai写作
Miss_Chenzr2 小时前
Springboot快递信息管理52c05本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot