测试ReplicaSets读写分离和故障转移

读写分离实现步骤:

从库能够进行查询就更好了,这样可以分担主库的大量的查询请求。

1) 先向主库中插入一条测试数据

rs1:PRIMARY> db.c1.insert({age:30});db.c1.insert({age:30});

WriteResult({ "nInserted" : 1 })

rs1:PRIMARY>  db.c1.find() db.c1.find()

{ "_id" : ObjectId("5791ef011f4c6277726192b1"), "age" : 30 }

rs1:PRIMARY>

2)在从库进行查询等操作

[[email protected] bin]#  ./mongo --port 28011

MongoDB shell version: 3.2.8

connecting to: 127.0.0.1:28011/test

rs1:SECONDARY> show collectionsshow collections

2016-07-22T18:02:47.038+0800 E QUERY    [thread1] Error: listCollections failed: {

"ok" : 0,

"errmsg" : "not authorized on test to execute command { listCollections: 1.0, filter: {} }",

"code" : 13

} :

[email protected]/mongo/shell/utils.js:25:13

[email protected]/mongo/shell/db.js:773:1

[email protected]/mongo/shell/db.js:785:19

[email protected]/mongo/shell/db.js:796:16

[email protected]/mongo/shell/utils.js:754:9

[email protected]/mongo/shell/utils.js:651:15

@(shellhelp2):1:1

rs1:SECONDARY>

当查询时报错了,说明是个从库,目前不能执行查询的操作。

3)让从库可以读,分担主库的压力

> db.getMongo().setSlaveOk()

> show collections还是不行,

> exit

查询官方手册https://docs.mongodb.org/manual/tutorial/enable-authentication/发现登录方式应该用

[[email protected] bin]# ./mongo --port 28011 -u "bbb" -p "bbb" --authenticationDatabase "admin"

MongoDB shell version: 3.2.8

connecting to: 127.0.0.1:28011/test

Server has startup warnings:

2016-07-22T17:36:41.302+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.

2016-07-22T17:36:41.302+0800 I CONTROL  [initandlisten]

2016-07-22T17:36:41.302+0800 I CONTROL  [initandlisten]

2016-07-22T17:36:41.302+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is ‘always‘.

2016-07-22T17:36:41.302+0800 I CONTROL  [initandlisten] **        We suggest setting it to ‘never‘

2016-07-22T17:36:41.302+0800 I CONTROL  [initandlisten]

2016-07-22T17:36:41.302+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is ‘always‘.

2016-07-22T17:36:41.302+0800 I CONTROL  [initandlisten] **        We suggest setting it to ‘never‘

2016-07-22T17:36:41.302+0800 I CONTROL  [initandlisten]

rs1:SECONDARY> show collectionsshow collections

2016-07-22T18:06:17.354+0800 E QUERY    [thread1] Error: listCollections failed: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } :

[email protected]/mongo/shell/utils.js:25:13

[email protected]/mongo/shell/db.js:773:1

[email protected]/mongo/shell/db.js:785:19

[email protected]/mongo/shell/db.js:796:16

[email protected]/mongo/shell/utils.js:754:9

[email protected]/mongo/shell/utils.js:651:15

@(shellhelp2):1:1

rs1:SECONDARY> use adminuse admin

switched to db admin

rs1:SECONDARY> show dbsshow dbs

admin  0.000GB

local  0.000GB

rs1:SECONDARY> db.getMongo().setSlaveOk() db.getMongo().setSlaveOk()

rs1:SECONDARY> show collectionsshow collections

system.users

system.version

rs1:SECONDARY>

OK了。执行 db.getMongo().setSlaveOk() 可以将从库的查询功能打开。

故障转移测试:

复制集比传统的master-slave有改进的地方就是它可以进行故障的自动转移,如果我们停掉复制集中的一个成员,那么剩余的成员就会再自动选举一个成员,作为主库,如下所示。

我们将28010这个主库停掉,然后再看一下复制集的状态。

1) 杀掉28010端口的MongoDB

[[email protected] bin]#  ps aux | grep mongod

root     16629  0.3  0.4 783320 80124 ?        Sl   17:36   0:07 /usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r0 --fork --port 28010 --dbpath /data02/mongors/data/r0 --logpath=/data02/mongors/log/r0.log --logappend

root     16666  0.3  0.4 778000 78904 ?        Sl   17:36   0:07 /usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r1 --fork --port 28011 --dbpath /data02/mongors/data/r1 --logpath=/data02/mongors/log/r1.log --logappend

root     16703  0.3  0.4 778004 75068 ?        Sl   17:36   0:07 /usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r2 --fork --port 28012 --dbpath /data02/mongors/data/r2 --logpath=/data02/mongors/log/r2.log --logappend

root     16825  0.0  0.1 225072 22800 pts/1    Sl+  17:39   0:00 /usr/local/mongodb/bin/mongo -port 28010

root     17539  0.0  0.0 110216   900 pts/0    R+   18:12   0:00 grep --color=auto mongod

[[email protected] bin]# kill -9 16629

[[email protected] bin]#  ps aux | grep mongod

root     16666  0.3  0.4 778000 79056 ?        Sl   17:36   0:07 /usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r1 --fork --port 28011 --dbpath /data02/mongors/data/r1 --logpath=/data02/mongors/log/r1.log --logappend

root     16703  0.3  0.4 778004 75200 ?        Sl   17:36   0:07 /usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r2 --fork --port 28012 --dbpath /data02/mongors/data/r2 --logpath=/data02/mongors/log/r2.log --logappend

root     16825  0.0  0.1 225072 22800 pts/1    Sl+  17:39   0:00 /usr/local/mongodb/bin/mongo -port 28010

root     17569  0.0  0.0 110216   904 pts/0    R+   18:13   0:00 grep --color=auto mongod

[[email protected] bin]#

2) 查看复制集状态

[[email protected] mongodb]#  /usr/local/mongodb/bin/mongo -port 28011

MongoDB shell version: 3.2.8

connecting to: 127.0.0.1:28011/test

rs1:SECONDARY> rs.status();rs.status();//又是权限问题

{

"ok" : 0,

"errmsg" : "not authorized on admin to execute command { replSetGetStatus: 1.0 }",

"code" : 13

}

rs1:SECONDARY> use adminuse admin

switched to db admin

rs1:SECONDARY> db.auth(‘bbb‘,‘bbb‘)db.auth(‘bbb‘,‘bbb‘)

1

rs1:SECONDARY>  rs.status(); rs.status();

{

"set" : "rs1",

"date" : ISODate("2016-07-22T10:15:14.194Z"),

"myState" : 2,

"term" : NumberLong(2),

"syncingTo" : "localhost:28012",

"heartbeatIntervalMillis" : NumberLong(2000),

"members" : [

{

"_id" : 0,

"name" : "localhost:28010",

"health" : 0,

"state" : 8,

"stateStr" : "(not reachable/healthy)",

"uptime" : 0,

"optime" : {

"ts" : Timestamp(0, 0),

"t" : NumberLong(-1)

},

"optimeDate" : ISODate("1970-01-01T00:00:00Z"),

"lastHeartbeat" : ISODate("2016-07-22T10:15:14.054Z"),

"lastHeartbeatRecv" : ISODate("2016-07-22T10:13:10.712Z"),

"pingMs" : NumberLong(0),

   "lastHeartbeatMessage" : "Connection refused",

"configVersion" : -1

},

{

"_id" : 1,

"name" : "localhost:28011",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 2313,

"optime" : {

"ts" : Timestamp(1469182400, 2),

"t" : NumberLong(2)

},

"optimeDate" : ISODate("2016-07-22T10:13:20Z"),

"syncingTo" : "localhost:28012",

"configVersion" : 1,

"self" : true

},

{

"_id" : 2,

"name" : "localhost:28012",

"health" : 1,

"state" : 1,

     "stateStr" : "PRIMARY",

"uptime" : 2097,

"optime" : {

"ts" : Timestamp(1469182400, 2),

"t" : NumberLong(2)

},

"optimeDate" : ISODate("2016-07-22T10:13:20Z"),

"lastHeartbeat" : ISODate("2016-07-22T10:15:13.010Z"),

"lastHeartbeatRecv" : ISODate("2016-07-22T10:15:12.593Z"),

"pingMs" : NumberLong(0),

"electionTime" : Timestamp(1469182400, 1),

"electionDate" : ISODate("2016-07-22T10:13:20Z"),

"configVersion" : 1

}

],

"ok" : 1

}

rs1:SECONDARY>

可以看到28010这个端口的MongoDB出现了异常,而系统自动选举了 28012 这个端口为主,所以这样的故障处理机制,能讲系统的稳定性大大提高。

时间: 2024-10-12 17:44:39

测试ReplicaSets读写分离和故障转移的相关文章

MongoDB副本集(一主两从)读写分离、故障转移功能环境部署记录

Mongodb是一种非关系数据库(NoSQL),非关系型数据库的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式.主从模式其实就是一个单副本的应用,没有很好的扩展性和容错性,而Mongodb副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,主节点挂掉后,整个集群内会实现自动切换. Mongodb副本集的工作原理客户端连接到整个Mongodb副本集,不关心具体哪一台节点机是否挂掉.主节点机负

Hyper-V虚拟化测试12非计划的故障转移

6.2.非计划的故障转移对于计划的故障转移,意义其实不是很大,除非有服务器的维护.硬件升级等,但是服务器的维护也可以使用实时迁移,不用通过计划的故障转移.其实Hyper-V复制功能最大的意义应该在于非计划的故障转移的实现实现容灾.首先需要模拟主服务器上的虚拟机宕机,在这里,我首先关闭主服务器上的虚拟机,切换到副本服务器,右键需要故障转移的虚拟机,选择"复制"故障转移 选择恢复点,然后点击"故障转移" 故障转移成功后,虚拟机自动启动 连接到虚拟机,查看配置信息和文件,

Hyper-V虚拟化测试10测试故障转移

5.3.测试故障转移Hyper-V也提供了一个测试故障转移的测试方案,故障转移测试并非真正的实现故障转移,Hyper-V只是在我们的副本服务创建一个快照出来,是一个Hyper-V内置的测试方法,通过此方法,可以了解虚拟机的复制状态和有效性. 首先,找到需要复制测试的虚拟机,在主服务器上,查看下服务器的配置和信息,方便后续故障转移测试时查看信息用.这里创建了一个文本文件,然后看看服务器IP地址信息,如下:文本信息 IP地址信息 下面回到我们的副本服务器上,右键à复制à测试故障转移 因之前我们选择复

LVS+MYCAT读写分离+MYSQL同步部署手册(第三版)

1      配置MYSQL主备同步 1.1    测试环境 mysql版本:5.6.24: 操作系统内核版本:Linux-3.13-0-32 主数据库IP:192.168.10.3: 主数据库名:db351353: 备用数据库IP:192.168.10.4: 备用数据库名:db351353. 1.2    配置主数据库 1.2.1   编辑my.cnf文件 #服务器唯一ID,一般取IP最后一段 server_id = 3 #启用二进制日志 log_bin=mysql_bin #需要备份的数据库

Windows 2012 系统搭建高可用故障转移集群

Windows 2012 系统搭建高可用故障转移集群 一.故障转移集群介绍 2 1.1 系统介绍 2 1.2 工作原理 2 二.实验目的 2 2.1 验证故障转移功能 2 2.2 验证高可用集群的可用性,以及支持的服务类型 2 三.实验原理 3 3.1 实验拓扑 3 3.2 实验环境设备 3 四.配置步骤 4 4.1 配置域服务器 4 4.2  iSCSI 虚拟存储配置 18 4.3 配置故障转移集群服务 45 4.4  验证集群 63 五.实验结果验证 68 5.1  验证故障转移 68 5.

MySQL ProxySQL读写分离使用初探

目的 在美团点评DBProxy读写分离使用说明文章中已经说明了使用目的,本文介绍ProxySQL的使用方法以及和DBProxy的性能差异.具体的介绍可以看官网的相关说明,并且这个中间件也是percona推的一款中间件.其特性和其他读写分离的中间件差距不大,具体的会在文中介绍.本文大致简单的介绍在使用过程中的一些说明,也可以看官方的wiki获得使用帮助. 环境:  Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.

案例分享:数据库镜像故障转移失败

案例分享:数据库镜像故障转移失败 对于关键性数据库,我们配置了带有见证服务器的同步数据库镜像,来允许自动故障转移.一切运行正常,直到有一次数据中心的突然断电.数据库镜像执行了故障转移,但是运维反馈说应用程序挂起了.当我们手动切换回来,应用程序又正常工作.为什么应用程序没有也故障转移呢? 这是使用数据库镜像的合理的常见问题,像这样的生产应用失败,是因为在镜像部署后没有做故障转移测试.在失败的故障转移之后我们感到棘手. 为了避免生产应用停机,我们在测试环境复制了线上的镜像环境.在确认应用和数据库镜像

基于主从复制的Mysql双机热备+amoeba实现读写分离、均衡负载

读写分离指的是客户只能在主服务器上写,只能在从服务器上读,当然了,这也是要看配置,你可以在主服务器配置读的功能,但是在从服务器上只能读不能写,因为从服务器是基于binlog对主服务器的复制,如果在从服务器上写的话,会造成主从不一致的结果.mysql实现读写分离,写的压力虽然没有减少,但是读的压力瞬间就减少了一半. Amoeba的中文意思是阿米巴.变型虫Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy代理服务器.它集中地响应应用的请求,依据用户事先设置的规则

LVS+MYCAT+读写分离+MYSQL主备同步部署手册

LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1          配置MYSQL主备同步…. 2 1.1       测试环境… 2 1.2       配置主数据库… 2 1.2.1         编辑my.cnf文件… 2 1.2.2         重启数据库… 2 1.3       锁定主数据库DDL操作… 2 1.4       主备已有数据同步… 2 1.5       停止从服务… 3 1.6       配置备用数据库… 3 1.6.1         编辑my