有错误请指正,谢谢
一、前期准备
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 库验证这个用户的密码",否则会认证失败 |
-
为什么必须加 --authenticationDatabase admin**?**
如果你省略这个参数,MongoDB 会默认去 "默认库(test)" 找 root 用户,但你之前是在 admin 库创建的 root 用户,test 库中没有这个用户,会直接报错:
MongoServerError[AuthenticationFailed](认证失败)。 -
更安全的写法(避免密码明文暴露)
生产环境建议省略
-p参数,执行命令后手动输入密码(输入时密码会隐藏,更安全):mongosh 127.0.0.1:27017 -u root --authenticationDatabase admin执行后会提示
Enter password:,此时输入root_jY_2021即可登录。 -
适用场景
这条命令仅用于 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: 1、stateStr为PRIMARY/SECONDARY→ 节点启动成功; authenticationMechanisms返回你配置的SCRAM-SHA-1,SCRAM-SHA-256→ 配置生效。
关键注意事项
-
权限要求 :执行
shutdownServer()必须拥有root/clusterAdmin/shutdown角色(你的 root 用户已满足); -
参数说明 :
force: false(默认):优雅关闭,等待所有操作完成、数据刷盘;若设为true则强制关闭(仅应急使用);timeoutSecs: 60:等待 60 秒完成关闭,超时则报错(避免无限等待);
-
密码安全 :若不想明文写密码,可省略
-p root_jY_2021,执行命令后手动输入密码(交互模式); -
日志排查 :若启动失败,查看节点日志(配置文件中
systemLog.path路径):bash
运行
tail -f /mongodbData/node01/log/mongod.log # 替换为对应节点日志路径 -
权限关键:所有节点目录 / 密钥文件归属
mongodb用户,密钥文件权限严格设为 400; -
认证逻辑:创建第一个用户后需立即
db.auth(),会话内后续操作才有权限; -
运维保障:配置开机自启后,服务器重启无需手动启动节点,提升稳定性。