副本集 Election succeeded

目录

  • 1. 分析mongo副本集 Election succeeded 的全过程:
  • 2. 从日志里面看到数据库一致性的对比吗?
  • 3. 模拟主备不同步,副本集切换
    • 步骤
        • 注意事项:
      • not master and slaveOk=false
        • 解释:
    • 其他方案
      • 方法一:使用 `rs.stepDown()` 命令
      • 方法二:使用 `rs.slaveOk` 命令
      • 方法三:使用 `mongod` 配置文件
        • 注意事项
  • 4. 细节
    • 分析选举过程
      • 数据一致性分析
      • 结论
    • replSetStepDown
    • replication

1. 分析mongo副本集 Election succeeded 的全过程:

在这里插入图片描述

从提供的日志中,我们可以看到以下关键步骤描述了副本集中的选举过程:

  • Election Triggered: 选举过程开始于一个节点(10.10.98.127:3692)接收到 replSetStepUp 请求,这通常意味着该节点决定自己应该成为新的主节点。

  • Election Process: 随后,该节点开始选举过程(Starting an election due to step up request),并跳过干运行(dry run),直接进行选举(Skipping dry run and running for election)。

  • Vote Requests: 该节点作为候选人,向其他成员发送投票请求(VoteRequester),请求它们投票支持它成为新的主节点。

  • Vote Responses: 从日志中我们可以看到,至少有一个节点(10.10.98.127:3692)对该候选人的投票请求做出了肯定的响应(VoteRequester processResponse),而另一个节点(10.10.98.123:7315)由于正在关闭(ShutdownInProgress),未能成功投票。

  • Election Success: 由于收到了足够的肯定票数,选举成功,该节点(10.10.98.125:4933)假设了主节点的角色(Election succeeded, assuming primary role)。

  • State Transition: 随后,该节点的状态转变为 PRIMARYReplica set state transition),这意味着它现在是副本集的主节点。

  • Sync Source Reset: 新的主节点重置了其同步源(Resetting sync source to empty),准备开始接受写操作。

  • Catch-up Mode: 新的主节点进入追赶模式(Entering primary catch-up mode),以确保它拥有最新的数据。

  • Topology Changes: 随着新主节点的确立,副本集的拓扑结构也随之更新,其他节点的状态也相应更新。

2. 从日志里面看到数据库一致性的对比吗?

在提供的日志中,并没有直接的数据库一致性对比操作的记录。MongoDB副本集的一致性通常是通过复制主节点的操作日志(oplog)来维护的。当一个节点成为新的主节点时,其他次要节点会从这个新的主节点同步数据,以确保数据的一致性。

在选举成功后,新的主节点(10.10.98.125:4933)会开始接受写操作,而其他节点则会尝试与其同步来更新自己的数据。然而,日志中并没有显示具体的数据对比或一致性检查的过程。通常,这些细节在副本集的日常操作中是自动处理的,除非出现同步问题或数据不一致的情况,否则不会在日志中特别记录。

3. 模拟主备不同步,副本集切换

步骤

人为制造数据不一致的情况在测试环境中可以模拟,但请谨慎操作,因为这可能会影响数据库的稳定性。以下是模拟数据不一致的步骤:

  1. 确定当前的主节点
    首先,你需要确定哪个节点是当前的主节点。可以通过以下命令查看副本集的状态:

    rs.status()
    
  2. 在主节点上执行写操作
    选择一个数据库和集合,然后执行写操作。例如,向 testDB 数据库的 testCollection 集合插入文档:

    use testDB1
    db.testCollection.insert({data1: "This is a test document."})
    
  3. 隔离主节点
    接下来,你需要从网络层面隔离这个主节点,以阻止它与其他副本集成员同步。这通常涉及到修改网络配置或使用网络工具。例如,你可以使用 iptables 命令在Linux系统上阻止来自特定端口的流量:

    sudo iptables -A INPUT -p tcp --dport 27017 -j DROP
    

    这个命令会阻止所有进入MongoDB默认端口(27017)的TCP流量。请注意,你应该根据实际使用的端口和IP地址调整这个命令。

删除 iptables 规则 https://blog.csdn.net/hezuijiudexiaobai/article/details/130659181

备库加锁

mongo -uroot -p qm7gkmnDr_oPl1di

db.fsyncLock() 

在这里插入图片描述

  1. 确认数据不一致
    在隔离主节点之后,尝试在其他从节点上读取数据,检查是否能够看到刚才写入的数据。由于主节点被隔离,这些数据不会同步到其他节点,从而产生数据不一致。

  2. 恢复网络连接
    一旦你完成了测试,应该恢复主节点的网络连接,以便副本集可以恢复正常操作。使用以下命令撤销之前设置的 iptables 规则:

    sudo iptables -D INPUT -p tcp --dport 27017 -j DROP
    
  3. 重新同步数据
    网络连接恢复后,副本集将尝试重新同步数据。你可以使用 rs.syncFrom 命令强制一个从节点从特定的同步源开始同步:

    db.runCommand({replSetSyncFrom: "syncSourceMemberName"})
    

    其中 syncSourceMemberName 是你选择的同步源成员的名字。

注意事项:
  • 请确保在测试环境中执行这些操作,避免在生产环境中造成数据丢失或服务中断。
  • 在进行这些操作之前,确保你已经备份了所有重要数据。
  • 根据你的MongoDB版本和配置,命令和步骤可能会有所不同。

人为制造数据不一致是一种高级操作,通常只在特定的测试场景下进行。在大多数情况下,你应该尽量保持副本集的同步和一致性。

not master and slaveOk=false

错误信息 "not master and slaveOk=false" 表示你尝试在一个非主节点上执行操作,而且 slaveOk 参数没有被设置为 true。在MongoDB副本集中,大多数读操作默认只能针对主节点进行,从节点默认不接受普通查询操作,除非 slaveOk 设置为 true

要解决这个问题,你可以在查询时添加 slaveOk 选项,这允许你的操作在非主节点上执行。以下是如何修改你的命令以包含 slaveOk

db.getMongo().setReadPref('secondary');
db.system.log.find().sort({$natural: -1}).limit(1)

或者直接使用 slaveOk 参数:

db.system.log.find().slaveOk().sort({$natural: -1}).limit(1)

这两种方法都会让你的查询可以在从节点上执行。第一种方法通过设置读取偏好来实现,第二种方法直接在查询上设置 slaveOk

解释:
  • db.getMongo().setReadPref('secondary'):这行代码设置了全局的读取偏好为从节点(secondary)。这意味着所有后续的读操作都会尝试在从节点上执行。
  • slaveOk():这个方法是直接在查询上设置,允许这个特定的查询在从节点上执行。

通常,查看日志的操作不会对数据库性能产生显著影响,因此可以在从节点上执行。但是,确保在生产环境中合理使用这些设置,以避免不必要的负载。

在这里插入图片描述
错误信息 "not master and slaveOk=false" 表示你正在尝试在一个从节点上执行 show dbs 命令,而这个命令默认只能在主节点上执行。在从节点上执行需要设置 slaveOktrue

你已经尝试使用 db.getMongo().setReadPref('secondary') 来设置读取偏好,但这个命令实际上并没有改变 slaveOk 的值。你需要使用 setSlaveOk 方法来显式地允许从节点上的查询。

在MongoDB Shell中,你可以使用以下命令来允许从节点上的查询:

db.getMongo().setSlaveOk();

或者,你可以直接使用:

db.setSlaveOk();

这将允许当前数据库连接在从节点上执行查询。然后,你应该能够执行 show dbs 命令:

show dbs;

请注意,setSlaveOk 只影响当前的数据库连接。如果你打开一个新的MongoDB Shell连接,你需要再次执行这个命令。

另外,从MongoDB 3.2版本开始,slaveOk 已经被标记为过时,建议使用 readPreference 来代替。但是,对于你的需求来说,使用 setSlaveOk 应该足够了。

确实,MongoDB 副本集在主节点失去连接时会触发选举过程,以确保始终有一个主节点来处理写操作。如果你希望模拟数据不一致而不触发选举,可以尝试以下方法:

其他方案

方法一:使用 rs.stepDown() 命令

  1. 确定主节点
    使用 rs.status() 命令确定当前的主节点。

  2. 执行 rs.stepDown()
    在主节点上执行 rs.stepDown() 命令,使主节点主动放弃主节点地位并触发选举。你可以指定 stepDown 命令的 force 选项来确保即使无法选举出新的主节点也会执行。

    db.runCommand({replSetStepDown: 60, force: true})
    

    这个命令会使当前的主节点在 60 秒内拒绝任何新的选举。如果在此期间没有其他节点当选,副本集将没有主节点。

  3. 执行写操作
    在主节点上执行写操作,然后迅速将该节点从副本集中移除或停止其 mongod 进程。

  4. 检查数据一致性
    在其他节点上检查是否能读取到刚才写入的数据。

  5. 恢复主节点
    恢复主节点的服务,并观察副本集如何重新选举和同步数据。

方法二:使用 rs.slaveOk 命令

  1. 设置 slaveOk
    在从节点上设置 slaveOktrue,允许从节点处理查询。

    db.getMongo().setReadPref('secondary');
    
  2. 执行写操作
    在主节点上执行写操作。

  3. 停止主节点的复制进程
    停止主节点的复制进程,但不完全关闭数据库服务。这可以通过停止 oplog 的写入来实现,例如,通过设置 oplogSize0(不推荐在生产环境中使用)。

  4. 执行更多写操作
    在主节点上执行更多写操作。

  5. 检查数据一致性
    在其他节点上检查是否能读取到刚才写入的数据。

方法三:使用 mongod 配置文件

  1. 修改配置文件
    mongod.conf 文件中设置 replSet 配置,并设置 enableMajorityReadConcern=false 以允许从节点在没有同步最新数据的情况下提供读服务。

  2. 重启 MongoDB 服务
    重启 MongoDB 服务以应用新的配置。

  3. 执行写操作
    在主节点上执行写操作。

  4. 隔离主节点
    通过修改网络配置或使用防火墙规则,隔离主节点,使其无法与其他节点通信。

  5. 检查数据一致性
    在其他节点上检查是否能读取到刚才写入的数据。

注意事项
  • 这些方法可能会影响数据库的稳定性和数据的完整性,请在测试环境中进行。
  • 确保在进行这些操作之前备份所有重要数据。
  • 在生产环境中,应尽量避免人为制造数据不一致的情况。

通过这些方法,你可以在不触发选举的情况下模拟数据不一致的情况。

4. 细节

分析选举过程

从你提供的日志中,我们可以看到以下关键信息:

  1. 选举过程

    • 一个成员(10.10.98.125:4933)成功进行了干运行选举(Dry election run),并决定参与正式选举(running for election)。
    • 在正式选举中,该成员获得了足够的票数,并成功成为主节点(Election succeeded, assuming primary role)。
  2. 角色转换

    • 成员(10.10.98.125:4933)从 SECONDARY 状态转变为 PRIMARY 状态。
  3. 数据一致性

    • 在成为主节点后,该成员进入了 primary catch-up mode,这意味着它开始同步数据以确保与其他成员的数据一致性。
    • 同步完成后,成员退出了 primary catch-up modeExited primary catch-up mode)。
  4. 数据操作

    • 有创建集合(createCollection)和建立索引(Index build: done building)的操作记录,这表明在主节点上执行了数据定义操作。
  5. 网络问题

    • 存在一些网络超时问题(NetworkInterfaceExceededTimeLimit),表明某些副本集成员在尝试建立连接时超时。
  6. 连接管理

    • 有多个连接被接受和结束的记录,这是正常的连接管理活动。
  7. 手动干预

    • 在日志的最后部分,有一个成员执行了 replSetStepDown 命令,这通常用于手动让主节点退位,触发新的选举。

数据一致性分析

在日志中,我们可以看到以下与数据一致性相关的信息:

  1. 数据同步

    • 成员在成为主节点后,进入了 primary catch-up mode,这有助于确保数据的一致性。
  2. 集合和索引创建

    • 集合 testDB1.testCollection 被创建,并且相关的索引也成功建立。这表明在主节点上执行了数据定义操作。
  3. 手动干预

    • replSetStepDown 命令的执行可能导致了主节点的角色变更,这可能会触发新的选举和数据同步过程。

结论

  • 选举成功:成员 10.10.98.125:4933 成功成为主节点,并且进行了数据同步以确保一致性。
  • 数据操作:在主节点上成功执行了集合和索引的创建,这有助于数据管理和查询性能。
  • 网络问题:需要关注网络超时问题,确保所有副本集成员之间的网络连接稳定。

如果需要进一步分析数据一致性,可以检查副本集成员之间的同步状态和延迟,使用 rs.status() 命令查看副本集的详细状态。此外,确保网络问题得到解决,以避免影响副本集的正常运行和数据一致性。

replSetStepDown

在 MongoDB 副本集中,replSetStepDown 命令用于手动使当前的主节点(PRIMARY)退位,变成次要节点(SECONDARY)。这通常出于以下原因:

  1. 维护或升级:需要对主节点进行维护或升级时,可以手动执行 replSetStepDown 来平滑地将主节点角色转移给其他节点,以减少对服务的影响。

  2. 故障排除:如果主节点遇到问题(如性能瓶颈、配置错误等),可以通过退位来将主节点角色转移给健康的次要节点,然后对问题节点进行调查和修复。

  3. 平衡负载:在某些情况下,可能需要重新平衡副本集的负载,例如,当前主节点的负载过高,可以通过退位操作将主节点角色转移给其他节点。

  4. 测试和演练:在测试环境中,可能使用 replSetStepDown 命令来模拟主节点故障,以验证副本集的故障转移和选举机制是否正常工作。

  5. 数据恢复:如果主节点上的数据出现问题,可能需要将其退位,以便在次要节点上进行数据恢复操作。

  6. 版本升级:在进行 MongoDB 版本升级时,可能需要先让主节点退位,以确保升级过程中不会影响写操作。

从你提供的日志中,我们可以看到以下相关条目:

  • Attempting to step down in response to replSetStepDown command:表明 replSetStepDown 命令被触发,节点开始执行退位操作。
  • Exiting primary catch-up modeStopping replication producer:在退位过程中,节点停止作为主节点的复制生产者。
  • Replica set state transition:记录了节点状态的转换,从 PRIMARY 变为 SECONDARY
  • Handing off election:表明该节点正在将选举过程交给另一个节点。

执行 replSetStepDown 命令是一个受控的操作,通常由数据库管理员在确保副本集高可用性和数据一致性的前提下进行。在执行此命令之前,应确保副本集中的其他成员是健康的,并且能够接管主节点的职责。

replication

在 MongoDB 副本集环境中,当一个次要节点(SECONDARY)需要从一个主节点(PRIMARY)复制数据时,它会通过查询主节点的 oplog 来获取变更。这个过程称为“同步”(replication),并且依赖于持续读取 oplog 来确保数据的一致性。

日志条目 Canceling oplog query due to OplogQueryMetadata. We have to choose a new sync source 指出了以下情况:

  1. 当前同步源(sync source)问题

    • 当前作为同步源的主节点可能遇到问题或不再可用(比如,主节点宕机、网络问题或配置变更)。
  2. 需要选择新的同步源

    • 当副本集的成员无法从当前的同步源获取数据时,它必须选择另一个可用的同步源来继续数据复制过程。
  3. OplogQueryMetadata 触发

    • OplogQueryMetadata 可能指的是副本集成员在尝试读取 oplog 时遇到的问题,如读取超时、数据不一致或其他错误。
  4. 取消 oplog 查询

    • 当副本集成员检测到当前同步源不再可用或存在问题时,它会取消当前的 oplog 查询,以避免进一步的同步错误。
  5. 选择新的同步源

    • 副本集成员将开始寻找新的同步源,通常是另一个健康的次要节点或新的主节点。选择过程基于副本集的配置和成员状态。

这种情况可能由以下原因引起:

  • 主节点故障:当前的主节点可能由于故障或维护而无法访问。
  • 网络问题:可能存在网络连接问题,导致副本集成员无法从当前同步源获取数据。
  • 配置更改:副本集的配置可能发生变化,如主节点被移除或替换。
  • 数据一致性问题:检测到数据不一致或其他问题,需要从不同的同步源重新同步数据。

在这种情况下,副本集的成员会自动尝试找到一个新的同步源并继续复制过程,以确保数据的一致性和副本集的高可用性。这是 MongoDB 副本集自我修复和高可用性特性的一部分。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时间同步服务

多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协 议,日志,集群等。 利用NTP(Network Time Protocol) 协议使网络中的各个计算机时间达到…

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多&a…

vmware用ghost镜像ios、esd格式装系统

1、需要下载一个pe.iso镜像,可以用大白菜,老毛桃什么的,vmware选择从光盘启动 然后在PE里面把磁盘分为两个区,C,D盘 然后修改ISO镜像,变成要恢复的ghost包 把iso里面文件拷贝到D盘,用桌面PE工具开始重…

鸿蒙开发中实现自定义弹窗 (CustomDialog)

效果图 #思路 创建带有 CustomDialog 修饰的组件 ,并且在组件内部定义controller: CustomDialogController 实例化CustomDialogController,加载组件,open()-> 打开对话框 , close() -> 关闭对话框 #定义弹窗 (CustomDial…

视频汇聚平台LntonAIServer视频质量诊断功能--偏色检测与噪声检测

随着视频监控技术的不断进步,视频质量成为了决定监控系统性能的关键因素之一。LntonAIServer新增的视频质量诊断功能,特别是偏色检测和噪声检测,进一步强化了视频监控系统的可靠性和实用性。下面我们将详细介绍这两项功能的技术细节、应用场景…

[数据集][目标检测]机油泄漏检测数据集VOC+YOLO格式43张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):43 标注数量(xml文件个数):43 标注数量(txt文件个数):43 标注类别数…

图形语言传输格式glTF和三维瓦片数据3Dtiles(b3dm、pnts)学习

文章目录 一、3DTiles二、b3dm三、glTF1.glTF 3D模型格式有两种2.glTF 场景描述结构和坐标系3.glTF的索引访问与ID4.glTF asset5.glTF的JSON结构scenesscene.nodes nodesnodes.children transformations对外部数据的引用buffers 原始二进制数据块,没有固有的结构或含…

【Day09】

目录 Mybatis-基础操作-环境准备 Mybatis-基础操作-删除 Mybatis-基础操作-删除(预编译SQL) Mybatis-基础操作-新增 Mybatis-基础操作-新增(主键返回) Mybatis-基础操作-更新 Mybatis-基础操作-查询(根据ID查询) Mybatis-基…

Apache Pig

目录 一、配置说明1.本地模式2.集群模式 二、pig的数据模型三、pig的数据类型四、惰性执行五、pig的基本语法5.1语法说明5.2案例操作 六、pig的自定义函数 一、配置说明 1.本地模式 操作的是Linux系统文件 pig -x local关键日志 当前处于root目录下 2.集群模式 连接的是…

14.1 为什么说k8s中监控更复杂了

本节重点介绍 : k8s中监控变得复杂了,挑战如下 挑战1: 监控的目标种类多挑战2: 监控的目标数量多挑战3: 对象的变更和扩缩特别频繁挑战4: 监控对象访问权限问题 k8s架构图 k8s中监控变得复杂了,挑战如下 挑战1: 监控的目标种类多 对象举例 podnodese…

资料分析系统课-刘文超老师

1、考试大纲 2、解题的问题->解决方法 3、统计术语 基期量与现期量:作为对比参照的时期称为基期,而相对于基期的称为现期。描述具体数值时我们称之为基期量和现期量。 增长量:是指基期量与现期量增长(或减少)的绝对量。增长量是具体值&…

点云数据常见的坐标系有哪些,如何进行转换?

文章目录 一、点云坐标系分类1. 世界坐标系2. 相机坐标系3. 极坐标系4. 笛卡尔坐标系(直角坐标系):5. 传感器坐标系6. 地理坐标系二、坐标系转换方法1. 地理坐标系与投影坐标系之间的转换2. 投影坐标系与局部坐标系之间的转换3. 局部坐标系与3D模型坐标系之间的转换4. 相机坐…

【Grafana】Prometheus结合Grafana打造智能监控可视化平台

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Jenkins+Svn+Vue自动化构建部署前端项目(保姆级图文教程)

目录 介绍 准备工作 配置jenkins 构建部署任务 常见问题 介绍 在平常开发前端vue项目时,我们通常需要将vue项目进行打包构建,将打包好的dist目录下的静态文件上传到服务器上,但是这种繁琐的操作是比较浪费时间的,可以使用jenkins进行自动化构建部署前端vue 准备工作 准备…

【论文阅读】CiteTracker: Correlating Image and Text for Visual Tracking

paper:[2308.11322] CiteTracker: Correlating Image and Text for Visual Tracking (arxiv.org) code:NorahGreen/CiteTracker: [ICCV23] CiteTracker: Correlating Image and Text for Visual Tracking (github.com) 简介 现有的视觉跟踪方法通常以…

[C#学习笔记]注释

官方文档&#xff1a;Documentation comments - C# language specification | Microsoft Learn 一、常用标记总结 1.1 将文本设置为代码风格的字体&#xff1a;<c> 1.2 源代码或程序输出:<code> 1.3 异常指示:<exception> 1.4 段落 <para> 1.5 换行&…

Ubuntu 22.04 make menuconfig 失败原因

先 安装一些配置 linux下使用menuconfig需要安装如下库_menuconfig 安装-CSDN博客 然后 cd 到指定源代码 需要在内核文件目录下编译 Linux 内核源码&#xff08;kernel source&#xff09;路径_--kernel-source-path-CSDN博客 make menuconfig 又报错 说是gcc 12什么什么&…

QT6聊天室项目 网络通信实现逻辑分析

实现逻辑 模块话网络通信设计分析 NetClient类 功能&#xff1a;负责与服务器进行通信httpClient:处理HTTP请求websocketClient&#xff1a;处理WebSocket通信 HTTP请求封装 设计请求和服务器响应的接口设计函数测试网络连接性设计处理的函数处理HTTP请求&#xff08;后期实现…

file | 某文件夹【解耦合】下的文件查找功能实现及功能单元测试

文件查找工具 概要思路OS模块 --- 学习版os.getcwd()os.path.dirname(os.getcwd())os.path.dirname() 和 os.path.basename() OS模块 — 实战版单元测试解耦合 概要 梳理业务主逻辑&#xff1a; 查看存放被采集JSON数据的文件夹内的文件列表【所有 包含文件夹下的文件夹下的文…

【软件工程】软件开发模型

三、瀑布模型 四、几种软件开发模型的主要特点 题目 判断题 选择题 小结