Mongodb副本集选举机制总结及副本集分片集群搭建

Mongodb官方推荐使用副本集模式,如图1所示,该模式不但实现了主从模式的读写分离,而且有自己的一套选举机制,选举出当前最优的节点作为主节点,一旦主节点宕机,选举出来的新的节点将成为主节点对外提供服务,其他节点则继续作为复制节点,当原先的主节点恢复,会自动作为备份节点。


                                          图1

Mongodb集群触发选举的条件:

1.复制集初始化。

2.主节点挂掉。

3.主节点脱离副本集(可能是网络原因)。

4.参与选举的节点数量必须大于副本集总节点数量的一半,如果已经小于一半了所有节点保持只读状态。  

 

                                    图2.

mongodb的选举机制探究总结:

1、副本集中的主节点选举必须满足“大多数”的原则,所谓“大多数”是指副本中一半以上的成员。副本集中成员只有在得到大多数成员投票支持时,才能成为主节点。例如:有N个副本集成员节点,必须有N/2+1个成员投票支持某个节点,此节点才能成为主节点。注意:副本集中若有成员节点处于不可用状态,并不会影响副本集中的“大多数”,“大多数”是以副本集的配置来计算的。

2、仲裁节点(Arbiter)它并不保存数据,并且不能被选举为主节点,但是具有投票权。仲裁节点使用最小的资源,不能将Arbiter部署在同一个数据集节点中。

3、副本集中最好是有奇数个成员节点,如果有偶数个节点,最好加一个仲裁节点。若副本集中有偶数个成员节点,如图2所示,IDC1网络连不通IDC2,IDC1和IDC2内的成员节点分别会发生选举主节点的行为,然而选举因都无法满足大多数的原则,都不能选出主节点;加入一个仲裁节点之后,则副本集就能满足大多数原则,从中选出主节点了。

4.如果副本集成员节点数量是奇数,就不再需要仲裁者。但是如果在成员节点是奇数时,强行使用仲裁者,会导致选举耗时变长。由于添加了仲裁者就可能出现两个成员节点票数相同的情况,从而导致选举耗时变长。

5.若在一轮投票中,副本集中成员节点被投了反对票,则本轮不能被选为主节点。例如,在一个10个成员节点的副本集,某轮投票中,成员节点A由于数据延迟较大被某个成员节点投了反对票,则A同时收到了9票赞成票,然而A仍然不能被选为主节点。

6.集群中的优先级为0的节点不能成为主节点,并且不能触发选举,但是具有投票权,并且拥有与主节点一致的数据集。


                                         图3

Mongodb副本集分片集群配置搭建:

如图3所示,Server1(192.168.13.4)作为仲裁服务器,Server2(192.168.13.5)和server3(192.168.13.6)作为数据服务器。


服务器应用和端口分配:

—————————————–

mongod数据服务器:

mongod shard server1:

Shard0   192.168.13.5 :20000

Shard1  192.168.13.5 :20001

Shard2  192.168.13.5 :20002

—————————————–

mongod  shard server2:

Shard0   192.168.13.6 :20000

Shard1  192.168.13.6 :20001

Shard2  192.168.13.6 :20002

—————————————–

config Server:

192.168.13.4:22222

192.168.13.5:22222

192.168.13.6:22222

—————————————–

mongos Route Process:

192.168.13.4:27017

192.168.13.5:27017

192.168.13.6:27017

—————————————–

一.mongodb ReplicaSets配置:

1).下载安装mongodb。

2).mongod Sharding Server的配置

分别在192.168.13.5,192.168.13.6上进行如下配置:

创建需要的目录

$ mkdir /usr/local/mongodb/shard0

$ mkdir /usr/local/mongodb/shard1

$ mkdir /usr/local/mongodb/shard2

$ mkdir /usr/local/mongodb/config

$ mkdir /usr/local/mongodb/configdata

$ mkdir /usr/local/mongodb/log

创建mongod每个片的配置文件,并启动mongod

$ vim config/shard0.cnf

#shard0——————————————

port = 20000

dbpath = /usr/local/mongodb/shard0

repairpath = /usr/local/mongodb/shard0

logpath =/usr/local/mongodb/log/shard0.log

logappend = 1

directoryperdb = 1

fork = 1

oplogSize = 1024

maxConns = 1000

journal = 1

profile = 1

quiet = 1

nohttpinterface = 1

syncdelay = 30

slowms = 500

replSet = fadong0

shardsvr=1

shard1.cnf和shard2.cnf如shard0.cnf所示配置。


$numactl --interleave=all /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/config/shard0.cnf

$numactl --interleave=all  /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/config/shard1.cnf

$numactl --interleave=all  /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/config/shard2.cnf


3)config Server的配置

在server1,server2,server3上进行配置并启动。

$创建路由配置的配置文件,并启动

$ vim config/configdb.cnf

#config server———————————–         

port = 22222

dbpath = /usr/local/mongodb/configdata

directoryperdb = 1

logpath =/usr/local/mongodb/log/configdata.log

logappend = 1

fork = 1

oplogSize = 1024

configsvr=1


$ numactl --interleave=all /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/config/configdb.cnf


4)仲裁节点(ARBITER)的配置

在192.168.13.4上做如下部署,并启动arbiter mongod

$ mkdir    /usr/local/mongodb/arbiter0

$ mkdir  /usr/local/mongodb/arbiter1

$ mkdir  /usr/local/mongodb/arbiter2

$ mkdir  /usr/local/mongodb/config

$ mkdir  /usr/local/mongodb/log


$ vim config/ arbiter0.cnf

arbiter0——————————————

port = 20000

dbpath = /usr/local/mongodb/arbiter0

logpath = /usr/local/mongodb/log/arbiter0.log

fork = 1

maxConns = 1000

replSet = fadong0

arbiter0.cnf和arbiter1.cnf如arbiter2.cnf所示配置。


$numactl --interleave=all /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/config/arbiter0.cnf

$numactl --interleave=all /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/config/arbiter1.cnf

$numactl --interleave=all /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/config/arbiter2.cnf


5)实例化Replica Sets

登录到其中一个mongod服务器(192.168.13.5),执行下列命令

————————————————————————

$mongo --port 20000

config = {"_id": "fadong0",members:[

{"_id":0,host:"192.168.13.5:20000" },

{"_id":1,host:"192.168.13.6:20000" }]

};

rs.initiate(config)

rs.conf()

rs.status()

————————————————————————

$mongo --port 20001

config = {"_id": "fadong1",members:[

{"_id":0,host:"192.168.13.5:20001" },

{"_id":1,host:"192.168.13.6:20001" }]

};

rs.initiate(config)

rs.conf()

rs.status()

————————————————————————

$mongo --port 20002

config = {"_id": "fadong2",members:[

{"_id":0,host:"192.168.13.5:20002" },

{"_id":1,host:"192.168.13.6:20002" }

]

};

rs.initiate(config)

rs.conf()

rs.status()

加入一个ARBITER节点进行仲裁

————————————————————————

mongo --port 20000

rs.addArb("192.168.13.4:20000");

————————————————————————

mongo --port 20001

rs.addArb("192.168.13.4:20001");

————————————————————————

mongo --port 20002

rs.addArb("192.168.13.4:20002");

————————————————————————

二 mongodb sharding配置

1)分别在192.168.13.5,192.168.13.6上启动mongos

注意:路由配置文件(configdb)参数个数必须是奇数。

$ /usr/local/mongodb/bin/mongos --port 27017 --configdb  192.168.13.4:22222,192.168.13.5:22222,192.168.13.6:22222   --fork --logpath /usr/local/mongodb/log/route.log 


2)初始化sharding,在192.168.13.5上执行如下命令初始化

$ mongo 

mongos> use admin

db.runCommand({addshard:"fadong0/192.168.13.5:20000,192.168.13.6:20000",name:"shard0"})

db.runCommand({addshard:"fadong1/192.168.13.5:20001,192.168.13.6:20001",name:"shard1"})

db.runCommand({addshard:"fadong2/192.168.13.5:20002,192.168.13.6:20002",name:"shard2"})
3)激活数据库及集合的分片

db.runCommand({enablesharding:" xiangcheng "})

指定分片的key为:"key":{"id":1}

db.runCommand({"shardcollection":" xiangcheng.users","key":{"id":1}})


4)创建测试数据验证sharding

mongos> use xiangcheng

mongos>  for(i=1;i<=5000;i++) db.users.insert({id:i,name:"andrew_ru",addr:"Shanghai pudong",country:"China"})

mongos> db.users.stats()

mongos> db.printShardingStatus()

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30109892/viewspace-1876571/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30109892/viewspace-1876571/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值