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

文章目录

  • 1 环境假设
    • 步骤1:在两台服务器上安装MongoDB
    • 步骤2:配置副本集
    • 步骤3:初始化副本集
    • 步骤4:验证副本集配置
    • 步骤5:设置安全性(可选)
      • 扩展
      • 配置示例:
      • 最佳实践:
      • 仲裁节点
      • 步骤1:在一台服务器上安装MongoDB(仲裁节点)
      • 步骤2:将仲裁节点加入副本集
      • 步骤3:验证仲裁节点的功能
        • 总结

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文件,内容如下:

     [mongodb-org-7.0]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/7.0/x86_64/gpgcheck=1enabled=1gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc
    

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

  2. 安装MongoDB

    安装MongoDB的相关包:

    sudo yum install -y mongodb-org
    
  3. 启动MongoDB服务

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

    sudo systemctl start mongod
    sudo systemctl enable mongod
    
  4. 验证安装

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

    sudo systemctl status mongod
    

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

步骤2:配置副本集

  1. 配置mongod.conf

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

    replication:replSetName: rs0
    

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

  2. 开放端口

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

    sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent
    sudo firewall-cmd --reload
    
  3. 启动MongoDB

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

    sudo systemctl restart mongod
    
  4. 检查MongoDB日志

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

步骤3:初始化副本集

  1. 连接到MongoDB实例

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

    mongo --host 192.168.1.100
    
  2. 初始化副本集

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

    rs.initiate()
    

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

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

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

    rs.add("192.168.1.101:27017")
    

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

    rs.status()
    

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

步骤4:验证副本集配置

  1. 查看副本集状态

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

    mongo --host 192.168.1.100
    

    在Mongo shell中运行:

    rs.status()
    
  2. 进行数据写入测试

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

    use test
    db.testCollection.insert({name: "test"})
    

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

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

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

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

security:authorization: "enabled"

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

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:

    sudo yum install -y mongodb-org
    
  2. 配置mongod.conf

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

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

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

    sudo systemctl start mongod
    sudo systemctl enable mongod
    
  4. 检查MongoDB状态

    确保MongoDB服务正常运行:

    sudo systemctl status mongod
    

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

  1. 连接到一个数据节点

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

    mongo --host 192.168.1.100
    
  2. 添加仲裁节点

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

    rs.addArb("192.168.1.102:27017")  // 假设仲裁节点的IP是192.168.1.102
    

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

  3. 验证副本集状态

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

    rs.status()
    

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

    {"host" : "192.168.1.102:27017","arbiterOnly" : true,"stateStr" : "ARBITER","state" : 7,"uptime" : 100
    }
    

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

  1. 测试选举功能

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

  2. 验证数据同步

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/70027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AJAX 与 ASP 的深入探讨

AJAX 与 ASP 的深入探讨 引言 随着互联网技术的飞速发展,Web应用程序的交互性和性能要求越来越高。AJAX(Asynchronous JavaScript and XML)和ASP(Active Server Pages)作为两种重要的Web开发技术,在提高Web应用程序性能和用户体验方面发挥着重要作用。本文将深入探讨AJ…

内网下,Ubuntu (24.10) 离线安装docker最新版教程

一般在数据比较敏感的情况下,是无法使用网络的,而对于Ubuntu系统来说,怎么离线安装docker呢? 下面我给大家来讲一下: 采用二进制安装: 1.下载docker离线包 官网下载: Index of linux/static…

Copilot Next Edit Suggestions(预览版)

作者:Brigit Murtaugh,Burke Holland 排版:Alan Wang 我们很高兴向你介绍在本次 Visual Studio Code 发布中,关于 GitHub Copilot 的三个预览功能: Next Edit Suggestions(NES)Copilot Edits 的…

高性能内存对象缓存Memcached详细实验操作

目录 前提准备: cache1,2: 客户端cache-api(一定得是LAMP环境) memcache实现主主复制以及高可用(基于以上完成) cache1,2: memcachekeepalived(基于以上完成) cache1,2: 前提准备: 1. 准备三台cent…

全单模矩阵及其在分支定价算法中的应用

全单模矩阵及其在分支定价算法中的应用 目录 全单模矩阵的定义与特性全单模矩阵的判定方法全单模矩阵在优化中的核心价值分支定价算法与矩阵单模性的关系非全单模问题的挑战与系统解决方案总结与工程实践建议 1. 全单模矩阵的定义与特性 关键定义 单模矩阵(Unimo…

Spring AI发布!让Java紧跟AI赛道!

1. 序言 在当今技术发展的背景下,人工智能(AI)已经成为各行各业中不可忽视的重要技术。无论是在互联网公司,还是传统行业,AI技术的应用都在大幅提升效率、降低成本、推动创新。从智能客服到个性化推荐,从语…

【kafka系列】Kafka如何保证消息不丢失?

目录 1. 生产者端:确保消息成功发送到Broker 核心机制: 关键步骤: 2. Broker端:持久化与副本同步 核心机制: 关键源码逻辑: 3. 消费者端:可靠消费与Offset提交 核心机制: 关…

利用二分法+布尔盲注、时间盲注进行sql注入

一、布尔盲注&#xff1a; import requestsdef binary_search_character(url, query, index, low32, high127):while low < high:mid (low high 1) // 2payload f"1 AND ASCII(SUBSTRING(({query}),{index},1)) > {mid} -- "res {"id": payloa…

UART(一)——UART基础

一、定义 UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的串行通信协议,用于在设备间通过异步方式传输数据。它无需共享时钟信号,而是依赖双方预先约定的参数(如波特率)完成通信。 功能和特点 基本的 UART 系统只需三个信号即可提供稳健的中速全双工…

【PHP】php+mysql 活动信息管理系统(源码+论文+数据库+数据库文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【PHP】php 活动信息管理系统&#xff08;源码论文…

数据结构——单向循环链表、双链表、双向循环链表

目录 一、单向循环链表 1.1 单向循环链表的概念 1.2 单向循环链表的操作 1.2.1 单向循环链表的创建 1.2.2 单向循环链表的头插 1.2.3 单向循环链表的遍历 1.2.4 单向循环链表的头删 1.2.5 单向循环链表的尾插 1.2.6 单向循环链表的尾删 1.2.7 约瑟夫环 1.3 单向循环列表所有程…

Apache Iceberg 与 Apache Hudi:数据湖领域的双雄对决

在数据存储和处理不断发展的领域中&#xff0c;数据湖仓的概念已经崭露头角&#xff0c;成为了一种变革性的力量。数据湖仓结合了数据仓库和数据湖的最佳元素&#xff0c;提供了一个统一的平台&#xff0c;支持数据科学、商业智能、人工智能/机器学习以及临时报告等多种关键功能…

JavaScript数组-数组的概念

在JavaScript编程中&#xff0c;数组&#xff08;Array&#xff09;是一种非常重要的数据结构&#xff0c;它允许我们将多个值存储在一个单独的变量中。数组可以包含任意类型的元素&#xff0c;如数字、字符串、对象甚至是其他数组&#xff0c;并提供了丰富的内置方法来操作这些…

AcWing 800. 数组元素的目标和

题目来源&#xff1a; 登录 - AcWing 题目内容&#xff1a; 给定两个升序排序的有序数组 A 和 B&#xff0c;以及一个目标值 x。 数组下标从 0开始。 请你求出满足 A[i]B[j]x的数对 (i,j)。 数据保证有唯一解。 输入格式 第一行包含三个整数 n,m,x&#xff0c;分别表示 …

wordpress资讯类网站整站打包

wordpress程序&#xff0c;内置了价值499元的模板.但是有了模板没有全自动采集相信大多数人都搞不懂&#xff0c;目录那么多&#xff0c;全靠原创几乎是不可能的事情&#xff0c;除非你是大公司&#xff0c;每人控制一个板块&#xff0c; 这套源码里面最有价值的应该是这个采集…

python中的with是做什么的,有什么作用,什么时候需要用到with

&#x1f4cc; Python 中的 with 语句&#xff1a;作用 & 什么时候用 1️⃣ with 是干嘛的&#xff1f; with 主要用来 自动管理资源&#xff0c;确保资源&#xff08;文件、数据库连接等&#xff09;在使用完后能自动释放&#xff0c;避免资源泄露问题。 换句话说&…

浏览器的Cookie 过期时间存储

Cookie 是服务器发送到浏览器的小型文本数据&#xff0c;用于跟踪用户状态&#xff08;如登录信息、偏好设置&#xff09;&#xff0c;存储大小通常限制为 4KB&#xff0c;每个域名下最多允许约 20-50 个 Cookie&#xff08;不同浏览器不同&#xff09;。 属性 属性说明示例注…

hive全量迁移脚本

#!/bin/bash #场景&#xff1a;数据在同一库下&#xff0c;并且hive是内部表&#xff08;前缀的hdfs地址是相同的&#xff09;#1.读取一个文件&#xff0c;获取表名#echo "时间$dt_jian_2-------------------------" >> /home/hadoop/qianyi_zengliang/rs.txt#…

进阶——第十六届蓝桥杯嵌入式熟练度练习(开发板捕获频率和占空比)

单通道捕获频率 HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1); void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {if(htim->InstanceTIM2) {cap1HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);TIM2-&…

Python中如何进行数据库连接?

在 Python 中进行数据库连接&#xff0c;不同的数据库需要使用不同的库。下面分别介绍几种常见数据库&#xff08;SQLite、MySQL、PostgreSQL&#xff09;的连接方法。 1. 连接 SQLite 数据库 SQLite 是一种轻量级的嵌入式数据库&#xff0c;Python 标准库中自带了sqlite3模块…