搭建高可用MongoDB集群 副本

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

简单说一下

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

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

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

 

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

 

搭建高可用MongoDB集群 副本_第1张图片

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

 

搭建高可用MongoDB集群 副本_第2张图片

 

 如下是我的布署操作

 

我用的是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数据库

如下图:

搭建高可用MongoDB集群 副本_第3张图片

 

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

 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"}]}

如图命令和输出

搭建高可用MongoDB集群 副本_第4张图片

 

初始化副本配置

命令: 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();
输出结果如下图
搭建高可用MongoDB集群 副本_第5张图片

 

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

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" }
 
操作如下切图
搭建高可用MongoDB集群 副本_第6张图片
 

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();

输出如下

 

{
 "set" : "application",
 "date" : ISODate("2015-07-31T09:04:00Z"),
 "myState" : 1,
 "syncingTo" : "192.168.216.128:10001",
 "members" : [
  {
   "_id" : 0,
   "name" : "192.168.216.128:10001",
   "health" : 0,
   "state" : 8,
   "stateStr" : "(not reachable/healthy)",
   "uptime" : 0,
   "optime" : {
    "t" : 1438332053000,
    "i" : 1
   },
   "optimeDate" : ISODate("2015-07-31T08:40:53Z"),
   "lastHeartbeat" : ISODate("2015-07-31T09:00:17Z"),
   "pingMs" : 0,
   "errmsg" : "socket exception"
  },
  {
   "_id" : 1,
   "name" : "192.168.216.129:10002",
   "health" : 1,
   "state" : 1,
   "stateStr" : "PRIMARY",
   "optime" : {
    "t" : 1438332053000,
    "i" : 1
   },
   "optimeDate" : ISODate("2015-07-31T08:40:53Z"),
   "self" : true
  },
  {
   "_id" : 2,
   "name" : "192.168.216.130:10003",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 2044,
   "optime" : {
    "t" : 1438332053000,
    "i" : 1
   },
   "optimeDate" : ISODate("2015-07-31T08:40:53Z"),
   "lastHeartbeat" : ISODate("2015-07-31T09:03:59Z"),
   "pingMs" : 0
  }
 ],
 "ok" : 1
}

 

再启动原主节点128 发现变为  SECONDARY

此不再录入代码自己可以试试

 

 至此副本集搭建好了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(mongo)