搭建高可用MongoDB集群 副本

工作中使用到了mongo,就自己研究了一下,总结了一下,会遇到的一些问题,有不对的地方还请各位牛人指导。

简单说一下

副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在

主节点挂掉了,整个集群内会自动切换

副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器

我们来看看mongoDB副本集的架构图:(注:此图是网上切下来的,比我画的好)

主服务器挂掉后的架构如下图:

如下是我的布署操作

我用的是VMware 11虚拟机

系统是CentOS-6.3-x86_64 系统

使用的数据库是mongodb-linux-x86_64-2.0.4

用了三个虚拟系统

ip 192.168.216.128 192.168.216.129 192.168.216.130

用到的端品分别是 10001 10002 10003

192.168.216.128当副本集主节点 其它做为副本集副本节点

开始布署

1、 分别在每个系统中使用 su切换用户身份如下图:

2、切记一定要在每个系统中关闭系统防火墙,因为在后面配置副本集时,这三台系统会互相求请,如果未关防火墙,配置是通不过的,这也是我在配置时遇到的问题

命令:service iptables stop

如图:

3,把你下载的mongodb的安装程序包上传到每个系统然后解压

4. 分别在每个系统下创建副本集文件夹

如何该命令执行不了请检查权限

mkdir -p replSet/data

5.分别在每个系统上启动mongodb 并使用ps -aux|grep mongod 命令查看是否启动

mongodb-linux-x86_64-2.0.4/bin/mongod –replSet application –dbpath replSet/data/ –port 10001 -logpath replSet/replSet.log -fork

mongodb-linux-x86_64-2.0.4/bin/mongod –replSet application –dbpath replSet/data/ –port 10002 –logpath replSet/replSet.log -fork

mongodb-linux-x86_64-2.0.4/bin/mongod –replSet application –dbpath replSet/data/ –port 10003 –logpath replSet/replSet.log -fork

如其中一个切图:

6.初始化副本集

在其中一个系统中登陆mongodb

命令 mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.128:10001

使用admin数据库

如下图:

定义副本集配置变量,这里的 _id:”application” 和上面命令参数“ –replSetapplication” 要保持

config ={_id:"application",members:[{_id:0,host:"192.168.216.128:10001"},{_id:1,host:"192.168.216.129:10002"},{_id:2,host:"192.168.216.130:10003"}]}

如图命令和输出

初始化副本配置

命令: rs.initiate(config);

输出结果:

{"info" : "Config now saved locally. Should come online in about a minute.","ok" : 1}

如果输出如下:表示192.168.216.129:10002端口访问不到请检查该系统下10002端口的mongodb是否启动

rs.initiate(config);{"errmsg" : "couldn’t initiate : need all members up to initiate, not ok : 192.168.216.129:10002","ok" : 0}

查看集群节点的状态

命令: rs.status();

输出结果如下图

此时整个副本集已经搭建成功

7.开始测试

在主节点上连接到数据库

命令:mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.128:10001

建立test 数据库。

命令: use test;

往testdb表插入数据。

命令: db.testdb.insert({"mongodb":"mongodbtest"})

在副本节点192.168.216.129 192.168.216.130上连接到mongodb查看数据是否复制过来。

如我在130上查看命令如下

mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.130:10003

进入后输入如下命令进入test数据库

use test

执行 db.testdb.find()查看表

报如下错:

error: { "$err" : "not master and slaveok=false", "code" : 13435 }

解决办法如下

输入rs.slaveOk();

然后再执行如上查看表操作

#输出如下

{ "_id" : ObjectId("55bb3495ce19b28f7ea77e81"), "mongodb" : "mongodbtest" }

操作如下切图

8.测试副本集故障转移功能,也就是主节点挂掉后,副节点变为主节点

先停落主节点 128

我是直接kill 掉

在主节点系统上:

命令:ps -aux|grep mongod 查出mongodb启动的端口并杀掉

我查出的端口是 25305

命令 : kill -9 25305

如图

连接到其它两个系统进入mongodb数据库,会有其中一个变为主节点,辨认是否为主机点 如:出现primary表示为主节点

如下查看示范例子

查看整个集群的状态,可以看到128为状态不可达。

mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.129:10002

rs.status();

输出如下

梦想让我与众不同,奋斗让我改变命运!

搭建高可用MongoDB集群 副本

相关文章:

你感兴趣的文章:

标签云: