跳到主要内容

三节点副本集

版本选择建议

HAP 全新部署,且所有环境(含测试环境)均采用集群部署、MongoDB 均独立部署时,可使用 MongoDB 8.3。

若客户已有环境使用 MongoDB 4.4、任一环境采用 HAP 单机部署,或需要与现有 HAP 单机环境、MongoDB 4.4 环境进行数据迁移,则继续使用 MongoDB 4.4,保持各套环境的数据库版本一致。

服务器 IP主机角色
192.168.10.4MongoDB Replica Set Node01
192.168.10.5MongoDB Replica Set Node02
192.168.10.6MongoDB Replica Set Node03

开始部署​

执行范围

本节步骤须在 Node01、Node02、Node03 三台服务器上分别执行,步骤与配置内容相同。

  1. 下载 MongoDB 二进制安装包并解压到安装目录

    1. 下载安装包

      wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel8-8.3.13.tgz
    2. 创建安装目录

      mkdir -p /usr/local/mongodb
    3. 解压到安装目录

      tar -zxf mongodb-linux-x86_64-rhel8-8.3.13.tgz --strip-components=1 -C /usr/local/mongodb
  2. 下载 mongosh 二进制安装包

    1. 下载安装包

      wget https://downloads.mongodb.com/compass/mongosh-2.14.1-linux-x64.tgz
    2. 解压安装包

      tar -zxf mongosh-2.14.1-linux-x64.tgz
    3. 安装到 /usr/local/bin

      cp mongosh-2.14.1-linux-x64/bin/mongosh /usr/local/bin/mongosh
      chmod 755 /usr/local/bin/mongosh
  3. 检查 MongoDB 和 mongosh 版本

    /usr/local/mongodb/bin/mongod --version
    mongosh --version

    确认两个命令均能正常输出版本号后,再继续后续步骤。若提示缺少共享库,先补齐目标系统的运行依赖。

  4. 创建系统用户 mongodb

    useradd -U -M -s /sbin/nologin mongodb
  5. 创建数据、日志目录并授予权限

    mkdir -p /data/mongodb/ /data/logs/mongodb
    echo '1/3GWm7LjfCX/K2NOhv0evgBWan+KNX' > /data/mongodb/keyfile
    chmod 400 /data/mongodb/keyfile
    chown -R mongodb:mongodb /usr/local/mongodb/ /data/mongodb/ /data/logs/mongodb
  6. 启用透明大页(THP)

    MongoDB 8.3 建议启用 THP,在启动 MongoDB 前通过 systemd 服务完成配置。

    cat > /etc/systemd/system/enable-thp.service <<'EOF'
    [Unit]
    Description=Enable Transparent Huge Pages (THP) for MongoDB 8.3
    DefaultDependencies=no
    After=sysinit.target local-fs.target
    Before=mongodb.service

    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/bin/sh -c 'echo always > /sys/kernel/mm/transparent_hugepage/enabled'
    ExecStart=/bin/sh -c 'echo defer+madvise > /sys/kernel/mm/transparent_hugepage/defrag'
    ExecStart=/bin/sh -c 'echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none'
    ExecStart=/bin/sh -c 'echo 1 > /proc/sys/vm/overcommit_memory'

    [Install]
    WantedBy=basic.target
    EOF

    systemctl daemon-reload
    systemctl enable --now enable-thp
  7. 创建 MongoDB 配置文件

    cat > /etc/mongod.conf <<'EOF'
    systemLog:
    destination: file
    path: /data/logs/mongodb/mongodb.log
    logAppend: true
    logRotate: reopen
    storage:
    dbPath: /data/mongodb
    net:
    port: 27017
    bindIp: 0.0.0.0
    security:
    authorization: enabled
    keyFile: /data/mongodb/keyfile
    replication:
    replSetName: local-mongodb-one
    setParameter:
    disableSplitHorizonIPCheck: true
    EOF
  8. 配置 systemd 管理文件

    cat > /etc/systemd/system/mongodb.service <<'EOF'
    [Unit]
    Description=MongoDB
    After=network-online.target enable-thp.service
    Wants=network-online.target
    Requires=enable-thp.service
    [Service]
    User=mongodb
    Group=mongodb
    Environment="GLIBC_TUNABLES=glibc.pthread.rseq=0"
    LimitNOFILE=1000000
    LimitNPROC=1000000
    LimitMEMLOCK=infinity
    ExecStart=/usr/local/mongodb/bin/mongod --config /etc/mongod.conf
    ExecStop=/usr/bin/kill $MAINPID
    Restart=on-failure
    RestartSec=5
    TimeoutStopSec=300
    [Install]
    WantedBy=multi-user.target
    EOF
  9. 加入开机自启动

    # 完成后续创建用户步骤后再启动服务
    systemctl daemon-reload
    systemctl enable mongodb

创建数据库用户​

在 MongoDB Replica Set Node01 节点上操作

  1. 临时启动一个未开启连接认证的 MongoDB 服务

    su -c '/usr/local/mongodb/bin/mongod --fork --logpath /data/logs/mongodb/mongodb.log --logappend --dbpath /data/mongodb --noauth --port 27017 --bind_ip 127.0.0.1' -s /bin/bash mongodb
  2. 登录 MongoDB

    在系统终端执行:

    mongosh --host 127.0.0.1 --port 27017

    后续创建用户的语句在 mongosh 中执行。

  3. 创建管理员用户

    db.getSiblingDB('admin').createUser({
    user: 'root',
    pwd: '12345678',
    roles: [{role: 'root', db: 'admin'}],
    });
    • 命令中指定的 MongoDB admin 库权限 root 用户密码为 12345678,实际部署必须修改为强口令。
  4. 创建业务用户

    var businessUser = "hap";
    var businessPassword = "123456";
    var databases = [
    "MDLicense",
    "ClientLicense",
    "commonbase",
    "MDAlert",
    "mdapproles",
    "mdapprove",
    "mdapps",
    "mdattachment",
    "mdcalendar",
    "mdcategory",
    "MDChatTop",
    "mdcheck",
    "mddossier",
    "mdemail",
    "mdform",
    "MDGroup",
    "mdgroups",
    "MDHistory",
    "mdIdentification",
    "mdinbox",
    "mdkc",
    "mdmap",
    "mdmobileaddress",
    "MDNotification",
    "mdpost",
    "mdreportdata",
    "mdroles",
    "mdsearch",
    "mdservicedata",
    "mdsms",
    "MDSso",
    "mdtag",
    "mdtransfer",
    "MDUser",
    "mdworkflow",
    "mdworksheet",
    "mdworkweixin",
    "mdwsrows",
    "pushlog",
    "taskcenter",
    "mdintegration",
    "mdactionlog",
    "mdworksheetlog",
    "mdworksheetsearch",
    "mddatapipeline",
    "mdwfplugin",
    "mdpayment",
    "mdwfai",
    "mdopenauth",
    "mdaisearch",
    "MDAgentInfra"
    ];
    for (var i = 0; i < databases.length; i++) {
    var database = databases[i];
    db.getSiblingDB(database).createUser({
    user: businessUser,
    pwd: businessPassword,
    roles: [{role: "readWrite", db: database}]
    });
    }
    • 命令中指定的 MongoDB 业务库权限 hap 用户密码为 123456,所有业务库使用相同的账号和密码,实际部署必须修改为强口令。
    • 若密码中包含特殊字符,仅允许 - 或 _,禁止使用 @ ! # & 等字符,以避免兼容性问题。
  5. 退出 mongosh

    exit();
  6. 关闭临时启动的 MongoDB

    回到系统终端执行:

    su -c '/usr/local/mongodb/bin/mongod --shutdown --dbpath /data/mongodb' -s /bin/bash mongodb

启动 MongoDB​

三台部署 MongoDB 的服务器上操作

systemctl start mongodb

配置副本集​

在 MongoDB Replica Set Node01 节点上操作

  1. 登录 MongoDB

    将账号和密码替换为创建管理员用户时设置的实际值。

    mongosh --host 127.0.0.1 --port 27017 -u root -p 12345678 --authenticationDatabase admin
  2. 配置副本集

    执行前,将成员节点中的 IP 地址修改为实际的服务器地址,并确认三台服务器之间的 TCP 27017 端口互通。

    rs.initiate({
    _id: 'local-mongodb-one',
    members: [
    {_id: 1, host: '192.168.10.4:27017'},
    {_id: 2, host: '192.168.10.5:27017'},
    {_id: 3, host: '192.168.10.6:27017'},
    ],
    });
  3. 确认副本集状态

    rs.status();

    等待选举和同步完成,正常状态为一个 PRIMARY 和两个 SECONDARY。

  4. 退出管理员会话

    exit();
  5. 测试业务库连接

    在系统终端执行,将连接地址替换为实际 IP,账号和密码使用创建业务用户时设置的实际值。

    mongosh 'mongodb://192.168.10.4:27017,192.168.10.5:27017,192.168.10.6:27017/?replicaSet=local-mongodb-one' -u hap -p 123456 --authenticationDatabase mdwsrows
  6. 退出 mongosh

    exit();

配置日志自动轮转​

Node01、Node02、Node03 三台服务器都必须配置日志自动轮转,步骤与配置内容相同。

  1. 检查所需命令

    /usr/sbin/logrotate --version
    gzip --version
    /usr/bin/systemctl --version
  2. 创建日志轮转配置

    历史日志按轮转前一天的日期命名,最多保留 180 份,超出后自动删除最旧的一份。最近一份不压缩,其余历史日志自动使用 gzip 压缩。

    cat > /etc/mongodb-logrotate.conf <<'EOF'
    /data/logs/mongodb/mongodb.log {
    daily
    rotate 180
    dateext
    dateformat -%Y-%m-%d
    dateyesterday
    missingok
    notifempty
    compress
    delaycompress
    su mongodb mongodb
    create 0640 mongodb mongodb
    sharedscripts
    postrotate
    if /usr/bin/systemctl is-active --quiet mongodb.service; then
    /usr/bin/systemctl kill --kill-who=main --signal=SIGUSR1 mongodb.service
    fi
    endscript
    }
    EOF
  3. 创建日志轮转服务

    cat > /etc/systemd/system/mongodb-logrotate.service <<'EOF'
    [Unit]
    Description=Rotate MongoDB logs
    After=mongodb.service

    [Service]
    Type=oneshot
    ExecStart=/usr/sbin/logrotate --state /var/lib/mongodb-logrotate.status /etc/mongodb-logrotate.conf
    EOF
  4. 创建定时任务

    按服务器本地时间每天 00:00 附近执行一次。关机期间错过的任务会在恢复后补执行一次。

    cat > /etc/systemd/system/mongodb-logrotate.timer <<'EOF'
    [Unit]
    Description=Rotate MongoDB logs daily

    [Timer]
    OnCalendar=*-*-* 00:00:00
    Persistent=true

    [Install]
    WantedBy=timers.target
    EOF
  5. 检查配置并验证轮转

    检查 systemd 服务和定时任务配置:

    systemd-analyze verify /etc/systemd/system/mongodb-logrotate.service /etc/systemd/system/mongodb-logrotate.timer

    检查轮转配置,不修改日志:

    /usr/sbin/logrotate --debug --state /var/lib/mongodb-logrotate.status /etc/mongodb-logrotate.conf

    检查通过后,手动执行一次轮转;当天已轮转时不要重复执行,以免日期文件名冲突:

    /usr/sbin/logrotate --force --verbose --state /var/lib/mongodb-logrotate.status /etc/mongodb-logrotate.conf

    查看日志文件,确认生成 mongodb.log-YYYY-MM-DD:

    ls -lh /data/logs/mongodb/mongodb.log*

    例如,11 月 5 日零点轮转生成 mongodb.log-2026-11-04,到下一次轮转时压缩为 mongodb.log-2026-11-04.gz。

    查看当前日志,确认新的 mongodb.log 持续写入:

    tail -f /data/logs/mongodb/mongodb.log

    看到新日志后,按 Ctrl+C 退出查看。

  6. 启用定时任务

    systemctl daemon-reload
    systemctl enable --now mongodb-logrotate.timer

    查看定时任务,确认 NEXT 列显示下次执行时间:

    systemctl list-timers mongodb-logrotate.timer

    定时任务执行后,可查看执行记录:

    journalctl -u mongodb-logrotate.service -n 20 --no-pager