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/