您的位置:首页 > 数据库 > Mongodb

Mongodb的副本集部署

2013-02-27 12:21 190 查看
  MongoDB的主从集群分为两种:

  1. Master-Slave 复制(主从复制)  

  2. Replica Sets 复制(副本集)

之前采用Master-Slave模式的时候(详见Mongodb的主从部署),一旦Master停掉,客户端就会报异常,这个时候已经没有Master了,Slave不会自动接管Master

Replica Sets 也是一种Master-Slave,但它更健壮,一旦Master停掉后,将会在Slave中选举一个作为Master,这种方式也是官方推荐的。

MongoDB在1.6版本开发了replica set,主要增加了故障自动切换和自动修复成员节点.各个DB之间数据完全一致,最为显著的区别在于,副本集没有固定的主节点,它是整个集群选举得出的一个主节点.当其不工作时变更其它节点.

下面我们开始部署: 参考资料(http://blog.csdn.net/irelandken/article/details/8003315)

2个Standard节点+1个Arbiter节点 搭建MongoDB Replication Sets

环境:
虚拟机:Oracle VM virtualbox 4.0.6
Linux:CentOS
5.6

x1  192.168.0.188

用x1一台机子的三个端口分别模拟3台机子
2个Standard节点
 192.168.0.188:28010
 192.168.0.188:28011

1个Arbiter节点 (注意arbiter仲裁节点只投票,不接收复制的数据!)
 192.168.0.188:28012

第一步:创建目录

[root@x1 ~]# mkdir -p /data/replset/r0   //机子0号存放数据的目录

[root@x1 ~]# mkdir -p /data/replset/r1   //机子1号存放数据的目录

[root@x1 ~]# mkdir -p /data/replset/r2  //机子2号存放数据的目录

[root@x1 ~]# mkdir -p /data/replset/key  //存放密钥的目录

[root@x1 ~]# mkdir -p /data/replset/log  //存放日记的目录



第二步:创建Key

[root@x1 ~]# echo "replset1 key" > /data/replset/key/r0

[root@x1 ~]# echo "replset1 key" > /data/replset/key/r1

[root@x1  ~]# echo "replset1 key" > /data/replset/key/r2

[root@x1 ~]# chmod 600 /data/replset/key/r*  //600,防止其它程序改写此KEY



第三步:以副本集的方式启动Mongodb

进入mongodb安装的bin目录运行如下:

启动方式一:

./mongod --dbpath=/data/replset/r0 --replSet replset1 --keyFile /data/replset/key/r0 --port 28010
./mongod --dbpath=/data/replset/r1 --replSet replset1 --keyFile /data/replset/key/r1 --port 28011
./mongod --dbpath=/data/replset/r2 --replSet replset1 --keyFile /data/replset/key/r2 --port 28012
注:--keyFile /data/key/r* 加了这个后,MongVUE就连不到了

启动方式二:直接在命令行输出查看

./mongod --dbpath=/data/replset/r0 --replSet  replset1 --port 28010 --directoryperdb
./mongod --dbpath=/data/replset/r1 --replSet  replset1 --port 28011 --directoryperdb
./mongod --dbpath=/data/replset/r2 --replSet  replset1 --port 28012 --directoryperdb

启动方式三:后台运行

./mongod --dbpath=/data/replset/r0 --replSet  replset1  --port 28010 --logpath=/data/replset/log/r0.log --logappend --fork --directoryperdb
./mongod --dbpath=/data/replset/r1 --replSet  replset1  --port 28011 --logpath=/data/replset/log/r1.log --logappend --fork --directoryperdb
./mongod --dbpath=/data/replset/r2 --replSet  replset1  --port 28012 --logpath=/data/replset/log/r2.log --logappend --fork --directoryperdb

这里用第二种启动方式做演示:
运行第一行代码启动第一个端口(机子)



接着ctrl+alt+f2进入控制台2运行第二行代码启动第二个端口(机子)



接着ctrl+alt+f3进入控制台3运行第三行代码启动第三个端口(机子)



第四步 初始化复本集:

ctrl+alt+f4进入控制台4打开mongodb的shell

./mongo --port 28010

config_replset1 =
 {
 _id:"replset1",
members:
[ {_id:0,host:"192.168.0.188:28010",priority:4},
{_id:1,host:"192.168.0.188:28011",priority:2},
{_id:2,host:"192.168.0.188:28012",arbiterOnly : true}
]
}
注意arbiter仲裁节点只投票,不接收复制的数据!

rs.initiate(config_replset1);







可以用rs.status()查看集群状况:



第五步:
下面我们进行数据同步测试:
//向PRIMARY(主节点)写入一条数据

use test
db.say.insert({"text":"Hello World"})



//进入SECONDARY(副节点)查看数据是否同步

PS:SECONDARY不能写,而设置slaveOk后,可能从SECONDARY读取数据

默认情况下SECONDARY不能读写,要设定db.getMongo().setSlaveOk();才可以从SECONDARY读取

replSet里只能有一个Primary库,只能从Primary写数据,不能向SECONDARY写数据

先ctrl+alt+f5进入控制台5端口2的mongodb的shell
进入mongodb的安装目标的bin目录 运行下面代码:
./mongo --port 28011
db.say.find()
rs.slaveOk()
db.say.find()





发现没运行rs.slaveOk()开启权限时不能进行读取。



开启权限后,能进行读取,发现已经数据已经同步备份。

//ARBITER 读取写入都不能

先ctrl+alt+f6进入控制台6端口3的mongodb的shell
进入mongodb的安装目标的bin目录 运行下面代码:
./mongo --port 28012
db.say.find()
rs.slaveOk()
db.say.find()
db.say.insert({"text2":"Hi"})



注意arbiter仲裁节点只投票,不接收复制的数据!,不接收PRIMARY写入的mydb的数据!

第六步:
故障切换测试:把主节点关掉,看副节点是否能接替主节点进行工作

按ctrl+alt+f1回到端口1的控制台 用ctrl+c把28010端口的mongodb服务停掉



按ctrl+alt+f2回到端口2的控制台
查看端口28011的情况:



发现28011投给自己一票
按ctrl+alt+f3回到端口3的控制台
查看端口28012的情况:

PRIMARY节点28010
DOWN了之后, ARBITER就投票给SECONDARY 28011, SECONDARY 就成为新的PRIMARY节点

按ctrl+alt+f5回到端口28011(原SECONDARY)的控制台
查看集群状态:

rs.status()



看到SECONDARY 就成为新的PRIMARY节点

最后,部署注意事项:

总结:
1:当副本集的总可投票数为偶数时,可能出现无法选举出主节点的情况,mongod会提示:



2个Standard节点组成Replication Sets是不合理的,因为不具备故障切换能力!

A:当SECONDARY Down掉,剩下一个PRIMARY,此时副本集运行不会出问题,因为不用选择PRIMARY节点
B:当PRIMARY Down掉,此时副本集只剩下一个SECONDARY,它只有1票,不超过总节点数的半数,它不会选举自己为PRIMARY节点!

提示如下:



3个Standard节点组成Replication Sets是可以的,当PRIMARY节点DOWN了还是可以再选出一个PRIMARY节点,此时要马上修复DOWN机的节点,
因为不修复的话如果当前的PRIMARY节点再DOWN了,剩下一个SECONDARY节点是不能选出PRIMARY节点的!

可行方案: 3个Standard节点 或 2个Standard节点+1个Arbiter节点

如果只有2台服务器,可以将优先级高的Standard部署到1台高性能的服务器,
然后将另一个Standard节点+1个Arbiter节点部署到另一台服务器,
这样PRIMARY节点在1台服务器,SECONDARY结点和ARBITER节点和另一台服务器,
这样无论哪个节点坏了,ReplSet同样可以服务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: