搭建高可用的MongoDB集群副本集

什么是副本集呢?打魔兽世界总说打副本,其实这两个概念差不多一个意思。游戏里的副本是指玩家集中在高峰时间去一个场景打怪,会出现玩家暴多怪物少的情况,游戏开发商为了保证玩家的体验度,就为每一批玩家单独开放一个同样的空间同样的数量的怪物,这一个复制的场景就是一个副本,不管有多少个玩家各自在各自的副本里玩不会互相影响。

mongoDB的副本也是这个,主从模式其实就是一个单副本的应用,没有很好的扩展性和容错性。而副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,并且解决了上面第一个问题“主节点挂掉了,整个集群内会自动切换”。

#######原理和工作机制#########

主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。

##################################部署副本集####################################

副本集机器数量为至少3个

10.2.16.250 主节点

10.2.16.254 副节点

10.2.16.251 仲裁服务器

2、分别在每台机器上建立mongodb副本集测试文件夹

#存放整个mongodb文件

mkdir -p /data/mongodbtest/replset

#存放mongodb数据文件

mkdir -p /data/mongodbtest/replset/data

#进入mongodb文件夹

cd  /data/mongodbtest

3、下载mongodb的安装程序包

wget <a href="http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz">http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz</a>

#解压下载的压缩包

[[email protected] ~]#tar xvzf mongodb-linux-x86_64-2.4.8.tgz

[[email protected] ~]#mv  mongodb-linux-x86_64-2.48  /usr/local/mongodb/

添加Mongodb命令的环境变量

[[email protected] ~]#vim /etc/profile

[[email protected] ~]#export PATH=/usr/local/mongodb/bin:$PATH

启动Mongodb,在两台服务器主和从同时操作:

[[email protected] ~]#mongod  --dbpath /data/mongodbtest/replset/data   --replSet repset (副本集名称)

可以看到控制台上显示副本集还没有配置初始化信息。

Sun Dec 29 20:12:02.953 [rsStart] replSet can‘t get local.system.replset config from self or any seed (EMPTYCONFIG)

Sun Dec 29 20:12:02.953 [rsStart] replSet info you may need to run  replSetInitiate -- rs.initiate() in the shell -- if that is not already done

5、初始化副本集

在三台机器上任意一台机器登陆mongodb

[[email protected] ~]#mongo

#使用admin数据库

use admin

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

config = { _id:"repset", members:[

... {_id:0,host:"10.2.16.250:27017"},   #id为0表示设置此IP为主服务器

... {_id:1,host:"10.2.16.254:27017"},]#id为1表示设置为备服务器,如果想再添加备服务器则设置id为2,依次类推。

... }

#输出

{

"_id" : "repset",

"members" : [

{

"_id" : 0,

"host" : "10.2.16.250:27017"

},

{

"_id" : 1,

"host" : "10.2.16.254:27017"

}

]

}

#初始化副本集配置

rs.initiate(config);

#输出成功

[plain] view plaincopy

{

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

"ok" : 1

}

#查看mongodb输出日志,副本集启动成功后,250为主节点PRIMARY,254为副本节点SECONDARY

#查看集群节点的状态 rs.status();

repset:PRIMARY> rs.status();

{

"set" : "repset",

"date" : ISODate("2014-06-30T10:03:22Z"),

"myState" : 1,

"members" : [

{

"_id" : 0,

"name" : "10.2.16.250:27017",

"health" : 1,

"state" : 1,

"stateStr" : "PRIMARY",

"uptime" : 961,

"optime" : Timestamp(1404122493, 1),

"optimeDate" : ISODate("2014-06-30T10:01:33Z"),

"self" : true

},

{

"_id" : 1,

"name" : "10.2.16.254:27017",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 106,

"optime" : Timestamp(1404122493, 1),

"optimeDate" : ISODate("2014-06-30T10:01:33Z"),

"lastHeartbeat" : ISODate("2014-06-30T10:03:20Z"),

"lastHeartbeatRecv" : ISODate("2014-06-30T10:03:21Z"),

"pingMs" : 2,

"syncingTo" : "10.2.16.250:27017"

}

],

"ok" : 1

}

6、测试副本集数据复制功能

#在主节点10.2.16.250 上连接到终端:

[[email protected] ~]#mongo

#建立test 数据库。

repset:PRIMARY>use test;

往testdb表插入数据。

repset:PRIMARY>> db.testdb.insert({"test1":"testval1"})

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

[[email protected] ~]#mongo

#使用test 数据库。

repset:SECONDARY> use test;

repset:SECONDARY> show tables;

#输出

[plain] view plaincopy

Sun Dec 29 21:50:48.590 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:128

#设置副本节点可以读: mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置可读

repset:SECONDARY> db.getMongo().setSlaveOk();

#可以看到数据已经复制到了副本集。

repset:SECONDARY> db.testdb.find();

[plain] view plaincopy

#输出

{ "_id" : ObjectId("52c028460c7505626a93944f"), "test1" : "testval1" }

添加仲裁服务器:

现在仲裁服务器10.2.16.251上装好mongodb,然后再:

#建立仲裁文件夹

mkdir /data/arb

#启动仲裁

mongod --port 30000 --dbpath /data/arb --replSet repset(副本集名称)

在主服务器上添加仲裁

repset:PRIMARY> rs.addArb("10.2.16.251:30000")

{ "ok" : 1 }

7、测试副本集故障转移功能

先停掉主节点mongodb 250,查看仲裁服务器和254从服务器的日志可以看到经过一系列的选择操作,254 当选主节点。

查看整个集群的状态:

mongo

repset:PRIMARY> rs.status();

#输出

{

"set" : "repset",

"date" : ISODate("2014-06-30T13:58:06Z"),

"myState" : 1,

"members" : [

{

"_id" : 0,

"name" : "10.2.16.250:27017",

"health" : 1,

"state" : 1,

"stateStr" : "PRIMARY",

"uptime" : 6095,

"optime" : Timestamp(1404131596, 1),

"optimeDate" : ISODate("2014-06-30T12:33:16Z"),

"self" : true

},

{

"_id" : 1,

"name" : "10.2.16.254:27017",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 5542,

"optime" : Timestamp(1404131596, 1),

"optimeDate" : ISODate("2014-06-30T12:33:16Z"),

"lastHeartbeat" : ISODate("2014-06-30T13:58:06Z"),

"lastHeartbeatRecv" : ISODate("2014-06-30T13:58:05Z"),

"pingMs" : 0,

"syncingTo" : "10.2.16.250:27017"

},

{

"_id" : 2,

"name" : "10.2.16.251:30000",

"health" : 1,

"state" : 7,

"stateStr" : "ARBITER",

"uptime" : 11,

"lastHeartbeat" : ISODate("2014-06-30T13:58:05Z"),

"lastHeartbeatRecv" : ISODate("2014-06-30T13:58:06Z"),

"pingMs" : 8

}

],

"ok" : 1

}

当250节点启动之后,会自动加入副本集并且变回primary节点.

####################至此即为配置成功!!#########################

状态参数一共有五个:primary、primaryPreferred、secondary、secondaryPreferred、nearest。

primary:默认参数,只从主节点上进行读取操作;

primaryPreferred:大部分从主节点上读取数据,只有主节点不可用时从secondary节点读取数据。

secondary:只从secondary节点上进行读取操作,存在的问题是secondary节点的数据会比primary节点数据“旧”。

secondaryPreferred:优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据;

nearest:不管是主节点、secondary节点,从网络延迟最低的节点上读取数据。

搭建高可用的MongoDB集群副本集

时间: 2024-11-08 21:37:16

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

MongoDB 高可用集群副本集+分片搭建

MongoDB 高可用集群搭建 一.架构概况 192.168.150.129192.168.150.130192.168.150.131 参考文档:https://www.cnblogs.com/vadim/p/7100683.html mongos mongos    mongos Config   server      Config server  Config serverShared1 server 1 Shared1 server 1 副本 Shared1 server 1 仲裁/隐

使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】

一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz强大的集群机制,可以采用基于 sqlserver,mysql的集群方案,当然还可以在第三方插件的基础上实现quartz序列化到热炒的mongodb,redis,震撼力可想而知,接下来本篇就和大家聊 一聊怎么搭建基于sqlserver的quartz集群,实现这么一种双机热备的强大功能. 一:下载sqlserver版的建表脚本   首先大家可以通过github上搜索quart

Nginx+Keeplived+Tomcat搭建高可用/负载均衡的web服务器集群

一.集群规划 服务器角色 主机名 IP地址/VIP 软件 Nginx Master NK1 20.0.20.101/20.0.20.100 Nginx/Keepalived Nginx Backup NK2 20.0.20.102/20.0.20.100 Nginx/Keepalived Web Server NK3 20.0.20.103 Tomcat Web Server NK4 20.0.20.104 Toncat #关闭selinux和firewall #软件版本为:apache-tom

MongoDB3.2.10 集群 - 副本集

mongodb 主从模式就是一个 单副本的应用:没有很好的扩展性和容错性: 副本集的多个副本保证了容错性: 主服务器负责整个副本集的读写,副本集定时同步数据:主节点挂掉:副本集会自动选举一个主的服务器: 1,安装配置: 主节点: 172.16.0.191 从点节点: 172.16.0.192 172.16.0.193 # wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.10.tgz # tar -xf m

搭建高可用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主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来解决这个问题. 传统数据库怎么做海量数据读写?其实一句话概括:分而治之.上图看看就清楚