MongoDB副本集群(Replica Set)搭建

 提示:转载请注明原文链接

 本文永久链接:https://360us.net/article/76.html

副本集群是一组维护相同数据集的mongod实例。一个副本集包含几个承载数据的节点和一个可选的仲裁节点。在承载数据的节点中,只有一个节点被认为是主节点,其他节点被认为是次节点。

主节点接收所有的写操作,次节点接收主节点的操作应用在自己的数据集上,副本节点只是做一个备份的作用,当主节点出现故障时,会自动选出新的主节点。

结构图

故障转移

本教程描述的是包含三个节点的副本集群搭建,所有节点都没有开启访问控制。

因为集群需要通过选举来确定master节点,为了选举不会出现问题,所以集群成员数量应该总是奇数个。

MongoDb版本是5.0

1、启动成员节点

测试在一台机器上,三个节点在不同机器上可以都用27017端口

三个节点:

  • 192.168.10.1:27017
  • 192.168.10.2:27018
  • 192.168.10.3:27019

两种方式启动:

1、mongod --replSet "rs0" --port=27017:启动节点的时候协商replSet参数,三个节点需要一样,指定集群名字

2、通过配置文件配置

replication:
   replSetName: "rs0"

启动的时候指定配置文件:mongod --config <path-to-config>

2、用mongosh连接一台节点主机

比如登录端口是27017的主机,输入mongosh,默认连接运行在本地端口27017的MongoDB。

也可以用参数 --port 连接指定端口的MongoDB。

3、初始化集群

在上一步连接的终端执行如下初始化命令:

rs.initiate( {
   _id : "rs0",
   members: [
      { _id: 0, host: "192.168.10.1:27017" },
      { _id: 1, host: "192.168.10.1:27018" },
      { _id: 2, host: "192.168.10.1:27019" }
   ]
})

4、查看验证状态

rs.conf() //现实集群配置

rs.status() //失败验证主节点,确保有主节点

5、其他集群命令

1、rs.add(host, arbiterOnly)

添加新节点,必须在主节点执行。

arbiterOnly:bool,仅当host值是字符串时应用。如果为true,则添加的主机为仲裁主机。

示例:

rs.add( { host: "mongodbd4.example.net:27017" } )

rs.add( "mongodbd4.example.net:27017" )

2、rs.remove(hostname)

从当前集群中移除成员。该函数将短暂地断开shell的连接,并在集群重新协商哪个成员将为主成员时强制重新连接。因此,即使该命令成功,shell也将显示一个错误。

rs.remove("mongodbd4.example.net:27017")

3、rs.reconfig( configuration, { options } )

重新配置现有的集群,覆盖现有的集群配置。要运行该方法,必须连接到集群的主服务器。

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

假如执行rs.reconfig()获取的内容如下:

{
   "_id" : "rs0",
   "version" : 1,
   "protocolVersion" : NumberLong(1),
   "members" : [
      {
         "_id" : 0,
         "host" : "mongodb0.example.net:27017",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {
         },
         "secondaryDelaySecs" : NumberLong(0),
         "votes" : 1
      },
      {
         "_id" : 1,
         "host" : "mongodb1.example.net:27017",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {
         },
         "secondaryDelaySecs" : NumberLong(0),
         "votes" : 1
      },
      {
         "_id" : 2,
         "host" : "mongodb2.example.net:27017",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {
         },
         "secondaryDelaySecs" : 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;
cfg.settings.heartbeatTimeoutSecs = 15;
rs.reconfig(cfg);

4、rs.printSecondaryReplicationInfo()

次节点角度打印集群状态信息

$ > rs.printSecondaryReplicationInfo()
source: m1.example.net:27002
    syncedTo: Mon Mar 01 2021 16:30:50 GMT-0800 (PST)
    0 secs (0 hrs) behind the primary
source: m2.example.net:27003
    syncedTo: Mon Mar 01 2021 16:30:50 GMT-0800 (PST)
    0 secs (0 hrs) behind the primary

5、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)

6、rs.help()

打印集群相关的shell函数。

 评论
暂无评论