MongoDB 维护Replica Set

在每个MongoDB(版本 3.2.9) Instance中,都有一个本地数据库(local),用于存储 Replication 进程的信息和本地数据。local 数据库的特性是:位于local数据库中的数据和集合不会被 Replication 进程复制到其他MongoDB instance上。如果实例上有些collection 和 data不计划被复制到其他MongoDB Instance,可以将这些collection 和 data 存储在local 数据库中。

MongoDB shell提供一个全局变量rs,是数据库命令的包装器(wrapper),用于维护Replica Set。

一,Replica Set的配置

1,查看Replica Set的配置信息

MongoDB 将Replica Set的配置信息存储在local.system.replset 集合中,在同一个Replica Set中所有成员local.system.replset是相同的,不能直接修改该集合,必须通过rs.initiate()来初始化,通过 rs.reconfig()来重新配置,对Replica Set 增加或删除成员都会相应的修改Replica Set的配置信息。

rs.config()

use local
db.system.replset.find()

配置信息重要信息主要有两部分:Replica Set的 id 值 和 member 数组。

{
_id: "replica set name",
members: [
    {
      _id: <int>,
      host: "host:port",
      arbiterOnly: <boolean>,
      buildIndexes: <boolean>,
      hidden: <boolean>,
      priority: <number>,
      slaveDelay: <int>,
      votes: <number>
    },
    ...
  ],
...
}

成员的配置文档:

priority:表示一个成员被选举为Primary节点的优先级,默认值是1,取值范围是从0到100,将priority设置为0有特殊含义:Priority为0的成员永远不能成为Primary 节点。Replica Set中,Priority最高的成员,会优先被选举为Primary 节点,只要其满足条件。

hidden:将成员配置为隐藏成员,要求Priority 为0。Client不会向隐藏成员发送请求,因此隐藏成员不会收到Client的Request。

slaveDelay:单位是秒,将Secondary 成员配置为延迟备份节点,要求Priority 为0,表示该成员比Primary 成员滞后指定的时间,才能将Primary上进行的写操作同步到本地。为了数据读取的一致性,应将延迟备份节点的hidden设置为true,避免用户读取到明显滞后的数据。Delayed members maintain a copy of the data that reflects the state of the data at some time in the past.

votes:有效值是0或1,默认值是1,如果votes是1,表示该成员(voting member)有权限选举Primary 成员。在一个Replica Set中,最多有7个成员,其votes 属性的值是1。

arbiterOnly:表示该成员是仲裁者,arbiter的唯一作用是就是参与选举,其votes属性是1,arbiter不保存数据,也不会为client提供服务。

buildIndexes:表示实在在成员上创建Index,该属性不能修改,只能在增加成员时设置该属性。如果一个成员仅仅作为备份,不接收Client的请求,将该成员设置为不创建index,能够提高数据同步的效率。

2,重新配置Replica Set

对Replica Set重新配置,必须连接到Primary 节点;如果Replica Set中没有一个节点被选举为Primary,那么,可以使用force option(rs.reconfig(config,{force:true})),在Secondary 节点上强制对Replica Set进行重新配置。

The force parameter allows a reconfiguration command to be issued to a non-primary node. If set as { force: true }, this forces the replica set to accept the new configuration even if a majority of the members are not accessible. Use with caution, as this can lead to rollback situations.

示例,在primary 节点中,重新配置成员的优先级属性(priority)。

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

3,增加成员

3.1,该使用默认的配置增加成员

--增加一个成员,用于存储数据rs.add("host:port")

--增加一个arbiter,用于选举
rs.add("host:port",true)

3.2,使用配置文档增加成员

示例,为Replica Set增加一个延迟备份的隐藏节点,滞后Primary节点1hour,该节点不参与投票,也不创建index,仅仅作为数据备份。

rs.add( { _id:4, host: "host:port", priority: 0, hidden:true, slaveDelay:3600, votes:0, buildIndexes:true, arbiterOnly:false } )

4,删除成员

rs.remove("host")

5,对replica set重新配置,能够增加成员,删除成员,并能同时修改成员的属性

二,对Replica Set的成员进行操作

1,冻结当前成员,使当前成员在指定的时间内没有资格成为Primary,即当前成员在一定时间内保持Secondary身份

Makes the current replica set member ineligible to become primary for the period specified.

rs.freeze(seconds)

2,强制 Primary 节点退化为Secondary节点

rs.stepDown()使当前Primary节点退化为Secondary 节点,并激发选举Primary的事件。该函数使当前的Primary 节点在指定的时间内,不能成为Primary节点。在一定的时间内,如果有 Secondary 节点满足条件,那么该Secondary节点被选举为Primary 节点;如果没有 Secondary 节点满足条件,那么原Primary节点参与选举。stepDown函数,使Primary节点退化为Secondary,并在一段时间内不能参与选举。

Forces the primary of the replica set to become a secondary, triggering an election for primary. The method steps down the primary for a specified number of seconds; during this period, the stepdown member is ineligible from becoming primary.

rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)

3,强制当前成员从指定成员同步数据

rs.syncFrom("host:port");

4,使当前的Secondary 节点能够读取数据

默认情况下,Secondary 节点是不能读取数据的

rs.slaveOk()

三,查看Replica Set的状态

set字段:Replica Set的name

stateStr:成员状态的描述信息

name:该成员的host 和 端口

syncTo:该成员从哪个成员同步数据,可以使用rs.syncFrom()强制同步的Path,从指定的 Target 成员同步数据。

{
    "set" : "rs0",
    "myState" : 1,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "cia-sh-05:40004",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 240973,
            "optime" : {
                "ts" : Timestamp(1473336939, 1),
                "t" : NumberLong(5)
            },
            "optimeDate" : ISODate("2016-09-08T12:15:39.000Z"),
            "lastHeartbeat" : ISODate("2016-09-10T04:39:55.041Z"),
            "lastHeartbeatRecv" : ISODate("2016-09-10T04:39:56.356Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "cia-sh-06:40001"
        }, .....
    ]
}

三,Replica Set的操作日志

MongoDB的Replication实际上是基于操作日志(operation log)的复制。Replication进程的整个过程是:Replication 将Primary节点中执行的写操作记录到oplog集合中,Secondary成员读取Primary 成员的oplog集合,重做(redo)oplog中记录的写操作,最终,Replica Set中的各个成员达到数据的一致性。

oplog集合中记录的操作是基于单个doc的,也就是说,如果一条命令只影响一个doc,那么Replication向oplog集合中插入一个操作命令;如果一个命令影响多个doc,那么Replication将该命令拆分成多个等效的操作命令,每个操作命令只会影响一个doc,最终向oplog集合中插入的是多个操作命令。

1,oplog 集合

oplog集合是一个特殊的固定集合,存储的是Primary节点的操作日志,每个Replica Set的成员都一个oplog的副本:local.oplog.rs,该集合存储在每个成员的local数据库中。Replica Set中的每个成员都有一个oplog集合,用于存储当前节点的操作记录,其他成员能够从任何一个成员的oplog中同步数据。

The oplog (operations log) is a special capped collection that keeps a rolling record of all operations that modify the data stored in your databases. MongoDB applies database operations on the primary and then records the operations on the primary’s oplog. The secondary members then copy and apply these operations in an asynchronous process. All replica set members contain a copy of the oplog, in the local.oplog.rs collection, which allows them to maintain the current state of the database.

2,oplog的大小

oplog集合是一个固定集合,其大小是固定的,在第一次开始Replica Set的成员时,MongoDB创建默认大小的oplog。在MongoDB 3.2.9 版本中,MongoDB 默认的存储引擎是WiredTiger,一般情况下,oplog的默认大小是数据文件所在disk 空闲空间(disk free space)的5%,最小不会低于990 MB,最大不会超过50 GB。

3,修改oplog的大小

修改的过程主要分为三步:

  • 以单机模式重启mongod
  • 启动之后,重新创建oplog,并保留最后一个记录作为种子
  • 以复制集方式重启mongod

详细过程是:

step1:以单机模式重启mongod

对于Primary成员,首先调用stepDown函数,强制Primary成员转变为Secondary成员

rs.stepDown()

对于secondary成员,调用shutdownServer()函数,关闭mongod

use admin
db.shutdownServer()

启动mongod实例,不要使用replset参数

mongod --port 37017 --dbpath /srv/mongodb

step2:创建新的oplog

有备无患,备份oplog文件

mongodump --db local --collection ‘oplog.rs‘ --port 37017

将oplog中最后一条有效记录保存到temp 集合中,作为新oplog的seed

use local

db.temp.drop()
db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )

db.oplog.rs.drop()

重建新的oplog集合,并将temp集合中一条记录保存到oplog中,size的单位是Byte

db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )
db.oplog.rs.save( db.temp.findOne() )

step3:以复制集模式启动 mongod,replset参数必须制定正确的Replica Set的名字

db.shutdownServer()
mongod --replSet rs0 --dbpath /srv/mongodb

三,查看mongod 的开机日志

在local.startup_log 集合中,存储mongod 每次启动时的开机日志

参考文档:

The local Database

Replica Set Configuration

Replica Set Oplog

Change the Size of the Oplog

时间: 2024-10-01 05:07:10

MongoDB 维护Replica Set的相关文章

【Mongodb】如何创建mongodb的replica set

Replica sets 在主从复制上做的扩展,增加了故障自动切换和自动修复成员节点.下面从技术上介绍如何搭建mongodb的replica set (个人觉得,搭建mongodb本身没有多少干货,重要是如何灾难规划) 1 建立复制集群节点的数据存放目录 mkdir -p /opt/mongodata/r1 mkdir -p /opt/mongodata/r2 mkdir -p /opt/mongodata/r3 2 在三个窗口分别执行如下命令: ./mongod --dbpath /opt/m

[MongoDB] 安装MongoDB配置Replica Set

url:http://blog.csdn.net/hf81970/article/details/19643639 MongoDB的环境主要包括StandAlone,Replication和Sharding. StandAlone:单机环境,一般开发测试的时候用. Replication:主从结构,一个Primary,多个Secondary,可能会有Arbitry. Primary挂掉之后,会选举出一个Secondary作为Primary,与zookeeper类似. Arbitry上面不存数据,

【Mongodb】 Replica set的自动故障切换

Replica set 为我们提供了自动故障切换功能,这个机制是由mongodb自己来操作的,它根据从库的优先级或者数据新鲜度(也就是最新的从主库同步数据的那个节点)来选择primary,而当以前的primary起来之后,会成为secondary ,接受新的primary 的日志. 完整的replica sets primary 当机  mongodb 会根据数据的新鲜度来选择下一个主库 接上一篇文章,搭建好了replica set,查看端口为 27018 27020两个服务的状态: [[ema

mongodb维护常用命令

一,用户操作:1. #进入数据库adminuse admin2. #增加或修改用户密码db.addUser('name','pwd')3. #查看用户列表db.system.users.find()4. #用户认证db.auth('name','pwd')5. #删除用户db.removeUser('name')6. #查看所有用户show users7. #查看所有数据库show dbs8. #查看所有的collectionshow collections9. #查看各collection的状

学习MongoDB(二) Replica Set集群配置

1.官方网址:https://docs.mongodb.org/manual/tutorial/deploy-replica-set-for-testing/ 2.Replica Set介绍: https://docs.mongodb.org/manual/core/replica-set-members/ 3.简单叙述一下什么是Replica Set: 如果我们使用单一的Mongodb数据库,那么它会存在单点故障等问题,Mongodb允许我们将多个单一的Mongodb数据库组成一个(“集群Re

Mongodb设置Replica Set集群 并使用PHP来连接

Mongodb之前一直是做主从模式,后来官方推荐用Replica Set(简称RS)来代替主从,主要是当primary节点出现故障后,RS集群内会有自动投票选举primary节点的机制,自动选出新的primary节点,这样应用程序就不需要关心主从切换的问题.想要配置一个简单的RS,至少要两台机器.我本地用了VMware以NAT方式跑了两台VPS,IP分别是:192.168.33.112和192.168.33.119,注意两台VPS的访问互通问题(iptables network等) 1.ssh登

MongoDB搭建Replica Set Shard Cluster步骤

本文记录从头搭建一个MongoDB 副本集分片集群的过程. 我们要创建一个这样子的分布式集群:有两个shard,每个shard都是一个replica set,各有两个副本(实际产品应用中还应加上一个aribiter):有三个config server:有一个mongos.步骤如下: 1.replica set replica set Amkdir -p ./replset_shard1/node1mkdir -p ./replset_shard1/node2numactl --interleav

Mongodb的Replica Set 副本集集群搭建

实验性的搭建一个集群做练手. 配置和环境: win10(本机)和linux(CentOs7)内网服务器各一台. Mongodb3.07 目标:Replica set 副本集结构,一个primary一个slave,实现读写分离的同步数据集群. 一.本机和内网服务器安装mongo 可参考我的另外两篇文章: Mongodb在windows和linux平台的安装配置(http://fykknd.blog.51cto.com/3175618/1716343) Mongodb权限管理(http://fykk

MongoDB -(2) replica sets

副本集搭建 ---何旭东(某上市公司运维工程师) 目录 副本集搭建... 1 参数介绍:... 1 开战... 3 基本操作... 3 逻辑图... 4 配置文件... 4 节点说明... 4 状态说明... 5 插入配置数据... 5 复制集初始化... 6 查看状态... 6 查看当前主库... 7 优化... 8 调整从库可读... 8 2015年7月16日 到此就配置好了二个replica sets! 发现问题思路:把基础环境一个一个总计一个一个梳理,确认每个节点的对应关系.即可! 在这