【Mongodb】 Replica set 的选举策略之一

首先介绍一下在replica set里分为三种节点类型:

1 primary   负责client的读写。

2 secondary 作为热备节点,应用Primary的oplog读取的操作日志,和primary保持一致,不提供读写操作!

  secondary有两种类型: 

  1)normal secondary   随时和Primay保持同步,  

  2)delayed secondary  延时指定时间和primary保持同步,防止误操作. 

3 arbiter.它不负责任何读写,只作为一个仲裁者,负责primary down的时候剩余节点的选举操作.

    在Replica Set 如果主库down了,要进行故障切换,集群的选举策略:

当primary当了之后,剩下的节点会选择一个primary节点,仲裁节点也会参与投票,避免僵局出现(如果没有仲裁节点,对于两节点的replica set 从节点down,主节点会变为secondary,导致整个replica set 不可用)选择依据为:优先级最高的且数据新鲜度最新的!

    primary 节点使用心跳来跟踪集群中有多少节点对其可见。如果达不到1/2,活跃节点会自动降级为secondary。这样就能够防止上面说的僵局状态或者当网络切割后primary已经与集群隔离的时候!

来自官方文档的例子:

初始状况:

server-a: secondary oplog: ()

server-b: secondary oplog: ()

server-c: secondary oplog: ()

主库写入数据

server-a: primary oplog: (a1,a2,a3,a4,a5)

server-b: secondary oplog: ()

server-c: secondary oplog: ()

secondary库应用数据

server-a: primary oplog: (a1,a2,a3,a4,a5)

server-b: secondary oplog: (a1)

server-c: secondary oplog: (a1,a2,a3)

主库server-adown

server-b: secondary oplog: (a1)

server-c: secondary oplog: (a1,a2,a3)

...

server-b: secondary oplog: (a1)

server-c: primary oplog: (a1,a2,a3) // c 具有最新的数据被选择为primary库

...

server-b: secondary oplog: (a1,a2,a3)

server-c: primary oplog: (a1,a2,a3,c4)

...

server-a 恢复或者起来

...

server-a: recovering oplog: (a1,a2,a3,a4,a5) --做数据恢复

server-b: secondary oplog: (a1,a2,a3)

server-c: primary oplog: (a1,a2,a3,c4)

…应用从server-c中的数据,此时 数据a4,a5丢失

server-a: recovering oplog: (a1,a2,a3,c4)

server-b: secondary oplog: (a1,a2,a3,c4)

server-c: primary oplog: (a1,a2,a3,c4)

新的主库server-c进行数据写入。

server-a: secondary oplog: (a1,a2,a3,c4)

server-b: secondary oplog: (a1,a2,a3,c4)

server-c: primary oplog: (a1,a2,a3,c4,c5,c6,c7,c8)

server-a: secondary oplog: (a1,a2,a3,c4,c5,c6,c7,c8)

server-b: secondary oplog: (a1,a2,a3,c4,c5,c6,c7,c8)

server-c: primary oplog: (a1,a2,a3,c4,c5,c6,c7,c8)

从上面的过程中可以看出server-c 变为主库,其他节点则应用从server-c的日志。数据a4,a5 丢失。

    当选出新的primary之后,此数据库的数据就会被假定为整个集群中的最新数据,对其他节点(原来的活跃节点)的操作都会回滚,即便之前的主库已经恢复工作了。为了完成回滚,所有节点连接新的主库后都要重新进行同步。此过程如下:

这些节点会查看自己的oplog日志,找到还没应用的主库操作,然后向主库请求这些操作影响的文档的最新副本,进行数据同步。

时间: 2016-04-14

【Mongodb】 Replica set 的选举策略之一的相关文章

【Mongodb】Replica Set 的选举策略之三

承接之前的文章继续介绍replica set 选举机制. 创建两节点的Replica Sets,一主一备secondary,如果Secondary宕机,Primary会变成Secondary!这时候集群里没有Primary了!为什么会出现这样的情况呢. [mongodb@rac4 bin]$ mongo 127.0.0.1:27018 init1node.js  MongoDB shell version: 2.0.1 connecting to: 127.0.0.1:27018/test [m

【Mongodb】 Replica set 的 选举策略之二

对于Replica Set中的选择策略: We use a consensus protocol to pick a primary. Exact details will be spared here but that basic process is: 1 get maxLocalOpOrdinal from each server. 2 if a majority of servers are not up (from this server's POV), remain in Secon

MongoDB Replica Set使用几点总结

本文会涉及到MongoDB副本集的初始化,读写性能,scala driver,简单运维等内容. 副本集初始化 在各个节点上replica set进程, nohup numactl --interleave=all ./mongod --dbpath /home/mongodb/data/ --logpath /home/mongodb/mongodb-linux-x86_64-2.4.7/run.log --port 8017 --rest --journal --replSet smartq

mongodb replica set 添加删除节点的2种方法_MongoDB

一,利用rs.reconfig,来添加,删除节点 1,添加节点 repmore:PRIMARY> config = {_id:"repmore",members:[{_id:0,host:'127.0.0.1:27017',priority :2},{_id:1,host:'127.0.0.1:27018',priority:1}]}; //添加节点 repmore:PRIMARY> rs.reconfig(config); //使配置生效 repmore:PRIMARY&

mongodb replica set 配置高性能多服务器详解_MongoDB

mongodb的多服务器配置,以前写过一篇文章,是master-slave模式的,请参考:详解mongodb 主从配置.master-slave模式,不能自动实现故障转移和恢复.所以推荐大家使用mongodb的replica set,来实现多服务器的高可用.给我的感觉是replica set好像自带了heartbeat功能,挺强大的. 一,三台服务器,1主,2从 服务器1:127.0.0.1:27017 服务器2:127.0.0.1:27018 服务器3:127.0.0.1:27019 1,创建

从MongoDB Replica Set HA 看分布式系统读写一致性问题

副本集基础 Replica Set是mongodb提供的一个去中心化的备份模式(同时mongodb还提供了主从部署和分片模式),每个mongod都可以是master,且副本集内会自动选举出一个primary,其他都暂时为seconary,primary挂掉后会自动选举出新的primary.副本集内所有mongod存储的都是数据全集,secondary节点会从primary同步数据操作以保证自己的数据up-to-date.副本集有自己的选举机制,相对是一种比较简单的选举,根据心跳.权重等因素选取一

mongodb replica set 添加/删除节点方法

  replica set多服务器主从,添加,删除节点,肯定会经常遇到的.下面详细说明一下,添加,删除节点的2种方法. 一,利用rs.reconfig,来添加,删除节点 1,添加节点  代码如下   repmore:PRIMARY> config = {_id:"repmore",members:[{_id:0,host:'127.0.0.1:27017',priority :2},{_id:1,host:'127.0.0.1:27018',priority:1}]};   //

mongoDB replica set configuration

startup mongodb with --replSet command optionexample : 1. startup one node:mongod --replSet $setname[/$rmt_ip:$port]2. startup another node :mongod --replSet $setname[/$rmt_ip:$port]3. run ininiate command within one of the nodes only : db.runCommand

mongodb数据库replica set shard 分片 高可用 集群

一,mongodb分片,常用的二种架构 1,每一个客户端系统上包含一个路由器mongos, 服务器的数量从十几台增长到几百台,mongos路由和mongod分片服务器之间建立了几百.有时候甚至是几千个连接,负载非常重.这意味着每当chunk平衡(MongoDB分片集群为了保持数据均匀分布所必须使用的平衡措施)发生的时候传送存储在配置数据库中的chunk位置信息都需要花费相当长的时间.这是因为每一个mongos路由都必须清楚地知道每一个chunk都存在于集群中的哪些位置. 2,路由器独立 路由独立