搭建高可用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” 和上面命令参数“ –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

}

查看集群节点的状态

 命令: 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();

输出如下

{

"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

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

至此副本集搭建好了

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 14:42:07

搭建高可用MongoDB集群 副本的相关文章

搭建高可用mongodb集群(二)—— 副本集

http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html 在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 这篇文章看完这些问题就可以搞定了.NoSQL的产生就是为了解决大数据量.高扩展性.高

搭建高可用mongodb集群(三)—— 深入副本集内部机制

http://www.lanceyan.com/tech/mongodb_repset2.html 在上一篇文章<搭建高可用mongodb集群(二)—— 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的?能否手动干涉下架某一台主节点. 官方说副本集数量最好是奇数,为什么? mongodb副本集是如何同步的?如果同步不及时会出现什么情况?会不会出现不一致性? mongodb的故障转移会不会无故自动发生?什么条件会

【转】搭建高可用mongodb集群(二)—— 副本集

在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 这篇文章看完这些问题就可以搞定了.NoSQL的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.但是光通过主从模式的架构远远达不到上面几点,由此MongoDB设计了副本集和分片的功能

搭建高可用MongoDB集群(二): 副本集

在上一篇文章<搭建高可用MongoDB集群(一)--配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 这篇文章看完这些问题就可以搞定了.NoSQL的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.但是光通过主从模式的架构远远达不到上面几点,由此MongoDB设计了副本集和分片的功能

搭建高可用MongoDB集群 -分片-good

搭建高可用MongoDB集群(四):分片 http://blog.jobbole.com/72643/ Mongodb Replica Sets 副本集架构实战(架设.扩充.容灾.修复.客户端代码连入) http://snoopyxdy.blog.163.com/blog/static/60117440201241694254441/ 关于mongodb的shard集群动态添加分片 我在机器上建立起了分片集群,其中包含了四个分片,每个分片都是副本集构成,程序访问的时候可以将数据路由到各个分片上.

搭建高可用mongodb集群(四)—— 分片(经典)

转自:http://www.lanceyan.com/tech/arch/mongodb_shard1.html 按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么

搭建高可用mongodb集群—— 分片

从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来解决这个问题. 传统数据库怎么做海量数据读写?其实一句话概括:分而治之.上图看看就清楚了,如下 taobao岳旭强在infoq中提到的 架构图: 上图中有个TDDL,是taobao的一

搭建高可用mongodb集群(四)—— 分片

转载自LANCEYAN.COM 按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来解决这个问题. 传统数据库怎么做海量数据读写?其实一句

搭建高可用mongodb集群(转)

搭建高可用mongodb集群(一)——配置mongodb 搭建高可用mongodb集群(二)—— 副本集 搭建高可用mongodb集群(三)—— 深入副本集内部机制 搭建高可用mongodb集群(四)—— 分片