MongoDB添加仲裁节点报错:replica set IDs do not match的解决方法

MongoDB添加仲裁节点报错:"replica set IDs do not match",是指新加入的仲裁节点与当前副本集在复制集标识(replica set ID)上不匹配。下面详细讲解解决该问题的完整流程。

1. 确认副本集的replica set ID

首先需要确认副本集的复制集标识(replica set ID),可以在已有的副本集成员上执行如下命令:

rs.conf()

命令会返回副本集的配置信息,其中包含了复制集标识。例如执行rs.conf()命令返回的结果为:

{
    "_id": "test",
    "version": 6,
    "protocolVersion": 1,
    "members": [
        {
            "_id": 0,
            "host": "192.168.1.1:27017",
            "arbiterOnly": false,
            "buildIndexes": true,
            "hidden": false,
            "priority": 1,
            "tags": {},
            "slaveDelay": 0,
            "votes": 1
        },
        {
            "_id": 1,
            "host": "192.168.1.2:27017",
            "arbiterOnly": false,
            "buildIndexes": true,
            "hidden": false,
            "priority": 1,
            "tags": {},
            "slaveDelay": 0,
            "votes": 1
        }
    ],
    "settings": {
        "chainingAllowed": true,
        "heartbeatIntervalMillis": 2000,
        "heartbeatTimeoutSecs": 10,
        "electionTimeoutMillis": 10000,
        "getLastErrorModes": {},
        "getLastErrorDefaults": {
            "w": 1,
            "wtimeout": 0
        },
        "replicaSetId": ObjectId("5be48c9d64beb5356311f174")
    }
}

可以看到副本集的名称为test,复制集标识为ObjectId("5be48c9d64beb5356311f174")。

2. 确认新节点的复制集标识

在将新节点加入副本集之前,需要确认该节点的复制集标识。可以在新节点上执行如下命令:

db.adminCommand({replSetGetStatus: 1})

命令返回新节点的副本集状态,其中packets最后一行包含了新节点的复制集标识。例如执行db.adminCommand({replSetGetStatus: 1})命令返回的结果为:

{
    "ok": 1,
    "members": [
        {
            "_id": 0,
            "name": "192.168.1.1:27017",
            "health": 1,
            "state": 1,
            "stateStr": "PRIMARY",
            "uptime": 126455,
            "optime": {
                "ts": Timestamp(1541876385, 2),
                "t": NumberLong("1")
            },
            "optimeDate": ISODate("2018-11-10T07:26:25Z"),
            "electionTime": Timestamp(1541876458, 1),
            "electionDate": ISODate("2018-11-10T07:27:38Z"),
            "configVersion": 6,
            "self": true
        },
        {
            "_id": 1,
            "name": "192.168.1.2:27017",
            "health": 1,
            "state": 2,
            "stateStr": "SECONDARY",
            "uptime": 88502,
            "optime": {
                "ts": Timestamp(1541876385, 2),
                "t": NumberLong("1")
            },
            "optimeDurable": {
                "ts": Timestamp(1541876385, 2),
                "t": NumberLong("1")
            },
            "optimeDate": ISODate("2018-11-10T07:26:25Z"),
            "optimeDurableDate": ISODate("2018-11-10T07:26:25Z"),
            "lastHeartbeat": ISODate("2018-11-11T02:40:09.181Z"),
            "lastHeartbeatRecv": ISODate("2018-11-11T02:40:08.219Z"),
            "pingMs": NumberLong("0"),
            "syncingTo": "192.168.1.1:27017",
            "configVersion": 6
        },
        {
            "_id": 2,
            "name": "192.168.1.3:27017",
            "health": 1,
            "state": 7,
            "stateStr": "ARBITER",
            "uptime": 85392,
            "lastHeartbeat": ISODate("2018-11-11T02:40:08.119Z"),
            "lastHeartbeatRecv": ISODate("2018-11-11T02:40:07.461Z"),
            "pingMs": NumberLong("0"),
            "configVersion": 6
        }
    ],
    "ok": 1,
    "operationTime": Timestamp(1541913608, 1),
    "$clusterTime": {
        "clusterTime": Timestamp(1541913608, 1),
        "signature": {
            "hash": BinData(0, "AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId": NumberLong("0")
        }
    },
    "myState": 1,
    "term": NumberLong("1"),
    "maxElectionId": ObjectId("7fffffff0000000000000001"),
    "maxCommittedOpTime": {
        "ts": Timestamp(1541876385, 2),
        "t": NumberLong("1")
    },
    "members": {...},
    "set": "test",
    "date": ISODate("2018-11-11T02:41:25.187Z")
}

可以看到新节点的复制集标识为7fffffff0000000000000001。如果新节点的复制集标识与副本集不匹配,则会出现"replica set IDs do not match"错误。

3. 更新新节点的复制集标识

为了让新节点的复制集标识与副本集匹配,我们可以在新节点上使用rs.initiate()命令初始化一个新的副本集,指定和已有的副本集相同的名称和复制集标识。如下所示:

rs.initiate({_id: "test", members: [{_id: 0, host: "192.168.1.3:27017", priority: 0, arbiterOnly: true}]}, {force: true})

其中_id指定副本集名称,members数组指定初始化节点的信息,这里只添加了一个arbiter节点,用来充当仲裁节点,因此priority被设置为0,arbiterOnly被设置为true,其他参数保持默认。

添加完成后,可以使用db.adminCommand({replSetGetStatus: 1})命令再次查看新节点的副本集状态,确认新节点的复制集标识确实被更新成功。

4. 将新节点加入副本集

最后,可以使用rs.add()命令将新节点加入到副本集中。如下所示:

rs.add({host:"192.168.1.3:27017", arbiterOnly:true, priority:0})

其中host指定新节点的地址,arbiterOnly和priority参数和初始化时一样,需要保证新节点和其他节点的参数设置保持一致。

至此,新节点已经成功加入到副本集中作为仲裁节点,"replica set IDs do not match"错误也得到了解决。

示例说明:

  1. 假设副本集的名称为myrs,复制集标识为ObjectId("5be16b51ba629f4b47a24b02"),新节点IP为192.168.1.4:27017,执行以下命令:
db.adminCommand({replSetGetStatus: 1})

返回的结果中不包含新节点的信息,说明新节点还未加入副本集。

  1. 在新节点上执行以下命令,确认新节点的复制集标识:
db.adminCommand({replSetGetStatus: 1})

返回的结果中包含新节点的信息,复制集标识为ObjectId("5be16d8fba629f4b47a24b05"),与副本集不匹配。

  1. 在新节点上执行以下命令,初始化一个新的副本集:
rs.initiate({_id: "myrs", members: [{_id: 0, host: "192.168.1.4:27017", priority: 0, arbiterOnly: true}]}, {force: true})

其中_id指定副本集名称,members数组指定初始化节点的信息,这里只添加了一个arbiter节点,用来充当仲裁节点,因此priority被设置为0,arbiterOnly被设置为true,其他参数保持默认。

  1. 确认新节点的复制集标识已更新:
db.adminCommand({replSetGetStatus: 1})

返回的结果中新节点的复制集标识为ObjectId("5be16b51ba629f4b47a24b02"),与副本集匹配。

  1. 将新节点加入副本集:
rs.add({host:"192.168.1.4:27017", arbiterOnly:true, priority:0})

返回的结果中包含了新加入的节点信息,说明新节点已加入副本集,且作为仲裁节点工作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MongoDB添加仲裁节点报错:replica set IDs do not match的解决方法 - Python技术站

(1)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Django实现的自定义访问日志模块示例

    下面是 “Django实现的自定义访问日志模块示例”的完整攻略。 1. 什么是Django自定义访问日志模块 Django访问日志模块可以记录用户的访问请求信息,以方便开发者分析、监控和优化代码。Django默认提供了一个访问日志系统,但其功能较为基础,无法满足一些实际场景的需求。因此,开发者可以通过自定义访问日志模块,实现功能更加全面、高效的日志系统。 2…

    人工智能概览 2023年5月25日
    00
  • C#实现窗体中的各个控件同比自动放缩大小

    针对这个问题,我给您详细讲解一下“C#实现窗体中的各个控件同比自动放缩大小”的完整攻略。以下是具体步骤: Step 1:用CS代码进行窗体控件大小自适应的编写 在C#中实现窗体控件大小自适应,我们一般需要实现的是针对窗体的Resize事件进行处理。代码示例如下: private float X; //记录该控件的原始宽度 private float Y; /…

    人工智能概论 2023年5月25日
    00
  • Django与Vue语法的冲突问题完美解决方法

    下面就详细讲解一下“Django与Vue语法的冲突问题完美解决方法”的攻略。 问题背景 在使用Django和Vue进行前后端分离开发时,由于两者的模板语法存在较大的差异,可能会导致一些冲突问题,比如在vue组件中使用{{}}语法可能与Django模板引擎产生冲突。 解决方法 Django与Vue语法的冲突问题可以通过以下几种方式进行解决。 1. 修改Vue模…

    人工智能概论 2023年5月25日
    00
  • vue实现前端分页完整代码

    下面是“Vue实现前端分页完整代码”的详细讲解攻略,包括代码示例。 什么是前端分页 前端分页是指在浏览器端进行数据分页处理,采用JavaScript实现。该技术可以减轻服务器的负担,提高网站性能,给用户带来更流畅、更友好的交互体验。 基于Vue的前端分页实现 Vue是一款流行的JavaScript框架,为前端开发提供了快速、简便的构建SPA(单页应用)的方式…

    人工智能概论 2023年5月25日
    00
  • C语言求连续最大子数组和的方法

    C语言求连续最大子数组和,是一个经典的算法问题,通常可以有多种不同的实现方式。下面,我将分享一种基于动态规划的解法,并且给出两个示例以帮助解释。 1. 动态规划法 动态规划是一种常用的解决优化问题的算法。对于本题,基本思路是对于前n个数,分别计算以第i个数结尾的最大子数组和,然后再取其中的最大值。 以数组nums = {1, -2, 3, 10, -4, 7…

    人工智能概览 2023年5月25日
    00
  • 如何使用C#扫描并读取图片中的文字

    下面我会为您详细讲解如何使用C#扫描并读取图片中的文字。 方案概述 使用C#扫描并读取图片中的文字,我们需要以下几个步骤: 安装并引用OCR识别API,例如百度云OCR API或阿里云OCR API等; 载入图片文件到内存中; 调用OCR识别API将图片中的文字识别出来; 对识别结果进行处理,例如从识别结果中提取出特定信息,或者将识别结果输出到文本文件中等。…

    人工智能概论 2023年5月25日
    00
  • pytorch载入预训练模型后,实现训练指定层

    在PyTorch中,如果要载入预训练模型并对指定层进行训练,可以按照以下步骤进行操作: 载入预训练模型 在PyTorch中,载入预训练模型可以使用torchvision.models模块中的预置模型,例如resnet18。此外,如果需要使用自己的预训练模型,也可以使用torch.load()方法将之前训练好的模型载入。代码如下: import torch i…

    人工智能概论 2023年5月25日
    00
  • django filters实现数据过滤的示例代码

    来讲解一下使用django filters实现数据过滤的示例代码的攻略。 什么是django filters django filters是django框架的一个插件库,用于实现数据过滤,可以在django的view视图函数、模板中使用,十分实用。 它提供了很多数据过滤的方法和内置的一些数据过滤器,在我们查询和过滤数据时,可以大大提升开发效率。 django…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部