三节点副本集
HAP 全新部署,且所有环境(含测试环境)均采用集群部署、MongoDB 均独立部署时,可使用 MongoDB 8.3。
若客户已有环境使用 MongoDB 4.4、任一环境采用 HAP 单机部署,或需要与现有 HAP 单机环境、MongoDB 4.4 环境进行数据迁移,则继续使用 MongoDB 4.4,保持各套环境的数据库版本一致。
| 服务器 IP | 主机角色 |
|---|---|
| 192.168.10.4 | MongoDB Replica Set Node01 |
| 192.168.10.5 | MongoDB Replica Set Node02 |
| 192.168.10.6 | MongoDB Replica Set Node03 |
开始部署
本节步骤须在 Node01、Node02、Node03 三台服务器上分别执行,步骤与配置内容相同。
-
下载 MongoDB 二进制安装包并解压到安装目录
- RHEL 8 x64
- RHEL 9.3 x64
- RHEL 10 x64
- Debian 12 x64
- Ubuntu 24.04 x64
- 其他
-
下载安装包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel8-8.3.13.tgz -
创建安装目录
mkdir -p /usr/local/mongodb -
解压到安装目录
tar -zxf mongodb-linux-x86_64-rhel8-8.3.13.tgz --strip-components=1 -C /usr/local/mongodb
-
下载安装包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel93-8.3.13.tgz -
创建安装目录
mkdir -p /usr/local/mongodb -
解压到安装目录
tar -zxf mongodb-linux-x86_64-rhel93-8.3.13.tgz --strip-components=1 -C /usr/local/mongodb
-
下载安装包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel10-8.3.13.tgz -
创建安装目录
mkdir -p /usr/local/mongodb -
解压到安装目录
tar -zxf mongodb-linux-x86_64-rhel10-8.3.13.tgz --strip-components=1 -C /usr/local/mongodb
-
下载安装包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-debian12-8.3.13.tgz -
创建安装目录
mkdir -p /usr/local/mongodb -
解压到安装目录
tar -zxf mongodb-linux-x86_64-debian12-8.3.13.tgz --strip-components=1 -C /usr/local/mongodb
-
下载安装包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2404-8.3.13.tgz -
创建安装目录
mkdir -p /usr/local/mongodb -
解压到安装目录
tar -zxf mongodb-linux-x86_64-ubuntu2404-8.3.13.tgz --strip-components=1 -C /usr/local/mongodb
-
Debian 13 可尝试使用 Debian 12 的安装包进行部署测试。
-
Ubuntu 26.04 可尝试使用 Ubuntu 24.04 的安装包进行部署测试。
-
国产系统兼容性:麒麟、统信 UOS、欧拉等系统,若当前版本兼容 RHEL 8,可优先尝试以下对应架构的二进制安装包,并在目标环境进行部署测试。
-
如需获取其他操作系统或架构的二进制安装包,请访问 MongoDB 社区版官方下载中心。
-
下载 mongosh 二进制安装包
- AMD64
- ARM64
-
下载安装包
wget https://downloads.mongodb.com/compass/mongosh-2.14.1-linux-x64.tgz -
解压安装包
tar -zxf mongosh-2.14.1-linux-x64.tgz -
安装到
/usr/local/bincp mongosh-2.14.1-linux-x64/bin/mongosh /usr/local/bin/mongoshchmod 755 /usr/local/bin/mongosh
-
下载安装包
wget https://downloads.mongodb.com/compass/mongosh-2.14.1-linux-arm64.tgz -
解压安装包
tar -zxf mongosh-2.14.1-linux-arm64.tgz -
安装到
/usr/local/bincp mongosh-2.14.1-linux-arm64/bin/mongosh /usr/local/bin/mongoshchmod 755 /usr/local/bin/mongosh
-
检查 MongoDB 和 mongosh 版本
/usr/local/mongodb/bin/mongod --versionmongosh --version确认两个命令均能正常输出版本号后,再继续后续步骤。若提示缺少共享库,先补齐目标系统的运行依赖。
-
创建系统用户 mongodb
useradd -U -M -s /sbin/nologin mongodb -
创建数据、日志目录并授予权限
mkdir -p /data/mongodb/ /data/logs/mongodbecho '1/3GWm7LjfCX/K2NOhv0evgBWan+KNX' > /data/mongodb/keyfilechmod 400 /data/mongodb/keyfilechown -R mongodb:mongodb /usr/local/mongodb/ /data/mongodb/ /data/logs/mongodb -
启用透明大页(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.3DefaultDependencies=noAfter=sysinit.target local-fs.targetBefore=mongodb.service[Service]Type=oneshotRemainAfterExit=yesExecStart=/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.targetEOFsystemctl daemon-reloadsystemctl enable --now enable-thp -
创建 MongoDB 配置文件
cat > /etc/mongod.conf <<'EOF'systemLog:destination: filepath: /data/logs/mongodb/mongodb.loglogAppend: truelogRotate: reopenstorage:dbPath: /data/mongodbnet:port: 27017bindIp: 0.0.0.0security:authorization: enabledkeyFile: /data/mongodb/keyfilereplication:replSetName: local-mongodb-onesetParameter:disableSplitHorizonIPCheck: trueEOF -
配置 systemd 管理文件
cat > /etc/systemd/system/mongodb.service <<'EOF'[Unit]Description=MongoDBAfter=network-online.target enable-thp.serviceWants=network-online.targetRequires=enable-thp.service[Service]User=mongodbGroup=mongodbEnvironment="GLIBC_TUNABLES=glibc.pthread.rseq=0"LimitNOFILE=1000000LimitNPROC=1000000LimitMEMLOCK=infinityExecStart=/usr/local/mongodb/bin/mongod --config /etc/mongod.confExecStop=/usr/bin/kill $MAINPIDRestart=on-failureRestartSec=5TimeoutStopSec=300[Install]WantedBy=multi-user.targetEOF -
加入开机自启动
# 完成后续创建用户步骤后再启动服务systemctl daemon-reloadsystemctl enable mongodb
创建数据库用户
在 MongoDB Replica Set Node01 节点上操作
-
临时启动一个未开启连接认证的 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 -
登录 MongoDB
在系统终端执行:
mongosh --host 127.0.0.1 --port 27017后续创建用户的语句在 mongosh 中执行。
-
创建管理员用户
db.getSiblingDB('admin').createUser({user: 'root',pwd: '12345678',roles: [{role: 'root', db: 'admin'}],});- 命令中指定的 MongoDB admin 库权限 root 用户密码为
12345678,实际部署必须修改为强口令。
- 命令中指定的 MongoDB admin 库权限 root 用户密码为
-
创建业务用户
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,所有业务库使用相同的账号和密码,实际部署必须修改为强口令。 - 若密码中包含特殊字符,仅允许
-或_,禁止使用@ ! # &等字符,以避免兼容性问题。
- 命令中指定的 MongoDB 业务库权限 hap 用户密码为
-
退出 mongosh
exit(); -
关闭临时启动的 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 节点上操作
-
登录 MongoDB
将账号和密码替换为创建管理员用户时设置的实际值。
mongosh --host 127.0.0.1 --port 27017 -u root -p 12345678 --authenticationDatabase admin -
配置副本集
执行前,将成员节点中的 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'},],}); -
确认副本集状态
rs.status();等待选举和同步完 成,正常状态为一个
PRIMARY和两个SECONDARY。 -
退出管理员会话
exit(); -
测试业务库连接
在系统终端执行,将连接地址替换为实际 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 -
退出 mongosh
exit();
配置日志自动轮转
Node01、Node02、Node03 三台服务器都必须配置日志自动轮转,步骤与配置内容相同。
-
检查所需命令
/usr/sbin/logrotate --versiongzip --version/usr/bin/systemctl --version -
创建日志轮转配置
历史日志按轮转前一天的日期命名,最多保留 180 份,超出后自动删除最旧的一份。最近一份不压缩,其余历史日志自动使用 gzip 压缩。
cat > /etc/mongodb-logrotate.conf <<'EOF'/data/logs/mongodb/mongodb.log {dailyrotate 180dateextdateformat -%Y-%m-%ddateyesterdaymissingoknotifemptycompressdelaycompresssu mongodb mongodbcreate 0640 mongodb mongodbsharedscriptspostrotateif /usr/bin/systemctl is-active --quiet mongodb.service; then/usr/bin/systemctl kill --kill-who=main --signal=SIGUSR1 mongodb.servicefiendscript}EOF -
创建日志轮转服务
cat > /etc/systemd/system/mongodb-logrotate.service <<'EOF'[Unit]Description=Rotate MongoDB logsAfter=mongodb.service[Service]Type=oneshotExecStart=/usr/sbin/logrotate --state /var/lib/mongodb-logrotate.status /etc/mongodb-logrotate.confEOF -
创建定时任务
按服务器本地时间每天 00:00 附近执行一次。关机期间错过的任务会在恢复 后补执行一次。
cat > /etc/systemd/system/mongodb-logrotate.timer <<'EOF'[Unit]Description=Rotate MongoDB logs daily[Timer]OnCalendar=*-*-* 00:00:00Persistent=true[Install]WantedBy=timers.targetEOF -
检查配置并验证轮转
检查 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退出查看。 -
启用定时任务
systemctl daemon-reloadsystemctl enable --now mongodb-logrotate.timer查看定时任务,确认
NEXT列显示下次执行时间:systemctl list-timers mongodb-logrotate.timer定时任务 执行后,可查看执行记录:
journalctl -u mongodb-logrotate.service -n 20 --no-pager