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