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

搭建高可用MongoDB集群 副本

2015-07-31 17:13 701 查看
工作中使用到了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” 和上面命令参数“ –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"}]}

如图命令和输出



 

初始化副本配置

命令: 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

}

 

查看集群节点的状态

 

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

7.开始测试

在主节点上连接到数据库

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

 

建立test 数据库。

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
此不再录入代码自己可以试试

 

 至此副本集搭建好了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: