【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

[mongodb@rac4 bin]$ ./mongo 127.0.0.1:27019

MongoDB shell version: 2.0.1

connecting to: 127.0.0.1:27019/test

RECOVERING> 

SECONDARY> 

SECONDARY> use admin

switched to db admin

SECONDARY> db.shutdownServer() 

Sun Nov  6 20:16:11 DBClientCursor::init call() failed

Sun Nov  6 20:16:11 query failed : admin.$cmd { shutdown: 1.0 } to: 127.0.0.1:27019

server should be down...

Sun Nov  6 20:16:11 trying reconnect to 127.0.0.1:27019

Sun Nov  6 20:16:11 reconnect 127.0.0.1:27019 failed couldn't connect to server 127.0.0.1:27019

Sun Nov  6 20:16:11 Error: error doing query: unknown shell/collection.js:150

secondary 当机之后,主库有PRIMARY变为SECONDARY

[mongodb@rac4 bin]$ mongo 127.0.0.1:27018 

MongoDB shell version: 2.0.1

connecting to: 127.0.0.1:27018/test

PRIMARY> 

PRIMARY> 

PRIMARY> 

SECONDARY> 

从日志中可以看出:从库down了之后,主库的变化

Sun Nov  6 20:16:13 [rsHealthPoll] replSet info 10.250.7.220:27019 is down (or slow to respond): DBClientBase::findN: transport error: 10.250.7.220:27019 query: { replSetHeartbeat: "myset", v: 1, pv: 1, checkEmpty: false, from: "10.250.7.220:27018" }

Sun Nov  6 20:16:13 [rsHealthPoll] replSet member 10.250.7.220:27019 is now in state DOWN

Sun Nov  6 20:16:13 [conn7] end connection 10.250.7.220:13217

Sun Nov  6 20:16:37 [rsMgr] can't see a majority of the set, relinquishing primary

Sun Nov  6 20:16:37 [rsMgr] replSet relinquishing primary state

Sun Nov  6 20:16:37 [rsMgr] replSet SECONDARY

这是和MongoDB的Primary选举策略有关的,如果情况不是Secondary宕机,而是网络断开,那么两个节点都会选取自己为Primary,因为他们能连接上的只有自己这一个节点。而这样的情况在网络恢复后就需要处理复杂的一致性问题。而且断开的时间越长,时间越复杂。所以MongoDB选择的策略是如果集群中只有自己一个节点,那么不选取自己为Primary。

所以正确的做法应该是添加两个以上的节点,或者添加arbiter,当然最好也最方便的做法是添加arbiter,aribiter节点只参与选举,几乎不会有压力,所以你可以在各种闲置机器上启动arbiter节点,这不仅会避免上面说到的无法选举Primary的情况,更会让选取更快速的进行。因为如果是三台数据节点,一个节点宕机,另外两个节点很可能会各自选举自己为Primary,从而导致很长时间才能得出选举结果。实际上集群选举主库上由优先级和数据的新鲜度这两个条件决定的。

官方文档:

Example: if B and C are candidates in an election, B having a higher priority but C being the most up to date:

1 C will be elected primary

2 Once B catches up a re-election should be triggered and B (the higher priority node) should win the election between B and C

3 Alternatively, suppose that, once B is within 12 seconds of synced to C, C goes down.

B will be elected primary.

When C comes back up, those 12 seconds of unsynced writes will be written to a file in the rollback directory of your data directory (rollback is created when needed).

You can manually apply the rolled-back data, see Replica Sets - Rollbacks.

重新搭建replica set 集群不过这次加上仲裁者:

[mongodb@rac4 bin]$ cat init2node.js 

rs.initiate({

    _id : "myset",

    members : [

        {_id : 0, host : "10.250.7.220:28018"},

        {_id : 1, host : "10.250.7.220:28019"},

        {_id : 2, host : "10.250.7.220:28020", arbiterOnly: true}

    ]

})

[mongodb@rac4 bin]$ ./mongo 127.0.0.1:28018 init2node.js 

[mongodb@rac4 bin]$ ./mongo 127.0.0.1:28018 

MongoDB shell version: 2.0.1

connecting to: 127.0.0.1:28018/test

PRIMARY> rs.status()

{

        "set" : "myset",

        "date" : ISODate("2011-11-06T14:16:13Z"),

        "myState" : 1,

        "members" : [

                {

                        "_id" : 0,

                        "name" : "10.250.7.220:28018",

                        "health" : 1,

                        "state" : 1,

...

                },

                {

                        "_id" : 1,

                        "name" : "10.250.7.220:28019",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" : "SECONDARY",

....

                },

                {

                        "_id" : 2,

                        "name" : "10.250.7.220:28020",

                        "health" : 1,

                        "state" : 7,

                        "stateStr" : "ARBITER",

....

                }

        ],

        "ok" : 1

}

PRIMARY> 

再次测试,测试主库变成secondary节点。

对于前一篇文章多节点的,比如4个primary,secondary节点,一个仲裁者,当两个节点down了之后,不会出现的文章说的down 1/2的机器整个集群不可用,但是如果down 3/4的机器时,整个集群将不可用!

日志记录中描述的 “majority of” 并没有给出一个具体的数值,目前所做的实验是多于1/2的时候,整个集群就不可用了

Sun Nov  6 19:34:16 [rsMgr] can't see a majority of the set, relinquishing primary 

时间: 2024-09-21 17:06:39

【Mongodb】Replica Set 的选举策略之三的相关文章

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

首先介绍一下在replica set里分为三种节点类型: 1 primary   负责client的读写. 2 secondary 作为热备节点,应用Primary的oplog读取的操作日志,和primary保持一致,不提供读写操作!   secondary有两种类型:    1)normal secondary   随时和Primay保持同步,     2)delayed secondary  延时指定时间和primary保持同步,防止误操作.  3 arbiter.它不负责任何读写,只作为一

【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

旅游网站推广策略之三-顺利出游

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 前天写的这篇:旅游网站推广策略之-准备出游 /article/20080326/77651.shtml 昨天写的这篇:旅游网站推广策略之二-机场受阻 /article/20080327/77773.shtml 今天我们来写系列三:旅游网站推广策略之三-顺利出游,此篇基本是属于优化细节方面的文篇,当然是比较基础,再加一些策略,如果对SEO非常掌

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