2026年单服务器 Ubuntu 24.04 无公网离线部署 MongoDB 8.0.17 三节点副本集(主 / 从 / 仲裁)保姆级教程

有错误请指正,谢谢

一、前期准备

1. 上传离线安装包

我的测试服务器

阿里云ecs服务器,2核2G内存3M带宽40G硬盘,系统 Ubuntu 24.04

将以下文件通过 SCP/FTPS 上传至服务器/root/mongodb_offline/目录:

  • MongoDB 核心包:mongodb-linux-x86_64-ubuntu2404-8.0.17.tgz
  • Mongosh 客户端包:mongodb-mongosh-shared-openssl3_2.6.0_amd64.deb

https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2404-8.0.17.tgz

https://downloads.mongodb.com/compass/mongodb-mongosh-shared-openssl3_2.6.0_amd64.deb

2. 创建 MongoDB 运行用户

复制代码
# 创建无登录权限的系统用户(避免root运行)
useradd -r -s /sbin/nologin mongodb
# 创建用户家目录(消除su命令警告)
mkdir -p /home/mongodb
chown mongodb:mongodb /home/mongodb
# 修改shell为可执行命令(可选,优化su操作)
usermod -s /bin/bash mongodb

二、解压部署 MongoDB 8.0.17(tgz 包)

复制代码
# 创建安装目录
mkdir -p /usr/local/mongodb
# 解压tgz包(--strip-components=1 去除外层目录)
tar -zxvf /root/mongodb_offline/mongodb-linux-x86_64-ubuntu2404-8.0.17.tgz -C /usr/local/mongodb --strip-components=1
# 创建软链接(系统全局可执行mongod命令)
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
# 赋予目录权限
chown -R mongodb:mongodb /usr/local/mongodb
# 验证安装(输出8.0.17版本即成功)
mongod --version

三、创建节点目录与集群密钥

复制代码
# 1. 创建三节点目录(配置/数据/日志分离)
mkdir -p /mongodbData/node01/{conf,data,logs}
mkdir -p /mongodbData/node02/{conf,data,logs}
mkdir -p /mongodbData/node03/{conf,data,logs}

# 2. 生成集群认证密钥(复制集必需,所有节点共用)
openssl rand -base64 756 > /mongodbData/node01/conf/access.key
cp /mongodbData/node01/conf/access.key /mongodbData/node02/conf/
cp /mongodbData/node01/conf/access.key /mongodbData/node03/conf/

# 3. 严格设置权限(密钥文件必须400,目录归属mongodb用户)
chown -R mongodb:mongodb /mongodbData
chmod 400 /mongodbData/node*/conf/access.key

四、编写 MongoDB 8.0 适配配置文件

1. 主节点(node01,端口 27017)

路径:vi /mongodbData/node01/conf/mongod.conf

复制代码
operationProfiling:
    mode: all
    slowOpThresholdMs: 1000
systemLog:
    destination: file
    path: /mongodbData/node01/logs/mongod.log
    logAppend: true
    verbosity: 1
    logRotate: rename
storage:
    dbPath: /mongodbData/node01/data
    directoryPerDB: true
    wiredTiger:
      engineConfig:
        cacheSizeGB: 0.3  # 2G内存适配值
processManagement:
    fork: true
    pidFilePath: /mongodbData/node01/mongod.pid
net:
    bindIpAll: true  # 监听所有IP(如需限制可改为bindIp: 0.0.0.0)
    port: 27017
security:
    keyFile: /mongodbData/node01/conf/access.key
    authorization: enabled
setParameter:
    authenticationMechanisms: SCRAM-SHA-1,SCRAM-SHA-256   # 设置认证机制为SCRAM-SHA-1和SCRAM-SHA-256
replication:
    oplogSizeMB: 500
    replSetName: mongodbData

2. 从节点(node02,端口 27018)

路径:vi /mongodbData/node02/conf/mongod.conf

复制代码
operationProfiling:
    mode: all
    slowOpThresholdMs: 1000
systemLog:
    destination: file
    path: /mongodbData/node02/logs/mongod.log
    logAppend: true
    verbosity: 1
    logRotate: rename
storage:
    dbPath: /mongodbData/node02/data
    directoryPerDB: true
    wiredTiger:
      engineConfig:
        cacheSizeGB: 0.3
processManagement:
    fork: true
    pidFilePath: /mongodbData/node02/mongod.pid
net:
    bindIpAll: true
    port: 27018
security:
    keyFile: /mongodbData/node02/conf/access.key
    authorization: enabled
setParameter:
    authenticationMechanisms: SCRAM-SHA-1,SCRAM-SHA-256   # 设置认证机制为SCRAM-SHA-1和SCRAM-SHA-256
replication:
    oplogSizeMB: 500
    replSetName: mongodbData

3. 仲裁节点(node03,端口 27019)

路径:vi /mongodbData/node03/conf/mongod.conf

复制代码
operationProfiling:
    mode: all
    slowOpThresholdMs: 1000
systemLog:
    destination: file
    path: /mongodbData/node03/logs/mongod.log
    logAppend: true
    verbosity: 1
    logRotate: rename
storage:
    dbPath: /mongodbData/node03/data
processManagement:
    fork: true
    pidFilePath: /mongodbData/node03/mongod.pid
net:
    bindIpAll: true
    port: 27019
security:
    keyFile: /mongodbData/node03/conf/access.key
    authorization: enabled
setParameter:
    authenticationMechanisms: SCRAM-SHA-1,SCRAM-SHA-256   # 设置认证机制为SCRAM-SHA-1和SCRAM-SHA-256
replication:
    oplogSizeMB: 500
    replSetName: mongodbData

五、启动 MongoDB 节点

复制代码
# 启动主节点(su 不带-,避免登录shell检查)
su mongodb -c "mongod -f /mongodbData/node01/conf/mongod.conf"
# 启动从节点
su mongodb -c "mongod -f /mongodbData/node02/conf/mongod.conf"
# 启动仲裁节点
su mongodb -c "mongod -f /mongodbData/node03/conf/mongod.conf"

# 验证进程(输出3个mongod进程,用户为mongodb即成功)
ps -ef | grep mongod | grep -v grep
# 验证端口监听
ss -tulnp | grep -E '27017|27018|27019'

六、安装 Mongosh 客户端

复制代码
# 安装mongosh deb包
dpkg -i /root/mongodb_offline/mongodb-mongosh-shared-openssl3_2.6.0_amd64.deb
# 修复依赖(Ubuntu24.04自带libssl3,一般无需额外操作)
apt-get -f install --yes
# 创建软链接(系统全局可执行mongosh命令)
ln -s /usr/bin/mongosh /usr/local/bin/mongosh
# 验证安装
mongosh --version

七、初始化复制集

复制代码
#  27017主节点    27018从节点   27019 仲裁节点

# 连接主节点(27017端口)
mongosh 127.0.0.1:27017


# 定义复制集配置
cfg = {
    _id: 'mongodbData',
    members: [
        {_id: 1, host: '127.0.0.1:27017'},
        {_id: 2, host: '127.0.0.1:27018'},
        {_id: 3, host: '127.0.0.1:27019', arbiterOnly: true}
    ]
};

# 初始化复制集(返回{ ok: 1 }即成功)
rs.initiate(cfg);

# 验证复制集状态(等待主节点选举完成,stateStr为PRIMARY)
rs.status();

八、创建管理员用户(主节点执行)

复制代码
mongosh 127.0.0.1:27017
use admin;
# 初始化/重置副本集(单节点)
rs.initiate();
# 等待几秒,让节点切换为主节点
sleep(3000);
# 再次确认角色(应显示PRIMARY)
rs.status().members[0].stateStr;



// 切换到admin数据库
use admin;

// 创建数据库管理员(root)
db.createUser({
    user: "root",
    pwd: "root_jY_2021",
    roles: [
        {role: "readWriteAnyDatabase", db: "admin"},
        {role: "dbAdminAnyDatabase", db: "admin"},
        {role: "userAdminAnyDatabase", db: "admin"}
    ]
});

// 会话内认证(创建第一个用户后,认证立即生效)
db.auth("root", "root_jY_2021");

// 创建集群管理员(suroot)
db.createUser({
    user: "suroot",
    pwd: "suroot_jY_2021",
    roles: [
        {role: "clusterAdmin", db: "admin"},
        {role: "clusterManager", db: "admin"},
        {role: "clusterMonitor", db: "admin"}
    ]
});






// 验证用户(输出2个用户信息即成功)
show users;

// 给root用户追加集群管理权限
db.grantRolesToUser(
  "root",  // 要授权的用户名
  [ { role: "clusterAdmin", db: "admin" } ]  // 追加的集群级角色
);



// 退出并重新登录验证
exit
mongosh 127.0.0.1:27017 -u root -p root_jY_2021 --authenticationDatabase admin
rs.status();  // 能正常输出即权限生效

九、可选:配置开机自启(systemd 服务)

1. 创建主节点服务文件

路径:vi /etc/systemd/system/mongod-node01.service

复制代码
[Unit]
Description=MongoDB Node01 Service
After=network.target

[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --config /mongodbData/node01/conf/mongod.conf
ExecStop=/usr/bin/mongod --config /mongodbData/node01/conf/mongod.conf --shutdown
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

2. 创建从节点 / 仲裁节点服务文件

复制代码
# 从节点(node02)
cat > /etc/systemd/system/mongod-node02.service << EOF
[Unit]
Description=MongoDB Node02 Service
After=network.target

[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --config /mongodbData/node02/conf/mongod.conf
ExecStop=/usr/bin/mongod --config /mongodbData/node02/conf/mongod.conf --shutdown
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

# 仲裁节点(node03)
cat > /etc/systemd/system/mongod-node03.service << EOF
[Unit]
Description=MongoDB Node03 Service
After=network.target

[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --config /mongodbData/node03/conf/mongod.conf
ExecStop=/usr/bin/mongod --config /mongodbData/node03/conf/mongod.conf --shutdown
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

3. 启用并启动服务

复制代码
# 重新加载systemd配置
systemctl daemon-reload
# 设置开机自启
systemctl enable mongod-node01 mongod-node02 mongod-node03
# 启动服务
systemctl start mongod-node01 mongod-node02 mongod-node03
# 验证服务状态
systemctl status mongod-node01 mongod-node02 mongod-node03

十、核心验证(部署完成后)

1. 进程验证

复制代码
ps -ef | grep mongod | grep mongodb  # 3个进程,用户为mongodb

2. 权限验证

复制代码
# root用户登录,测试读写
mongosh 127.0.0.1:27017 -u root -p root_jY_2021 --authenticationDatabase admin
use testdb;
db.test_col.insertOne({name: "test", value: 1});
db.test_col.find();  # 输出插入数据即成功

# suroot用户登录,测试集群管理
exit
mongosh 127.0.0.1:27017 -u suroot -p suroot_jY_2021 --authenticationDatabase admin
rs.status();  # 输出复制集完整状态即成功

十一、可选:外网访问配置(谨慎开启)

1. 阿里云安全组放行(核心)

登录阿里云控制台 → ECS → 安全组 → 入方向添加规则:

  • 协议:TCP
  • 端口:27017
  • 授权对象:指定外网 IP(避免 0.0.0.0/0,降低风险)

2. 系统防火墙放行(可选)

复制代码
# 仅允许指定IP访问
ufw allow from 你的外网IP to any port 27017 proto tcp
# 重启防火墙
ufw reload

十二、补充说明

mongosh 127.0.0.1:27017 -u root -p root_jY_2021 --authenticationDatabase admin

命令整体作用

这条命令是使用 MongoDB 的交互式终端工具(mongosh),以指定的管理员账号密码完成身份认证,连接到本地 27017 端口的 MongoDB 实例。简单来说,就是 "登录" 到你的 27017 端口 MongoDB 数据库(需身份验证的场景下),登录后才能执行创建用户、查询数据、管理副本集等操作。

逐参数拆解

|----------------------------------|-----------------------------------|--------------------------------------------------------------------------------------------------|
| 参数 / 内容 | 全称 / 含义 | 通俗解释 |
| mongosh | MongoDB Shell(MongoDB 交互式命令行工具) | 操作 MongoDB 的 "客户端终端",替代旧版的mongo命令 |
| 127.0.0.1:27017 | 目标 MongoDB 实例的 IP + 端口 | 连接 "本机(127.0.0.1)" 上运行在 27017 端口的 MongoDB 服务(27017 是默认端口) |
| -u root | --username root(指定登录用户名) | 用 "root" 这个用户名登录(你之前在 admin 库创建的管理员用户) |
| -p root_jY_2021 | --password root_jY_2021(指定登录密码) | 登录密码是 "root_jY_2021"(注意:生产环境不建议明文写密码,可省略 - p 手动输入) |
| --authenticationDatabase admin | 指定 "用户认证数据库" 为 admin | MongoDB 的用户是 "绑定到具体数据库" 的 ------ 你的 root 用户创建在 admin 库,必须告诉 MongoDB "去 admin 库验证这个用户的密码",否则会认证失败 |

  1. 为什么必须加 --authenticationDatabase admin**?**

    如果你省略这个参数,MongoDB 会默认去 "默认库(test)" 找 root 用户,但你之前是在 admin 库创建的 root 用户,test 库中没有这个用户,会直接报错:MongoServerError[AuthenticationFailed](认证失败)。

  2. 更安全的写法(避免密码明文暴露)

    生产环境建议省略-p参数,执行命令后手动输入密码(输入时密码会隐藏,更安全):

    复制代码
    mongosh 127.0.0.1:27017 -u root --authenticationDatabase admin

    执行后会提示Enter password:,此时输入root_jY_2021即可登录。

  3. 适用场景

    这条命令仅用于 MongoDB开启了身份验证 的场景(你创建了 root 用户后,MongoDB 就会拒绝匿名连接);如果 MongoDB 未开启认证,直接执行mongosh 127.0.0.1:27017即可连接。

十三、重启数据库

第一步:确认副本集主 / 从节点(关键,确定关闭顺序)

先连接任意节点,查询副本集状态,明确哪个是主节点(PRIMARY)、哪些是从节点(SECONDARY):

复制代码
# 连接其中一个节点(如node01:27017)查询状态
mongosh 127.0.0.1:27017 -u root -p root_jY_2021 --authenticationDatabase admin --eval "rs.status()"

在输出的members数组中,找到stateStr字段:

  • PRIMARY:主节点(最后关闭);
  • SECONDARY:从节点(先关闭)。
第二步:通过 mongosh 优雅关闭每个节点(先从后主)

以下示例假设:node02(27018)、node03(27019)是从节点,node01(27017)是主节点,你需根据实际主从调整顺序。

1. 关闭从节点 1(node02:27018)
复制代码
# 连接node02,执行优雅关闭命令
# 优雅关闭(force=false:不强制关闭,等待数据刷盘;timeoutSecs=60:等待60秒)

mongosh 127.0.0.1:27018 -u root -p root_jY_2021 --authenticationDatabase admin << EOF
use admin;
db.shutdownServer({force: false, timeoutSecs: 60});
exit;
EOF
echo "node02(27018)已优雅关闭"

💡

root@win2025:~# mongosh 127.0.0.1:27018 -u root -p root_jY_2021 --authenticationDatabase admin << EOF

use admin; db.shutdownServer({force: false, timeoutSecs: 60}); exit; EOF Current Mongosh Log ID: 697088c4c0f48b0221ed1101 Connecting to: mongodb://<credentials>@127.0.0.1:27018/?directConnection=true&serverSelectionTimeoutMS=2000&authSource=admin&appName=mongosh+2.6.0 MongoServerSelectionError: The server is in quiesce mode and will shut down root@win2025:~# echo "node02(27018)已优雅关闭" node02(27018)已优雅关闭 root@win2025:~# root@win2025:~#

2. 关闭从节点 2(node03:27019)
复制代码
# 连接node03,执行优雅关闭命令
mongosh 127.0.0.1:27019 -u root -p root_jY_2021 --authenticationDatabase admin << EOF
use admin;
db.shutdownServer();
exit;
EOF
echo "node03(27019)已优雅关闭"
3. 关闭主节点(node01:27017)
复制代码
# 连接node01,执行优雅关闭(主节点会先stepDown降权,再关闭)
mongosh 127.0.0.1:27017 -u root -p root_jY_2021 --authenticationDatabase admin << EOF
use admin;
db.shutdownServer({force: false, timeoutSecs: 60});
exit;
EOF
echo "node01(27017)已优雅关闭"
第三步:验证所有节点已停止

执行以下命令,确认无 mongod 进程关联到你的节点目录:

复制代码
ps -ef | grep mongod | grep -v grep | grep "/mongodbData/"
  • 输出为空 → 所有节点已停止;
  • 若仍有进程 → 等待 5 秒后重新检查(shutdownServer()可能需要几秒完成刷盘)。
第四步:外部重新启动所有节点(先从后主)

用配置文件启动节点(--fork表示后台运行),顺序与关闭一致:

复制代码
# 启动3个节点
# 用绝对路径启动node01节点(替换为你实际的mongod路径,确认存在)
/usr/local/mongodb/bin/mongod -f /mongodbData/node01/conf/mongod.conf --fork
/usr/local/mongodb/bin/mongod -f /mongodbData/node02/conf/mongod.conf --fork
/usr/local/mongodb/bin/mongod -f /mongodbData/node03/conf/mongod.conf --fork
第五步:验证重启成功且配置生效
复制代码
# 1. 检查进程是否启动
ps -ef | grep mongod | grep -v grep | grep "/mongodbData/"

# 2. 连接副本集,验证节点状态和配置
mongosh 127.0.0.1:27017 -u root -p root_jY_2021 --authenticationDatabase admin --eval "
  // 查看副本集状态
  rs.status();
  // 验证修改的配置(如认证机制)是否生效
  db.adminCommand({getParameter: 1, authenticationMechanisms: 1});
"
  • 输出中members数组里所有节点health: 1stateStrPRIMARY/SECONDARY→ 节点启动成功;
  • authenticationMechanisms返回你配置的SCRAM-SHA-1,SCRAM-SHA-256→ 配置生效。

关键注意事项

  1. 权限要求 :执行shutdownServer()必须拥有root/clusterAdmin/shutdown角色(你的 root 用户已满足);

  2. 参数说明

    • force: false(默认):优雅关闭,等待所有操作完成、数据刷盘;若设为true则强制关闭(仅应急使用);
    • timeoutSecs: 60:等待 60 秒完成关闭,超时则报错(避免无限等待);
  3. 密码安全 :若不想明文写密码,可省略-p root_jY_2021,执行命令后手动输入密码(交互模式);

  4. 日志排查 :若启动失败,查看节点日志(配置文件中systemLog.path路径):

    bash

    运行

    复制代码
    tail -f /mongodbData/node01/log/mongod.log  # 替换为对应节点日志路径
  5. 权限关键:所有节点目录 / 密钥文件归属mongodb用户,密钥文件权限严格设为 400;

  6. 认证逻辑:创建第一个用户后需立即db.auth(),会话内后续操作才有权限;

  7. 运维保障:配置开机自启后,服务器重启无需手动启动节点,提升稳定性。

相关推荐
世界尽头与你2 小时前
CVE-2025-14847_ MongoDB 未授权内存泄露漏洞
数据库·安全·mongodb·网络安全·渗透测试
HABuo2 小时前
【linux进程控制(三)】进程程序替换&自己实现一个bash解释器
linux·服务器·c语言·c++·ubuntu·centos·bash
物理与数学2 小时前
Linux 文件系统浅析
linux·linux内核
willhuo2 小时前
程序这东西,想的即使在完善,也有想不到的地方。。
linux·服务器·网络
篱笆院的狗2 小时前
yum install 发生 Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64
linux·运维·centos
磊磊cpp2 小时前
Ubuntu 22.04 手动安装 XRDP(RDP 远程桌面)教程
linux·运维·ubuntu
等风来不如迎风去2 小时前
【docker】ubuntu空间不够了,删除ragflow
ubuntu·docker·容器
CAU界编程小白2 小时前
Linux系统编程系列之进程间通信下(共享内存)
linux·共享内存
chipsense2 小时前
Ubuntu服务器上为Apache网站安装部署SSL证书详细步骤
linux·ubuntu·ssl