MongoDB --- 复制集方法

此次介绍的方法 都是运行在mongo shell 上的。

1、rs.add()

https://docs.mongodb.com/manual/reference/method/rs.add/#mongodb-method-rs.add

添加成员,mongo shell(客户端)必须连接到 主节点primary 才能运行此方法

rs.add(host, arbiterOnly)

Parameter Type Description
host string or document 新成员。如果是字符串:主机名:端口号。如果文档:则和复制集配置文档中的成员配置一样
arbiterOnly boolean 可选,只有 host 是字符串才生效。如果 true ,则新成员是仲裁者

host 文档 字段

 {
   _id: <int>,
   host: <string>,        // required
   arbiterOnly: <boolean>,
   buildIndexes: <boolean>,
   hidden: <boolean>,
   priority: <number>,
   tags: <document>,
   slaveDelay: <int>,
   votes: <number>
}

默认 mongod 和 mongos 讲 ip 绑定 到本机。所以只接受本机客户端的连接,而不接受远程客户端的连接。
可以 在 mongod 配置文件中 配置 net.bindIp
也可以直接在启动mongod 时 在命令行中 设置

#绑定本机 和 My-Example-Associated-Hostname
mongod --bind_ip localhost,My-Example-Associated-Hostname

添加新成员时,新成员的优先级priority比现主节点高,会触发主节点选举,并且断开shell连接,还会返回一个错误。

新成员如果 priority 和 votes 都大于 0 ,那么在其刚刚加入副本集时,可以作为一投票成员,但不能成为一个 primary ,也不能对外提供读取服务,因为 数据还未同步。
这可能会导致,投票的大多数成员都在线,但不能确定 primary 。为避免这种情况,新添加的成员设置 priority :0 , votes :0。等该成员的状态state,变为 SECONDARY,再使用 rs.reconfig() 更新 priority 和 votes.

## 向新的复制集添加成员,默认priority: 1, votes: 1
rs.add( { host: "mongodbd4.example.net:27017" } )
#或者
rs.add( "mongodbd4.example.net:27017" )



## 向已存在的复制集添加成员

#添加 priority 和 votes 都为 0
rs.add( { host: "mongodbd4.example.net:27017", priority: 0, votes: 0 } )

# 查看状态,确保新成员已经是 SECONDARY 状态
rs.status()

# 在重新配置
var cfg = rs.conf();
cfg.members[n].priority = 1;  // Substitute the correct array index for the new member
cfg.members[n].votes = 1;     // Substitute the correct array index for the new member
rs.reconfig(cfg)

2. rs.addArb()

https://docs.mongodb.com/manual/reference/method/rs.addArb/

向已存在的复制集中添加 仲裁者 节点

rs.addArb(host)

host : 字符串,新成员的主机名:端口号

3 rs.conf() rs.config()

https://docs.mongodb.com/manual/reference/method/rs.conf/

返回当前复制集 的配置 对象

rs.conf() 无参数

rs.config() 是 rs.conf() 的别名

//返回对象
{
  _id: <string>,   // 复制集的名字。和 mongod 配置文件中的 replication.replSetName 相同。同一个复制集成员的 复制集名字都相同。
  version: <int>,  // 版本, 会递增
  term: <int>,  // 和 version 一起,区分配置迭代,会递增
  protocolVersion: <number>,  // 协议版本,默认为 1
  writeConcernMajorityJournalDefault: <boolean>,  // 复制集写关注默认行为。默认值true, { w: "majority" } ,在大多数有投票权的成员已经应用了写操作并写入磁盘日志后,确认。false:大多数有投票权的成员应用了写操作后就返回确认。
  configsvr: <boolean>,  // 指示该复制集是否用于分片集群的配置服务器。如果复制集是为一个分片集群的配置服务器设置为true。默认false
  members: [  // 成员数组,索引以 0 开始
    {
      _id: <int>,  // 成员表示符,取值必须在0到255之间(包括255),复制集成员之间值唯一,一经设置不可更改。
      host: <string>,  // 成员主机名(可含端口),必须是可解析的。不建议 设置成 localhost
      arbiterOnly: <boolean>,  // 仲裁者标识符,默认 false
      buildIndexes: <boolean>, // 该成员是都建立索引,默认true。只有在新添加成员时可以设置该字段,添加完成后不能再重置了。如果要对外查询服务,就不能设置成 false。
      hidden: <boolean>,   // 该成员是否隐藏,默认false。
      priority: <number>,  // 优先级,选举主节点的权重,值越高,越容易被选上作为primary。对于仲裁者 是0 或 1,其他成员 是 0-1000之间的整数。仲裁者默认是0,其他是 1。如果值大于0,votes 就不能为0
      tags: <document>,  // 标签,将该成员打上标签,用于读写操作,自定义
      slaveDelay: <int>,   //  从节点延迟秒数,默认0。用来设置延迟节点
      votes: <number>    // 表示该成员在主节点选举时的投票数,默认为1。如果priority值大于0,votes 就不能为0。复制集中最多有7个成员的votes 可以为1。
    },
    ...
  ],
  settings: {
    chainingAllowed : <boolean>,
    heartbeatIntervalMillis : <int>,
    heartbeatTimeoutSecs: <int>,
    electionTimeoutMillis : <int>,
    catchUpTimeoutMillis : <int>,
    getLastErrorModes : <document>,
    getLastErrorDefaults : <document>,
    replicaSetId: <ObjectId>
  }
}


复制集配置文档详情:https://docs.mongodb.com/manual/reference/replica-configuration/

4 rs.freeze()

https://docs.mongodb.com/manual/reference/method/rs.freeze/

使当前复制集成员 在一段时间内,不能成员 primary

rs.freeze(seconds)

5 rs.help()

返回 复制集相关方法的帮助文本

6 rs.initiate()

https://docs.mongodb.com/manual/reference/method/rs.initiate/

初始化 复制集

rs.initiate(configuration)

初始化只能在一个mongod实例上运行。

参数

Parameter Type Description
configuration document 可选,复制集配置文档选项
rs.initiate(
   {
      _id: "myReplSet",
      version: 1,
      members: [
         { _id: 0, host : "mongodb0.example.net:27017" },
         { _id: 1, host : "mongodb1.example.net:27017" },
         { _id: 2, host : "mongodb2.example.net:27017" }
      ]
   }
)

7. rs.reconfig()

https://docs.mongodb.com/manual/reference/method/rs.reconfig/#mongodb-method-rs.reconfig

重新配置现有复制集,覆盖现有复制集配置。要运行该方法,必须连接到复制集的主节点。

rs.reconfig( configuration, { options } )

rs.reconfig(
  <configuration>,    // 配置项
  {
    "force" : <boolean>,  // 可选,指定true强制可用的复制集成员接受新配置。默认值为false
    "maxTimeMS" : <int>   //可选, 指定处理rs.reconfig()操作的累积时间限制(以毫秒为单位)。缺省情况下,rs.reconfig()无限期地等待复制配置传播到大多数复制集成员。
  }
)

要重新配置现有的复制集,首先使用rs.conf()得到当前配置,根据需要修改配置文档,然后将修改后的文档传递给rs.reconfig()。

从MongoDB 4.4开始,rs.reconfig()默认允许一次添加或删除不超过1个投票成员。修改一个成员的 votes属性也会是投票成员的增减

原来的配置

{
   "_id" : "rs0",
   "version" : 1,
   "protocolVersion" : NumberLong(1),
   "members" : [
      {
         "_id" : 0,
         "host" : "mongodb0.example.net:27017",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {

         },
         "slaveDelay" : NumberLong(0),
         "votes" : 1
      },
      {
         "_id" : 1,
         "host" : "mongodb1.example.net:27017",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {

         },
         "slaveDelay" : NumberLong(0),
         "votes" : 1
      },
      {
         "_id" : 2,
         "host" : "mongodb2.example.net: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" : 2000,
      "getLastErrorModes" : {

      },
      "getLastErrorDefaults" : {
         "w" : 1,
         "wtimeout" : 0
      },
      "replicaSetId" : ObjectId("58858acc1f5609ed986b641b")
   }
}


重新配置

cfg = rs.conf();
cfg.members[1].priority = 2;
rs.reconfig(cfg);

重新配置后

{
   "_id" : "rs0",
   "version" : 2,
   "protocolVersion" : NumberLong(1),
   "members" : [
      {
         "_id" : 0,
         "host" : "mongodb0.example.net:27017",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {

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

         },
         "slaveDelay" : NumberLong(0),
         "votes" : 1
      },
      {
         "_id" : 2,
         "host" : "mongodb2.example.net: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" : 2000,
      "getLastErrorModes" : {

      },
      "getLastErrorDefaults" : {
         "w" : 1,
         "wtimeout" : 0
      },
      "replicaSetId" : ObjectId("58858acc1f5609ed986b641b")
   }
}

8、rs.remove()

https://docs.mongodb.com/manual/reference/method/rs.remove/

移除一个成员,通过主机名移除

rs.remove(hostname)

9、rs.secondaryOk()

https://docs.mongodb.com/manual/reference/method/rs.secondaryOk/

允许读取MongoDB连接的从成员
意味着当前应用程序最终可以接受一致的读操作

rs.secondaryOk()

10. rs.status()

https://docs.mongodb.com/manual/reference/method/rs.status/

返回一个包含关于复制集状态信息的文档
该方法是对 replSetGetStatus 命令的包装

db.adminCommand( { replSetGetStatus : 1 } )
// 或
rs.status()


// 结果
{
   "set" : "replset",
   "date" : ISODate("2020-03-05T05:24:45.567Z"),
   "myState" : 1,
   "term" : NumberLong(3),
   "syncSourceHost" : "",
   "syncSourceId" : -1,
   "heartbeatIntervalMillis" : NumberLong(2000),
   "majorityVoteCount" : 2,
   "writeMajorityCount" : 2,
   "votingMembersCount" : 3,            // Available starting in v4.4
   "writableVotingMembersCount" : 3,    // Available starting in v4.4
   "optimes" : {
      "lastCommittedOpTime" : {
         "ts" : Timestamp(1583385878, 1),
         "t" : NumberLong(3)
      },
      "lastCommittedWallTime" : ISODate("2020-03-05T05:24:38.122Z"),
      "readConcernMajorityOpTime" : {
         "ts" : Timestamp(1583385878, 1),
         "t" : NumberLong(3)
      },
      "readConcernMajorityWallTime" : ISODate("2020-03-05T05:24:38.122Z"),
      "appliedOpTime" : {
         "ts" : Timestamp(1583385878, 1),
         "t" : NumberLong(3)
      },
      "durableOpTime" : {
         "ts" : Timestamp(1583385878, 1),
         "t" : NumberLong(3)
      },
      "lastAppliedWallTime" : ISODate("2020-03-05T05:24:38.122Z"),
      "lastDurableWallTime" : ISODate("2020-03-05T05:24:38.122Z")
   },
   "lastStableRecoveryTimestamp" : Timestamp(1583385868, 2),
   "electionCandidateMetrics" : {
      "lastElectionReason" : "stepUpRequestSkipDryRun",
      "lastElectionDate" : ISODate("2020-03-05T05:24:28.061Z"),
      "electionTerm" : NumberLong(3),
      "lastCommittedOpTimeAtElection" : {
         "ts" : Timestamp(1583385864, 1),
         "t" : NumberLong(2)
      },
      "lastSeenOpTimeAtElection" : {
         "ts" : Timestamp(1583385864, 1),
         "t" : NumberLong(2)
      },
      "numVotesNeeded" : 2,
      "priorityAtElection" : 1,
      "electionTimeoutMillis" : NumberLong(10000),
      "priorPrimaryMemberId" : 1,
      "numCatchUpOps" : NumberLong(0),
      "newTermStartDate" : ISODate("2020-03-05T05:24:28.118Z"),
      "wMajorityWriteAvailabilityDate" : ISODate("2020-03-05T05:24:28.228Z")
   },
   "electionParticipantMetrics" : {
      "votedForCandidate" : true,
      "electionTerm" : NumberLong(2),
      "lastVoteDate" : ISODate("2020-03-05T05:22:33.306Z"),
      "electionCandidateMemberId" : 1,
      "voteReason" : "",
      "lastAppliedOpTimeAtElection" : {
         "ts" : Timestamp(1583385748, 1),
         "t" : NumberLong(1)
      },
      "maxAppliedOpTimeInSet" : {
         "ts" : Timestamp(1583385748, 1),
         "t" : NumberLong(1)
      },
      "priorityAtElection" : 1
   },
   "members" : [
      {
         "_id" : 0,
         "name" : "m1.example.net:27017",
         "health" : 1,
         "state" : 1,
         "stateStr" : "PRIMARY",
         "uptime" : 269,
         "optime" : {
            "ts" : Timestamp(1583385878, 1),
            "t" : NumberLong(3)
         },
         "optimeDate" : ISODate("2020-03-05T05:24:38Z"),
         "syncSourceHost" : "",
         "syncSourceId" : -1,
         "infoMessage" : "",
         "electionTime" : Timestamp(1583385868, 1),
         "electionDate" : ISODate("2020-03-05T05:24:28Z"),
         "configVersion" : 1,
         "configTerm" : 0,
         "self" : true,
         "lastHeartbeatMessage" : ""
      },
      {
         "_id" : 1,
         "name" : "m2.example.net:27017",
         "health" : 1,
         "state" : 2,
         "stateStr" : "SECONDARY",
         "uptime" : 266,
         "optime" : {
            "ts" : Timestamp(1583385878, 1),
            "t" : NumberLong(3)
         },
         "optimeDurable" : {
            "ts" : Timestamp(1583385878, 1),
            "t" : NumberLong(3)
         },
         "optimeDate" : ISODate("2020-03-05T05:24:38Z"),
         "optimeDurableDate" : ISODate("2020-03-05T05:24:38Z"),
         "lastHeartbeat" : ISODate("2020-03-05T05:24:44.114Z"),
         "lastHeartbeatRecv" : ISODate("2020-03-05T05:24:43.999Z"),
         "pingMs" : NumberLong(0),
         "lastHeartbeatMessage" : "",
         "syncSourceHost" : "m3.example.net:27017",
         "syncSourceId" : 2,
         "infoMessage" : "",
         "configVersion" : 1
      },
      {
         "_id" : 2,
         "name" : "m3.example.net:27017",
         "health" : 1,
         "state" : 2,
         "stateStr" : "SECONDARY",
         "uptime" : 266,
         "optime" : {
            "ts" : Timestamp(1583385878, 1),
            "t" : NumberLong(3)
         },
         "optimeDurable" : {
            "ts" : Timestamp(1583385878, 1),
            "t" : NumberLong(3)
         },
         "optimeDate" : ISODate("2020-03-05T05:24:38Z"),
         "optimeDurableDate" : ISODate("2020-03-05T05:24:38Z"),
         "lastHeartbeat" : ISODate("2020-03-05T05:24:44.114Z"),
         "lastHeartbeatRecv" : ISODate("2020-03-05T05:24:43.998Z"),
         "pingMs" : NumberLong(0),
         "lastHeartbeatMessage" : "",
         "syncSourceHost" : "m1.example.net:27017",
         "syncSourceId" : 0,
         "infoMessage" : "",
         "configVersion" : 1
      }
   ],
   "ok" : 1,
   "$clusterTime" : {
      "clusterTime" : Timestamp(1583385878, 1),
      "signature" : {
         "hash" : BinData(0,"9C2qcGVkipEGJW3iF90qxb/gIwc="),
         "keyId" : NumberLong("6800589497806356482")
      }
   },
   "operationTime" : Timestamp(1583385878, 1)
}

11 rs.stepDown()

https://docs.mongodb.com/manual/reference/method/rs.stepDown/

使当前的primary成为secondary,从而迫使选举。

rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)

Parameter Type Description
stepDownSecs number 退出主节点的秒数,在此期间,退出成员不能成为主节点。如果指定了非数字值,则使用60秒。
secondaryCatchUpPeriodSecs number 可选的。mongod等待一个可选举的从节点选举赶上主节点的秒数。未指定,则默认 10s

12 rs.syncFrom()

https://docs.mongodb.com/manual/reference/method/rs.syncFrom/#mongodb-method-rs.syncFrom

临时,设置此复制集成员同步的目标成员,覆盖默认同步目标选择逻辑。

rs.syncFrom([hostname]:[port])

rs.syncFrom("myHost:27017");

7. rs.printReplicationInfo()

https://docs.mongodb.com/manual/reference/method/rs.printReplicationInfo/

从主服务器的角度打印副本集状态的格式化报告。

rs.printReplicationInfo()

返回文本

configured oplog size:   192MB
log length start to end: 65422secs (18.17hrs)
oplog first event time:  Mon Jun 23 2014 17:47:18 GMT-0400 (EDT)
oplog last event time:   Tue Jun 24 2014 11:57:40 GMT-0400 (EDT)
now:                     Thu Jun 26 2014 14:24:39 GMT-0400 (EDT)

https://docs.mongodb.com/manual/reference/replication/

posted @ 2021-04-27 18:29  zhanglw  阅读(407)  评论(0)    收藏  举报