首页 > 数据库 >MongoDB副本集故障切换期间的回滚

MongoDB副本集故障切换期间的回滚

时间:2024-09-22 14:46:26浏览次数:1  
标签:回滚 副本 MongoDB var 操作 节点

每当复制集在选举中替换主节点时,旧主节点可能包含未复制到辅助节点的文档。在这种情况下,旧的主节点会回滚这些写入内容。在回滚过程中,节点将处于 ROLLBACK 状态。处于 ROLLBACK 状态的节点有资格在选举中投票。

 

从 4.2 版开始,当节点进入 ROLLBACK 状态时,MongoDB 会杀死所有正在进行的用户操作。

 

当主节点在故障切换后重新加入其副本集时,回滚会恢复前主节点上的写操作。只有当主节点接受了写操作,辅助节点在主节点停机前未成功复制写操作时,才有必要进行回滚。当主节点作为辅助节点重新加入副本集时,它会恢复或 "回滚 "其写操作,以保持与其他成员数据库的一致性。

 

MongoDB 会尽量避免回滚,因为这种情况很少发生。当发生回滚时,通常是由于网络分区造成的。辅助节点如果跟不上前主节点的操作吞吐量,就会增加回滚的规模和影响。

 

如果写操作在主服务器宕机前复制到副本集的另一个成员,且该成员对副本集的大部分成员仍然可用和可访问,则不会发生回滚。

 

收集回滚数据

配置回滚数据

createRollbackDataFiles 参数控制回滚过程中是否创建回滚文件。

> db.adminCommand({ getParameter: 1, createRollbackDataFiles: 1 })
{
  createRollbackDataFiles: true,
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1726916568, i: 1 }),
    signature: {
      hash: Binary(Buffer.from("bda9d6f7fe20bbdf720debb782564bceea36638b", "hex"), 0),
      keyId: Long("7353838889632530433")
    }
  },
  operationTime: Timestamp({ t: 1726916568, i: 1 })
}

 

回滚数据

默认情况下,回滚发生时,MongoDB 会将回滚数据写入 BSON 文件。

 

对于数据被回滚的每个集合,回滚文件位于 <dbpath>/rollback/<collectionUUID> 目录中,文件名为

removed.<timestamp>.bson

 

例如,如果数据库reporting中的集合comments的数据回滚了

<dbpath>/rollback/20f74796-d5ea-42f5-8c95-f79b39bad190/removed.2020-02-19T04-57-11.0.bson

 

查看集合名称

要获取集合名称,可以在 MongoDB 日志中搜索回滚文件。例如,如果日志文件是 /var/log/mongodb/mongod.log,可以使用 grep 在日志中搜索 "rollback file "实例:

grep "rollback file" /var/log/mongodb/mongod.log

 

或者,也可以在所有数据库中循环运行 db.getCollectionInfos(),查找特定的 UUID,直到找到匹配为止。例如

var mydatabases=db.adminCommand("listDatabases").databases;
var foundcollection=false;

for (var i = 0; i < mydatabases.length; i++) {
   let mdb = db.getSiblingDB(mydatabases[i].name);
   collections = mdb.getCollectionInfos( { "info.uuid": UUID("20f74796-d5ea-42f5-8c95-f79b39bad190") } );

   for (var j = 0; j < collections.length; j++) {   // Array of 1 element
      foundcollection=true;
      print(mydatabases[i].name + '.' + collections[j].name);
      break;
   }

   if (foundcollection) { break; }
}

 

回滚数据排除

如果要回滚的操作是被删除集合或删除文档,则不会将回滚写入回滚数据目录。

 

读取回滚数据

要读取回滚文件的内容,请使用 bsondump。

 

避免副本集回滚

对于副本集,写关注 { w: 1 } 只提供对主数据写操作的确认。如果主服务器在写操作复制到任何辅助服务器之前宕机,数据可能会回滚。这包括在使用 { w: 1 } 写关注提交的多文档事务中写入的数据。

 

日志和写关注多数

为防止已向客户端确认的数据回滚,所有投票成员应启用日志功能,并使用 { w: "majority" } 写关注,以确保写操作在返回给客户端之前,传播到大多数副本集节点。

 

从 MongoDB 5.0 开始,{ w: "majority" } 是大多数 MongoDB 部署的默认设置。

 

当 writeConcernMajorityJournalDefault 设置为 false 时,MongoDB 在写入操作ack之前不会等待w: "majority"写关注写入磁盘日志。因此,写操作可能会回滚。

 

回滚注意事项

用户的操作

从 4.2 版开始,当成员进入 ROLLBACK 状态时,MongoDB 会终止所有正在进行的用户的操作。

 

索引的构建

对于FCV是4.2的,MongoDB 会等待任何正在进行的索引构建完成后才开始回滚。

 

禁用"majority"读关注会阻止修改索引的 collMod 命令回滚。如果需要回滚此类操作,必须将受影响的节点与主节点重新同步。

 

大小限制

MongoDB 支持以下具有不同大小限制的回滚算法:

·恢复到某个时间戳,这是默认的回滚算法。使用这种算法时,MongoDB 不会限制回滚的数据量。

·通过重新获取(Refetch)回滚,只有当配置文件中的 enableMajorityReadConcern 设置为 false 时,才会通过 Refetch 进行回滚。使用此算法时,MongoDB 最多只能回滚 300 MB 的数据。从 MongoDB 5.0 开始,enableMajorityReadConcern 设置为 true,且不可更改。

 

回滚运行时间限制

回滚时间限制默认为 24 小时,可使用 rollbackTimeLimitSecs 参数进行配置。

> db.adminCommand({ getParameter: 1, rollbackTimeLimitSecs: 1 })
{
  rollbackTimeLimitSecs: 86400,
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1726918891, i: 363 }),
    signature: {
      hash: Binary(Buffer.from("32f85ab925666561ffec530b73d70703dd3dcf3c", "hex"), 0),
      keyId: Long("7353838889632530433")
    }
  },
  operationTime: Timestamp({ t: 1726918891, i: 363 })
}

标签:回滚,副本,MongoDB,var,操作,节点
From: https://www.cnblogs.com/abclife/p/18424435

相关文章

  • ERROR StatusLogger NoSql contains an invalid element or attribute "MongoDb"
    报错:ERRORStatusLoggerNoSqlcontainsaninvalidelementorattribute"MongoDb"ERRORStatusLoggerNoSQLprovidernotspecifiedforappender[databaseAppender].ERRORStatusLoggerNullobjectreturnedforNoSqlinAppenders.ERRORStatusLoggerUnab......
  • MongoDB 与 Mongoose:了解它们的角色和差异
    mongoose和mongodb都是javascript中处理数据库不可或缺的一部分,但它们有不同的用途:1.mongodb:类型:nosql数据库。角色:mongodb是一个数据库管理系统(dbms),它以灵活的、类似json的文档(bson格式)存储数据。它提供与数据交互的核心功能,例如存储、检索和更新文档。用例:直......
  • mongoDB 读取数据python版本实现
    要使用Python从MongoDB读取数据,你可以使用pymongo库。首先确保你已经安装了pymongo,如果没有安装,可以通过pip来安装它:pipinstallpymongo接下来,我将展示如何使用给定的MongoDB连接字符串来连接数据库,并从一个集合中读取数据。假设你想从名为mydatabase的数据库中的mycollecti......
  • 使用MongoDB存储和查询数据的Python函数实现
    使用MongoDB存储和查询数据的Python函数实现MongoDB是一种流行的NoSQL数据库,因其灵活的文档存储和高性能查询能力而广受欢迎。在本文中,我们将详细介绍如何使用Python实现一个函数来存储和查询MongoDB中的数据。本文将涵盖MongoDB的基本概念、Python与MongoDB的连接、数据的......
  • 在服务器中搭建MongoDB
    MongoDB简介MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格......
  • MongoDB日志定时滚动归档
    #!/bin/bash#大于xxGpd_log_size=$(du-sh`grep'/log'\`ps-ef|grepmongo|grep-vgrep|awk-F'''{print$10}'\`|cut-d'"'-f2`|awk-F'''{print$1}'|grepG|cut-d'G'-f1)#大于xx......
  • MongoDB 查询文档内的对象属性
    基本查询语法在MongoDB中,查询文档内的对象属性通常使用$操作符和.操作符来实现。下面是基本的查询语法:使用.操作符访问对象属性:如:【对象.属性:值】db.collection.find({"object.property":value})查询对象的嵌套字段如果我们想要查询学生中数学成绩大于80分的学生,可以使用”.”运......
  • mongo 副本集rs 理解和使用小结
    转载请注明出处:在MongoDB中,rs(通常指的是“replicaset”的缩写)是复制集(ReplicaSet)的标识符或在使用时的一种常见前缀,尤其是在命令行工具和脚本中引用复制集时。复制集是MongoDB用来实现数据冗余和高可用性的一个核心组件。复制集(ReplicaSet)的作用:数据冗余:复制集在多个......
  • MERN 应用程序无法从 MongoDB 中删除项目
    应用程序无法从MongoDB中删除项目问题描述错误信息在MERN应用程序中尝试从MongoDB中删除项目时遇到问题。具体表现为执行删除操作后,项目未能从数据库中成功移除。错误信息可能包括数据库连接问题、权限不足、语法错误等。通过查看控制台输出或服务器日志,可以获取更详细的错误......
  • MongoDB增加身份验证
    1.数据库添加用户和密码mongo>useadmin>db.createUser({user:"nucRoot",pwd:"f71F!6",roles:["root"]}) 2.修改启动文件,通过auth方式启动,完整如下(INI格式)dbpath=/usr/local/mongodb/data/dblogpath=/usr/local/mongodb/data/logs/mongodb.loglogap......