mongodb8的安装及主副本集群

一、mongodb安装

1.推荐方法:使用 YUM 源(兼容性最好)
复制代码
echo "[mongodb-org-8.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/8/mongodb-org/8.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://pgp.mongodb.com/server-8.0.asc" > /etc/yum.repos.d/mongodb-org-8.0.repo
2、安装
复制代码
sudo yum install -y mongodb-org
3、启动服务:
复制代码
# 启动 MongoDB 服务
sudo systemctl start mongod

# 设置开机自动启动
sudo systemctl enable mongod

# 检查服务运行状态
sudo systemctl status mongod
# 重启服务
sudo systemctl restart mongod

检测版本

|--------------------------------|-----------------|----------------------|
| mongod --version | 服务端版本 | db version v8.0.26 |
| mongosh --version | 客户端 Shell版本 | 2.8.3 |
| mongosh 进入后执行 db.version() | 当前连接到的数据库版本 | 8.0.26 |

快速检测是否可用

复制代码
mongosh --eval "db.runCommand({ping: 1})"

检测错误:

systemctl status 显示的信息不完整,最关键的报错原因在 MongoDB 的日志文件里。请执行以下命令,把最后几十行日志发给我:

复制代码
sudo tail -50 /var/log/mongodb/mongod.log

尝试直接启动以获取更详细报错

复制代码
sudo mongod --config /etc/mongod.conf
5、选项:修改默认存放位置

默认位置

使用 YUM 安装时,MongoDB 会默认创建以下目录

目录类型 默认路径
数据目录 /var/lib/mongo
日志目录 /var/log/mongodb

修改目录位置

复制代码
sudo mkdir -p /data/mongo
sudo mkdir -p /data/log/mongodb/mongod.log

/data/log/mongodb/mongod.log 这个是文件

修改目录所有者

MongoDB 服务默认以 mongod 用户运行,必须让这个用户拥有新目录的读写权限

复制代码
sudo chown -R mongod:mongod /data/mongo
sudo chown -R mongod:mongod /data/log/mongodb

编辑配置文件

MongoDB 的主配置文件位于 /etc/mongod.conf。使用 vimnano 等编辑器打开它

复制代码
sudo vim /etc/mongod.conf

修改配置项

在配置文件中找到并修改 storage.dbPathsystemLog.path 这两项-1-3-7。修改后的内容示例如下

复制代码
systemLog:
  destination: file
  logAppend: true
  path: /data/log/mongodb/mongod.log  # 修改为你的新日志路径

storage:
  dbPath: /data/mongo               # 修改为你的新数据路径
  journal:
    enabled: true

重启服务生效

复制代码
sudo systemctl restart mongod

二、创建副本集群

第一步:修改配置文件(三台机器都要做)

在每台机器上编辑 /etc/mongod.conf,确保以下配置正确

复制代码
# 网络配置
net:
  port: 27017
  bindIp: 192.168.1.10   # 或改为具体的内网IP,如 192.168.1.10

# 副本集配置(关键!三台机器必须完全一致)
replication:
  replSetName: "rs0"

特别注意

  1. 三台机器的 replSetName 必须完全相同 (都是 rs0)。

  2. bindIp 要确保其他机器能访问。生产环境建议填写具体的内网 IP,而不是 0.0.0.0

  3. YAML 格式对缩进 敏感,确保每层缩进是两个空格

第二步:重启 MongoDB 服务(每台机器)

修改完配置文件后,在每台机器上执行

复制代码
sudo systemctl restart mongod
sudo systemctl status mongod   # 确认状态是 active (running)
第三步:初始化副本集(只在一台机器上执行)

选择任意一台机器(通常是网络最好的那台),连接到 MongoDB

复制代码
mongosh --host 192.168.1.10 --port 27017

然后执行初始化命令(注意替换成你的三个节点的实际 IP):

复制代码
rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "192.168.1.10:27017", priority: 2 },   // 优先级更高,更可能成为 Primary
    { _id: 1, host: "192.168.1.11:27017", priority: 1 },
    { _id: 2, host: "192.168.1.12:27017", priority: 1 }
  ]
})
复制代码
// 优先级更高,更可能成为 Primary
第四步:验证集群状态

在同一个 mongosh 会话中执行

复制代码
rs.status()

查看输出中的 members 数组,应该能看到:

  • 一个节点 stateStr: "PRIMARY"(主节点)

  • 两个节点 stateStr: "SECONDARY"(从节点)

第五步:测试数据同步

在主节点上写入一条测试数据:

复制代码
use testDB
db.testCollection.insertOne({ test: "hello replica set" })

然后连接到任意一个从节点,执行:

复制代码
rs.secondaryOk()   // 允许从节点读取
use testDB
db.testCollection.find()

三、mongodb设置密码

第一步:连接 MongoDB 并创建管理员用户(连接主的mongodb)

首先,像之前一样连接到 MongoDB Shell(此时还不需要密码)

复制代码
mongosh --host 192.168.1.10 --port 27017

在 Shell 中,切换到 admin 数据库,然后创建一个拥有 root 角色的超级管理员用户

复制代码
// 切换到 admin 数据库
use admin

// 创建管理员用户(请将 'yourSecurePassword' 替换为你自己的强密码)
db.createUser({
    user: "admin",
    pwd: "yourSecurePassword", // 这里设置你的密码
    roles: [ { role: "root", db: "admin" } ]
})
第二步:修改配置文件,开启认证
配置项 作用范围 是否必须一致 说明
管理员账户密码 客户端连接验证 不必一致 这是你的应用或运维人员连接时使用的密码。你只需要在任意一台 机器的 admin 数据库中创建一个高权限用户,这个用户信息会通过副本集的数据同步自动复制到其他节点。因此,你只需设置一次,三台机器会共享同一个用户认证体系。
KeyFile(内部认证密钥) 副本集节点间通信 必须完全一致 这是集群内部节点互相验证身份的"暗号"。所有三台机器的 KeyFile 内容必须一模一样,否则节点之间无法建立信任关系,副本集会直接挂掉。

创建好用户后,需要修改 MongoDB 的配置文件 /etc/mongod.conf,让它要求客户端提供身份验证

KeyFile 是 MongoDB 副本集内部节点之间进行身份验证的共享密钥文件。它的作用是

  1. 节点间认证:集群中的每个节点在与其他节点通信时,都需要使用这个 KeyFile 来证明自己的身份。

  2. 安全通信基础:它是开启副本集内部安全通信的前提。

  3. 集群一致性所有节点必须使用内容完全相同的 KeyFile,否则它们无法加入同一个副本集。

如何配置 KeyFile

第一步:在每台机器上创建相同的 KeyFile

其中一台机器上生成 KeyFile:

复制代码
# 生成一个包含随机内容的 KeyFile
openssl rand -base64 756 > /etc/mongodb-keyfile
# 设置严格权限,只有 mongod 用户可读
chmod 400 /etc/mongodb-keyfile
chown mongod:mongod /etc/mongodb-keyfile

将该文件复制到其他两台机器的相同路径 (例如 /etc/mongodb-keyfile),并确保权限和所有者都一致:

复制代码
# 在其他机器上执行
chmod 400 /etc/mongodb-keyfile
chown mongod:mongod /etc/mongodb-keyfile
第二步:修改所有节点的配置文件

每台机器/etc/mongod.conf 中,添加或修改 security 部分:

复制代码
sudo vim /etc/mongod.conf

security:
  authorization: enabled   # 如果你暂时不想开启密码认证,可以先写 disabled
  keyFile: /etc/mongodb-keyfile
  • keyFile 路径必须与第一步中存放的位置一致。

  • 如果你现在不想启用密码认证(authorization),可以先设置为 disabled,但 keyFile 必须配置。这样节点间会使用 KeyFile 认证,但客户端连接无需密码。

第三步:重启各个节点(按顺序)

为了不影响服务可用性,建议按以下顺序重启(这很重要):

先重启所有从节点(Secondary)

复制代码
# 在每台从节点上
systemctl restart mongod
  1. 最后重启主节点(Primary):主节点重启后,集群会自动重新选举。

验证 KeyFile 是否生效

重启完成后,连接到任意节点,执行

复制代码
mongosh --host 192.168.1.10 --port 27017 -u admin -p 123456 --authenticationDatabase admin
rs.status()

security 这个验证和用户名登录是一会事吗

|---------------------------------|-----------------------------------------------------------------------------------------------------------|-------------------------------------------------|
| security.authorization 配置 | 服务器的全局安全策略 。设置为 enabled 时,服务器会要求 所有连接都必须通过认证;设置为 disabled 时,服务器不要求认证,任何连接都可以访问(但可能受其他限制)。 | 大楼的门禁总闸。打开时,所有人必须刷卡才能进入;关闭时,大门敞开,任何人都能自由进出。 |
| 用户名/密码认证 | 客户端证明身份的具体方式之一。当门禁开启后,你需要通过"刷卡"(提供用户名和密码)来验证身份。 | 门禁卡。你必须有正确的卡才能通过门禁。 |