2个Standard节点+1个Arbiter节点 搭建MongoDB Replication Sets
创建目录
[root@localhost ~]# mkdir -p /data/replset/r0
[root@localhost ~]# mkdir -p /data/replset/r1
[root@localhost ~]# mkdir -p /data/replset/r2
[root@localhost ~]# mkdir -p /data/replset/key
[root@localhost ~]# mkdir -p /data/replset/log
创建KEY
[root@localhost ~]# echo "replset1 key" > /data/replset/key/r0
[root@localhost ~]# echo "replset1 key" > /data/replset/key/r1
[root@localhost ~]# echo "replset1 key" > /data/replset/key/r2
[root@localhost ~]# chmod 600 /data/replset/key/r* //600,防止其它程序改写此KEY
/Apps/mongo/bin/mongod --dbpath=/data/replset/r0 --replSet replset1 --keyFile /data/replset/key/r0 --port 28010
/Apps/mongo/bin/mongod --dbpath=/data/replset/r1 --replSet replset1 --keyFile /data/replset/key/r1 --port 28011
/Apps/mongo/bin/mongod --dbpath=/data/replset/r2 --replSet replset1 --keyFile /data/replset/key/r2 --port 28012
注:--keyFile /data/key/r0 加了这个后,MongVUE就连不到了
改用下面的就行了(这是里为方便看日志,直接在命令行输出查看)
/Apps/mongo/bin/mongod --dbpath=/data/replset/r0 --replSet replset1 --port 28010 --directoryperdb
/Apps/mongo/bin/mongod --dbpath=/data/replset/r1 --replSet replset1 --port 28011 --directoryperdb
/Apps/mongo/bin/mongod --dbpath=/data/replset/r2 --replSet replset1 --port 28012 --directoryperdb
正式运行要后台运行就用下面的:
/Apps/mongo/bin/mongod --dbpath=/data/replset/r0 --replSet replset1 --port 28010 --logpath=/data/replset/log/r0.log --logappend --fork --directoryperdb
/Apps/mongo/bin/mongod --dbpath=/data/replset/r1 --replSet replset1 --port 28011 --logpath=/data/replset/log/r1.log --logappend --fork --directoryperdb
/Apps/mongo/bin/mongod --dbpath=/data/replset/r2 --replSet replset1 --port 28012 --logpath=/data/replset/log/r2.log --logappend --fork --directoryperdb
初始化复本集:
/Apps/mongo/bin/mongo --port 28010
config_replset1 = {
_id:"replset1",
members:
[
{_id:0,host:"127.0.0.1:28010",priority:4},
{_id:1,host:"127.0.0.1:28011",priority:2},
{_id:2,host:"127.0.0.1:28012",arbiterOnly : true}
]
}
注意arbiter仲裁节点只投票,不接收复制的数据!
rs.initiate(config_replset1);
![](https://i-blog.csdnimg.cn/blog_migrate/0c41701faebb21befd2401bb96de75fc.jpeg)
/Apps/mongo/bin/mongo --port 28010
/Apps/mongo/bin/mongo --port 28011
/Apps/mongo/bin/mongo --port 28012
//向PRIMARY写入一条数据
![](https://i-blog.csdnimg.cn/blog_migrate/30644944756945fb6feed0f5f9e3a389.jpeg)
//SECONDARY不能写,而设置slaveOk后,可能从SECONDARY读取数据
![](https://i-blog.csdnimg.cn/blog_migrate/7e9d95d6d82bbfd5b0c281487101f707.jpeg)
默认情况下SECONDARY不能读写,要设定db.getMongo().setSlaveOk();才可以从SECONDARY读取
replSet里只能有一个Primary库,只能从Primary写数据,不能向SECONDARY写数据
//ARBITER 读取写入都不能
![](https://i-blog.csdnimg.cn/blog_migrate/56324b7f23173e01d90593ee3c84bcb5.jpeg)
注意arbiter仲裁节点只投票,不接收复制的数据!,不接收PRIMARY写入的mydb的数据!
![](https://i-blog.csdnimg.cn/blog_migrate/bcc01a948fc60bfb9aed29360cd1cf85.jpeg)
从ARBITER节点看到, ARBITER 只存放了local.system.replset里的副本集的配置信息,没有oplog.rs,
而ARBITER 也没有接收PRIMARY写入的mydb的数据!说明
ARBITER"仅仅起投票作用,而不接收复制的数据"!
![](https://i-blog.csdnimg.cn/blog_migrate/9cd97244156180f2a58cd9760875c3ea.png)
看看PRIMARY的local.slaves,看到只有一个slave(而不是两个),这个slave就是SECONDARY节点,这里ARBITER节点不是PRIMARY的slave,
这也说明ARBITER"仅仅起投票作用,而不接收复制的数据"!
故障切换测试:
Ctrl+C退出
PRIMARY进程, PRIMARY节点28010就DOWN了,
看看原来的
SECONDARY(28011)节点,
![](https://i-blog.csdnimg.cn/blog_migrate/deebb347f65fc1f3dba15cc35f513993.jpeg)
再看看
ARBITER节点(28012)
![](https://i-blog.csdnimg.cn/blog_migrate/a7ee73e9c5874bc58a0ccabd8d1c27e1.jpeg)
PRIMARY节点28010 DOWN了之后, ARBITER就投票给SECONDARY 28011, SECONDARY 就成为新的PRIMARY节点
![](https://i-blog.csdnimg.cn/blog_migrate/ebe7272f1b560d1eb87f7cc9080502e1.jpeg)
总结:
1:当副本集的总可投票数为偶数时,可能出现无法选举出主节点的情况,mongod会提示:
![](https://i-blog.csdnimg.cn/blog_migrate/df31e5407d452f3afffb0c8b55744c77.jpeg)
2个Standard节点组成Replication Sets是不合理的,因为不具备故障切换能力!
A:当SECONDARY Down掉,剩下一个PRIMARY,此时副本集运行不会出问题,因为不用选择PRIMARY节点
B:当PRIMARY Down掉,此时副本集只剩下一个SECONDARY,它只有1票,不超过总节点数的半数,它不会选举自己为PRIMARY节点!
提示如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6f243a6de608dce4040a2c92015f08a8.jpeg)
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同样可以服务
![](https://i-blog.csdnimg.cn/blog_migrate/56676d4e383a09406e0141f26e77908e.jpeg)