跳到主要内容

单节点副本集

版本选择建议

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

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

服务器 IP主机角色
192.168.10.4MongoDB 单节点副本集

开始部署​

  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

创建数据库用户​

  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​

systemctl start mongodb

配置副本集​

  1. 登录 MongoDB

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

    mongosh --host 127.0.0.1 --port 27017 -u root -p 12345678 --authenticationDatabase admin
  2. 初始化单节点副本集

    在 mongosh 中执行,将 IP 地址替换为本机实际内网地址。

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

    rs.status();

    确认 members 中只有本机一个成员,等待其 stateStr 变为 PRIMARY。

  4. 退出 mongosh

    exit();

验证服务状态​

  1. 检查 MongoDB 状态

    systemctl status mongodb
  2. 测试业务库连接

    将连接地址替换为本机实际 IP,账号和密码使用创建业务用户时设置的实际值。

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

    exit();

配置日志自动轮转​

  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