测试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)在从库进行查询等操作
[root@node222 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
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:773:1
DB.prototype.getCollectionInfos@src/mongo/shell/db.js:785:19
DB.prototype.getCollectionNames@src/mongo/shell/db.js:796:16
shellHelper.show@src/mongo/shell/utils.js:754:9
shellHelper@src/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/发现登录方式应该用
[root@node222 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 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:773:1
DB.prototype.getCollectionInfos@src/mongo/shell/db.js:785:19
DB.prototype.getCollectionNames@src/mongo/shell/db.js:796:16
shellHelper.show@src/mongo/shell/utils.js:754:9
shellHelper@src/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
[root@node222 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
[root@node222 bin]# kill -9 16629
[root@node222 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
[root@node222 bin]#
2) 查看复制集状态
[root@node222 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 这个端口为主,所以这样的故障处理机制,能讲系统的稳定性大大提高。
测试ReplicaSets读写分离和故障转移的更多相关文章
- MongoDB副本集(一主两从)读写分离、故障转移功能环境部署记录
Mongodb是一种非关系数据库(NoSQL),非关系型数据库的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模 ...
- mycat 测试主从读写分离
下载解压及创建用户组和目录属性 下载地址:1.https://github.com/MyCATApache/Mycat-download.2.http://dl.mycat.io/ wget http ...
- 使用ProxySQL实现MySQL Group Replication的故障转移、读写分离(一)
导读: 在之前,我们搭建了MySQL组复制集群环境,MySQL组复制集群环境解决了MySQL集群内部的自动故障转移,但是,组复制并没有解决外部业务的故障转移.举个例子,在A.B.C 3台机器上搭建了组 ...
- 基于iSCSI的SQL Server 2012群集测试(四)--模拟群集故障转移
6.模拟群集故障转移 6.1 模拟手动故障转移(1+1) 模拟手动故障转移的目的有以下几点: 测试群集是否能正常故障转移 测试修改端口是否能同步到备节点 测试禁用full-text和Browser服务 ...
- SQL Server AlwaysOn 故障转移
目的: a) AlwaysOn 可用性组功能是一个提供替代数据库镜像的企业级方案的高可用性和灾难恢复解决方案. b) 当数据库服务器SQL1出现故障宕机时,可以通过AlwaysOn可用性组,自动故障转 ...
- LVS+MYCAT读写分离+MYSQL同步部署手册(第三版)
1 配置MYSQL主备同步 1.1 测试环境 mysql版本:5.6.24: 操作系统内核版本:Linux-3.13-0-32 主数据库IP:192.168.10.3: 主数据库名:d ...
- atlas+mysql主主集群实现读写分离
atlas+mysql主主集群实现读写分离 前言: 目前线上系统数据库采用的是主主架构.其中一台主仅在故障时切换使用,(仅单台服务器对外提供服务,当一台出现问题,切换至另一台).该结构很难支撑较大并 ...
- MySQL for OPS 09:MHA + Atlas 实现读写分离高可用
写在前面的话 前面做了 MHA 高可用,但是存在这样一个问题,我们花了 4 台机器,但是最终被利用起来的也就一台,主库.这样硬件利用率才 25%,这意味着除非发生故障,不然其他几台机器都是摆设.明显的 ...
- LVS+MYCAT+读写分离+MYSQL主备同步部署手册
LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1 配置MYSQL主备同步…. 2 1.1 测试环境… 2 1.2 配置主数据库… 2 1.2.1 ...
随机推荐
- 基于IOS下的支付宝SDK的学习与使用——实现产品支付(二)
首先本篇为作者原创,仅供学习使用,以后会不断完善,精炼.阅读之前请参考 上一篇 上一篇 中详细说明了结合官方支付宝SDK,对工程环境进行的一些配置,实现了支付,本篇重点说明一下,注意事项和原理,主要 ...
- 1.1-1.5 flume架构概述及安装使用
一.flume架构概述 1.flume简介 Flume是一种分布式,可靠且可用的服务,用于有效地收集,聚合和移动大量日志数据.它具有基于流数据流的简单灵活的架构.它具有可靠的可靠性机制和许多故障转移和 ...
- msq 表操作与其数据类型
一:表介绍 表相当于文件, 表中的一条记录就相当于文件的一行内容, 不同的是,表中的一条记录有对应的标题,称为表的字段: id,name, age, sex,称为字段, 其余的一行内容称为一条记录. ...
- java 大数详细讲解
介绍 java中用于操作大叔的类主要有俩种 第一个是BigInteger,代表大整数.第二个是BigDecimal,代表大浮点数.两种类的操作方法类似,所以我们只讲解BigInterger的用法 基本 ...
- forEach方法如何跳出循环
1.for方法跳出循环 function getItemById(arr, id) { var item = null; for (var i = 0; i < arr.length; i++) ...
- 用css写三角形,宽高可设置
1.不传@h,@c === @h; 2.元素width = @w, 元素height = @h*2 3.配合上.center()实现图标居中 less版本: //上下左右居中 .center(){ p ...
- Visual Studio 调试卡顿的解决方法
将不用的断点删除 关闭调试时打开的"IntelliXXX的窗口" 上面的第2条测试有效! https://social.msdn.microsoft.com/Forums/zh-C ...
- [Xcode 实际操作]一、博主领进门-(15)读取当前应用的信息
目录:[Swift]Xcode实际操作 本文将演示读取当前应用的配置信息. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:6. 设备事件上报
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- 002-tomcat安装与配置
1.创建目录 [root@bogon tomcat]#mkdir /usr/local/java/tomcat 2.上传压缩包并解压 [root@bogon tomcat]# tar xvf apac ...