CentOS 7.8 安装MongoDB 7 副本集(Replica Set)

文章目录

1 环境假设

  • 服务器1:server1(IP: 192.168.1.100
  • 服务器2:server2(IP: 192.168.1.101
  • MongoDB版本:4.x(可以根据需要选择其他版本)

步骤1:在两台服务器上安装MongoDB

  1. 配置YUM源

    在每台服务器上添加MongoDB的YUM源。编辑/etc/yum.repos.d/mongodb.repo文件,内容如下:

    bash 复制代码
     [mongodb-org-7.0]
     name=MongoDB Repository
     baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/7.0/x86_64/
     gpgcheck=1
     enabled=1
     gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc

    如果是其他Linux发行版,请根据系统版本选择合适的源。

  2. 安装MongoDB

    安装MongoDB的相关包:

    bash 复制代码
    sudo yum install -y mongodb-org
  3. 启动MongoDB服务

    启动MongoDB服务并设置为开机启动:

    bash 复制代码
    sudo systemctl start mongod
    sudo systemctl enable mongod
  4. 验证安装

    使用以下命令检查MongoDB是否正常运行:

    bash 复制代码
    sudo systemctl status mongod

    或使用mongo客户端连接到MongoDB实例,确认是否可以连接。

步骤2:配置副本集

  1. 配置mongod.conf

    在每台服务器上编辑MongoDB的配置文件/etc/mongod.conf,启用副本集配置。修改如下:

    yaml 复制代码
    replication:
      replSetName: rs0

    rs0是副本集的名字,你可以根据需要修改。

  2. 开放端口

    确保MongoDB端口(默认是27017)在防火墙中开放。你可以使用以下命令来开放该端口:

    bash 复制代码
    sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent
    sudo firewall-cmd --reload
  3. 启动MongoDB

    启动或重新启动MongoDB使配置生效:

    bash 复制代码
    sudo systemctl restart mongod
  4. 检查MongoDB日志

    检查mongod日志(/var/log/mongodb/mongod.log)确认是否有错误。

步骤3:初始化副本集

  1. 连接到MongoDB实例

    server1上,使用mongo客户端连接到MongoDB:

    bash 复制代码
    mongo --host 192.168.1.100
  2. 初始化副本集

    在MongoDB shell中运行以下命令来初始化副本集:

    javascript 复制代码
    rs.initiate()

    你应该会看到类似以下输出:

    javascript 复制代码
    {
        "info2" : "no configuration has been given yet",
        "me" : "192.168.1.100:27017",
        "ok" : 1
    }
  3. 添加副本集成员

    之后,向副本集中添加第二台服务器server2

    javascript 复制代码
    rs.add("192.168.1.101:27017")

    运行以下命令检查副本集状态:

    javascript 复制代码
    rs.status()

    如果一切正常,你应该会看到两个成员(server1server2)都已经加入副本集。

步骤4:验证副本集配置

  1. 查看副本集状态

    使用以下命令查看副本集的状态,确保两个节点都在运行:

    bash 复制代码
    mongo --host 192.168.1.100

    在Mongo shell中运行:

    javascript 复制代码
    rs.status()
  2. 进行数据写入测试

    在主节点上插入数据并检查是否同步到从节点:

    javascript 复制代码
    use test
    db.testCollection.insert({name: "test"})

    你可以在从节点上验证该数据是否已同步。

步骤5:设置安全性(可选)

为了确保MongoDB副本集的安全性,可以启用身份验证和加密。你可以在配置文件中启用auth选项并创建管理员用户。

编辑/etc/mongod.conf文件,添加:

yaml 复制代码
security:
  authorization: "enabled"

然后在主节点上创建管理员用户:

bash 复制代码
mongo --host 192.168.1.100
use admin
db.createUser({
   user: "admin",
   pwd: "adminpassword",
   roles: [{ role: "root", db: "admin" }]
})

这样,其他成员在加入副本集时需要提供管理员的用户名和密码。

扩展

MongoDB副本集的最低配置需要 3台服务器 。虽然可以在2台服务器上搭建副本集,但为了确保高可用性和避免"脑裂"(split-brain)问题,3台服务器是推荐的配置。

具体原因如下:

  1. 选举机制:MongoDB副本集需要一个"选举"机制来决定哪个节点作为主节点。如果只有2个节点,出现网络分区时,这两个节点可能无法达成一致,从而导致副本集无法正常工作。

  2. 高可用性:3个节点可以确保即使1个节点出现故障,副本集依然可以正常工作。在3个节点的配置中,如果其中1个节点宕机,另一个节点可以通过选举成为新的主节点,保证系统的高可用性。

  3. 仲裁节点:如果你有2个数据节点,可以增加一个仲裁节点(Arbiter),这个节点只参与选举,不保存数据。这样可以避免"脑裂"问题,同时仍然保持副本集的选举功能。仲裁节点不需要存储数据,只要保证选举时可以参与投票。

配置示例:

  • 2个数据节点(primarysecondary
  • 1个仲裁节点(arbiter

这样配置可以确保副本集有3个投票节点,但不需要额外的存储负担。

最佳实践:

  • 3个数据节点 + 1个仲裁节点 是一个常见的高可用副本集配置。
  • 4个数据节点 可以提供更强的故障恢复能力,但通常会增加管理和维护的复杂性。

总之,虽然最少可以配置2个节点,但为了确保高可用性和防止"脑裂",建议使用3个节点。

仲裁节点

是的,仲裁节点(Arbiter)在搭建过程中的配置与数据节点相似,但它有一些特别的配置,主要是为了参与副本集选举而不存储数据。以下是如何在MongoDB副本集中设置仲裁节点的步骤:

步骤1:在一台服务器上安装MongoDB(仲裁节点)

你可以选择在已经有的服务器上安装MongoDB,或者在另一台新服务器上安装。这里假设你已经安装了MongoDB,并且副本集已经创建了2个数据节点。

  1. 安装MongoDB(如果尚未安装)

    在仲裁节点服务器上,按照之前的步骤使用YUM安装MongoDB:

    bash 复制代码
    sudo yum install -y mongodb-org
  2. 配置mongod.conf

    在仲裁节点的MongoDB配置文件/etc/mongod.conf中,进行如下配置:

    yaml 复制代码
    replication:
      replSetName: rs0   # 确保与副本集名称一致
    security:
      authorization: "enabled"  # 可选:启用认证
  3. 启动MongoDB

    启动MongoDB服务并设置为开机启动:

    bash 复制代码
    sudo systemctl start mongod
    sudo systemctl enable mongod
  4. 检查MongoDB状态

    确保MongoDB服务正常运行:

    bash 复制代码
    sudo systemctl status mongod

步骤2:将仲裁节点加入副本集

  1. 连接到一个数据节点

    使用mongo命令连接到你的主节点(假设主节点IP是192.168.1.100):

    bash 复制代码
    mongo --host 192.168.1.100
  2. 添加仲裁节点

    在Mongo shell中运行以下命令,将仲裁节点加入副本集:

    javascript 复制代码
    rs.addArb("192.168.1.102:27017")  // 假设仲裁节点的IP是192.168.1.102

    这样,MongoDB将会把192.168.1.102添加为仲裁节点。

  3. 验证副本集状态

    运行以下命令检查副本集状态,确保仲裁节点已加入并且状态正常:

    javascript 复制代码
    rs.status()

    在输出中,你应该会看到仲裁节点的状态类似于以下:

    json 复制代码
    {
        "host" : "192.168.1.102:27017",
        "arbiterOnly" : true,
        "stateStr" : "ARBITER",
        "state" : 7,
        "uptime" : 100
    }

步骤3:验证仲裁节点的功能

  1. 测试选举功能

    你可以通过在主节点上停止mongod服务来模拟节点故障。然后检查副本集是否能自动选举新的主节点。如果有仲裁节点,副本集应该能够正常进行选举,保证系统的高可用性。

  2. 验证数据同步

    仲裁节点不存储数据,它只是参与选举过程,因此你不需要验证数据同步。你只需要验证它是否正确参与选举并保持副本集的健康状态。

总结
  • 仲裁节点的搭建和数据节点类似,唯一的区别是仲裁节点配置不存储数据,且配置文件中不需要启用数据存储的设置。
  • 使用rs.addArb()将仲裁节点添加到副本集中,不需要额外的数据同步过程。
  • 仲裁节点的作用是保证选举过程的顺利进行,确保即使在数据节点故障时,副本集仍然能够正常选举出新的主节点。

对于测试环境,如果你有2个数据节点,可以使用1个仲裁节点来模拟高可用性,而不需要额外的数据存储。

相关推荐
小白跃升坊20 小时前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey20 小时前
【Linux】线程同步与互斥
linux·笔记
舰长11520 小时前
linux 实现文件共享的实现方式比较
linux·服务器·网络
zmjjdank1ng21 小时前
Linux 输出重定向
linux·运维
路由侠内网穿透.21 小时前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
VekiSon21 小时前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发
zl_dfq21 小时前
Linux 之 【进程信号】(signal、kill、raise、abort、alarm、Core Dump核心转储机制)
linux
Ankie Wan1 天前
cgroup(Control Group)是 Linux 内核提供的一种机制,用来“控制、限制、隔离、统计”进程对系统资源的使用。
linux·容器·cgroup·lxc
skywalk81631 天前
尝试在openi启智社区的dcu环境安装ollama最新版0.15.2(失败)
linux·运维·服务器·ollama
2501_936960361 天前
ROS快速入门教程
数据库·mongodb