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同样可以服务
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同样可以服务
相关文章推荐
- mongodb副本集和认证部署注意点
- MongoDB的分片和副本集--部署
- MongoDB副本集部署
- MongoDB实战系列之四:mongodb副本集部署
- mongodb 最新版本高可用解决方案-replica sets副本集部署详细过程
- Mongodb的副本集+分片部署
- Mongodb的副本集+分片部署
- centos7下安装部署mongodb集群(副本集模式)
- MongoDB集群部署(副本集模式)
- MongoDB为何要部署单机副本集
- mongoDB分布式部署(windows)——服务安装与副本集配置初始化——本机(二)
- mongodb2.6部署副本集+分区
- MongoDB实战系列之四:mongodb副本集部署
- MongoDB实战全攻略(含安装常用命令备份恢复及主从(含副本集合)部署)
- MongoDB:部署副本集
- MongoDB:使用keyfile访问控制的方式部署副本集
- MongoDB 3.2.7 for rhel6.4 副本集-分片集群部署
- [原创]在Docker上部署mongodb分片副本集群。
- Mongodb的副本集部署