zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

mongodb副本集主从切换

2023-04-18 15:35:44 时间

前文已有mongodb副本集搭建及添加节点的记录

mongodb 4.0副本集搭建

mongodb副本集添加节点

本次进行主从切换及删除节点的操作。

1. 主从切换

1.1 查询当前节点信息及状态

使用rs.status()命令可以查看到当前副本集各节点信息及角色

节点id

节点

角色

node0

192.168.56.198:27017

PRIMARY

node1

192.168.56.199:27018

ARBITER

node2

192.168.56.197:27017

SECONDARY

node3

192.168.56.199:27017

SECONDARY

test12:PRIMARY> rs.status()
{
  "set" : "test12",
  "date" : ISODate("2021-12-16T13:45:28.261Z"),
  "myState" : 1,
  "term" : NumberLong(3),
  "syncingTo" : "",
  "syncSourceHost" : "",
  "syncSourceId" : -1,
  "heartbeatIntervalMillis" : NumberLong(2000),
  "majorityVoteCount" : 3,
  "writeMajorityCount" : 3,
  "optimes" : {
    "lastCommittedOpTime" : {
      "ts" : Timestamp(1639662318, 1),
      "t" : NumberLong(3)
    },
    "lastCommittedWallTime" : ISODate("2021-12-16T13:45:18.626Z"),
    "readConcernMajorityOpTime" : {
      "ts" : Timestamp(1639662318, 1),
      "t" : NumberLong(3)
    },
    "readConcernMajorityWallTime" : ISODate("2021-12-16T13:45:18.626Z"),
    "appliedOpTime" : {
      "ts" : Timestamp(1639662318, 1),
      "t" : NumberLong(3)
    },
    "durableOpTime" : {
      "ts" : Timestamp(1639662318, 1),
      "t" : NumberLong(3)
    },
    "lastAppliedWallTime" : ISODate("2021-12-16T13:45:18.626Z"),
    "lastDurableWallTime" : ISODate("2021-12-16T13:45:18.626Z")
  },
  "lastStableRecoveryTimestamp" : Timestamp(1639662308, 1),
  "lastStableCheckpointTimestamp" : Timestamp(1639662308, 1),
  "electionCandidateMetrics" : {
    "lastElectionReason" : "priorityTakeover",
    "lastElectionDate" : ISODate("2021-12-14T15:24:57.309Z"),
    "electionTerm" : NumberLong(3),
    "lastCommittedOpTimeAtElection" : {
      "ts" : Timestamp(1639495485, 1),
      "t" : NumberLong(2)
    },
    "lastSeenOpTimeAtElection" : {
      "ts" : Timestamp(1639495485, 1),
      "t" : NumberLong(2)
    },
    "numVotesNeeded" : 3,
    "priorityAtElection" : 15,
    "electionTimeoutMillis" : NumberLong(10000),
    "priorPrimaryMemberId" : 3,
    "numCatchUpOps" : NumberLong(0),
    "newTermStartDate" : ISODate("2021-12-14T15:24:57.321Z"),
    "wMajorityWriteAvailabilityDate" : ISODate("2021-12-14T15:24:58.285Z")
  },
  "electionParticipantMetrics" : {
    "votedForCandidate" : true,
    "electionTerm" : NumberLong(2),
    "lastVoteDate" : ISODate("2021-12-14T10:36:13.063Z"),
    "electionCandidateMemberId" : 3,
    "voteReason" : "",
    "lastAppliedOpTimeAtElection" : {
      "ts" : Timestamp(1639478166, 1),
      "t" : NumberLong(1)
    },
    "maxAppliedOpTimeInSet" : {
      "ts" : Timestamp(1639478166, 1),
      "t" : NumberLong(1)
    },
    "priorityAtElection" : 1
  },
  "members" : [
    {
      "_id" : 0,
      "name" : "192.168.56.198:27017",
      "health" : 1,
      "state" : 1,
      "stateStr" : "PRIMARY",
      "uptime" : 186852,
      "optime" : {
        "ts" : Timestamp(1639662318, 1),
        "t" : NumberLong(3)
      },
      "optimeDate" : ISODate("2021-12-16T13:45:18Z"),
      "syncingTo" : "",
      "syncSourceHost" : "",
      "syncSourceId" : -1,
      "infoMessage" : "",
      "electionTime" : Timestamp(1639495497, 1),
      "electionDate" : ISODate("2021-12-14T15:24:57Z"),
      "configVersion" : 7,
      "self" : true,
      "lastHeartbeatMessage" : ""
    },
    {
      "_id" : 1,
      "name" : "192.168.56.199:27018",
      "health" : 1,
      "state" : 7,
      "stateStr" : "ARBITER",
      "uptime" : 186375,
      "lastHeartbeat" : ISODate("2021-12-16T13:45:27.183Z"),
      "lastHeartbeatRecv" : ISODate("2021-12-16T13:45:26.984Z"),
      "pingMs" : NumberLong(0),
      "lastHeartbeatMessage" : "",
      "syncingTo" : "",
      "syncSourceHost" : "",
      "syncSourceId" : -1,
      "infoMessage" : "",
      "configVersion" : 7
    },
    {
      "_id" : 2,
      "name" : "192.168.56.197:27017",
      "health" : 1,
      "state" : 2,
      "stateStr" : "SECONDARY",
      "uptime" : 185329,
      "optime" : {
        "ts" : Timestamp(1639662318, 1),
        "t" : NumberLong(3)
      },
      "optimeDurable" : {
        "ts" : Timestamp(1639662318, 1),
        "t" : NumberLong(3)
      },
      "optimeDate" : ISODate("2021-12-16T13:45:18Z"),
      "optimeDurableDate" : ISODate("2021-12-16T13:45:18Z"),
      "lastHeartbeat" : ISODate("2021-12-16T13:45:27.463Z"),
      "lastHeartbeatRecv" : ISODate("2021-12-16T13:45:26.387Z"),
      "pingMs" : NumberLong(1),
      "lastHeartbeatMessage" : "",
      "syncingTo" : "192.168.56.198:27017",
      "syncSourceHost" : "192.168.56.198:27017",
      "syncSourceId" : 0,
      "infoMessage" : "",
      "configVersion" : 7
    },
    {
      "_id" : 3,
      "name" : "192.168.56.199:27017",
      "health" : 1,
      "state" : 2,
      "stateStr" : "SECONDARY",
      "uptime" : 12079,
      "optime" : {
        "ts" : Timestamp(1639662318, 1),
        "t" : NumberLong(3)
      },
      "optimeDurable" : {
        "ts" : Timestamp(1639662318, 1),
        "t" : NumberLong(3)
      },
      "optimeDate" : ISODate("2021-12-16T13:45:18Z"),
      "optimeDurableDate" : ISODate("2021-12-16T13:45:18Z"),
      "lastHeartbeat" : ISODate("2021-12-16T13:45:28.253Z"),
      "lastHeartbeatRecv" : ISODate("2021-12-16T13:45:27.555Z"),
      "pingMs" : NumberLong(0),
      "lastHeartbeatMessage" : "",
      "syncingTo" : "192.168.56.198:27017",
      "syncSourceHost" : "192.168.56.198:27017",
      "syncSourceId" : 0,
      "infoMessage" : "",
      "configVersion" : 7
    }
  ],
  "ok" : 1,
  "$clusterTime" : {
    "clusterTime" : Timestamp(1639662318, 1),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  },
  "operationTime" : Timestamp(1639662318, 1)
}

1.2 切换主库

将主库切换至node3节点具体步骤为:

  • 查看当前配置
  • 调整node3节点的权重
  • 重新加载配置

因默认情况下,各节点的权重都为1,因此可以调整需要切换为主库的节点的权重为较大的值(建议超过节点数)

test12:PRIMARY> rs.config()
{
  "_id" : "test12",
  "version" : 9,
  "protocolVersion" : NumberLong(1),
  "writeConcernMajorityJournalDefault" : true,
  "members" : [
    {
      "_id" : 0,
      "host" : "192.168.56.198:27017",
      "arbiterOnly" : false,
      "buildIndexes" : true,
      "hidden" : false,
      "priority" : 1,
      "tags" : {

      },
      "slaveDelay" : NumberLong(0),
      "votes" : 1
    },
    {
      "_id" : 1,
      "host" : "192.168.56.199:27018",
      "arbiterOnly" : true,
      "buildIndexes" : true,
      "hidden" : false,
      "priority" : 0,
      "tags" : {

      },
      "slaveDelay" : NumberLong(0),
      "votes" : 1
    },
    {
      "_id" : 2,
      "host" : "192.168.56.197:27017",
      "arbiterOnly" : false,
      "buildIndexes" : true,
      "hidden" : false,
      "priority" : 1,
      "tags" : {

      },
      "slaveDelay" : NumberLong(0),
      "votes" : 1
    },
    {
      "_id" : 3,
      "host" : "192.168.56.199:27017",
      "arbiterOnly" : false,
      "buildIndexes" : true,
      "hidden" : false,
      "priority" : 1,
      "tags" : {

      },
      "slaveDelay" : NumberLong(0),
      "votes" : 1
    }
  ],
  "settings" : {
    "chainingAllowed" : true,
    "heartbeatIntervalMillis" : 2000,
    "heartbeatTimeoutSecs" : 10,
    "electionTimeoutMillis" : 10000,
    "catchUpTimeoutMillis" : -1,
    "catchUpTakeoverDelayMillis" : 30000,
    "getLastErrorModes" : {

    },
    "getLastErrorDefaults" : {
      "w" : 1,
      "wtimeout" : 0
    },
    "replicaSetId" : ObjectId("61b86af0a21015e69623e18d")
  }
}

将node3的节点的权重改为10

var cfg = rs.conf()
cfg.members[3].priority = 10

重新加载配置,选主

rs.reconfig(cfg)

通常1分钟内完成切换。

PS:也可以通过rs.stepDown()

PRIMARY> rs.stepDown()       //rs.stepDown(30)   单位:S

这个命令会让primary降级为Secondary节点,并维持60s,如果这段时间内没有新的primary被选举出来,这个节点可以要求重新进行选举

2. 剔除节点 剔除的节点为SECONDARY或ARBITER,可以执行通过rs.remove() 命令剔除对应节点,如为PRIMARY节点,则先进行主从切换,再剔除。

test12:PRIMARY> rs.remove("192.168.56.199:27018")
{
  "ok" : 1,
  "$clusterTime" : {
    "clusterTime" : Timestamp(1639683041, 1),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  },
  "operationTime" : Timestamp(1639683041, 1)
}