读写分离实现步骤:

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

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读写分离和故障转移的更多相关文章

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

    Mongodb是一种非关系数据库(NoSQL),非关系型数据库的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模 ...

  2. mycat 测试主从读写分离

    下载解压及创建用户组和目录属性 下载地址:1.https://github.com/MyCATApache/Mycat-download.2.http://dl.mycat.io/ wget http ...

  3. 使用ProxySQL实现MySQL Group Replication的故障转移、读写分离(一)

    导读: 在之前,我们搭建了MySQL组复制集群环境,MySQL组复制集群环境解决了MySQL集群内部的自动故障转移,但是,组复制并没有解决外部业务的故障转移.举个例子,在A.B.C 3台机器上搭建了组 ...

  4. 基于iSCSI的SQL Server 2012群集测试(四)--模拟群集故障转移

    6.模拟群集故障转移 6.1 模拟手动故障转移(1+1) 模拟手动故障转移的目的有以下几点: 测试群集是否能正常故障转移 测试修改端口是否能同步到备节点 测试禁用full-text和Browser服务 ...

  5. SQL Server AlwaysOn 故障转移

    目的: a) AlwaysOn 可用性组功能是一个提供替代数据库镜像的企业级方案的高可用性和灾难恢复解决方案. b) 当数据库服务器SQL1出现故障宕机时,可以通过AlwaysOn可用性组,自动故障转 ...

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

    1      配置MYSQL主备同步 1.1    测试环境 mysql版本:5.6.24: 操作系统内核版本:Linux-3.13-0-32 主数据库IP:192.168.10.3: 主数据库名:d ...

  7. atlas+mysql主主集群实现读写分离

     atlas+mysql主主集群实现读写分离 前言: 目前线上系统数据库采用的是主主架构.其中一台主仅在故障时切换使用,(仅单台服务器对外提供服务,当一台出现问题,切换至另一台).该结构很难支撑较大并 ...

  8. MySQL for OPS 09:MHA + Atlas 实现读写分离高可用

    写在前面的话 前面做了 MHA 高可用,但是存在这样一个问题,我们花了 4 台机器,但是最终被利用起来的也就一台,主库.这样硬件利用率才 25%,这意味着除非发生故障,不然其他几台机器都是摆设.明显的 ...

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

    LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1          配置MYSQL主备同步…. 2 1.1       测试环境… 2 1.2       配置主数据库… 2 1.2.1  ...

随机推荐

  1. 线段树优化建图(cf787d, 2019Wannafly Winter Camp Day7 Div1 E)

    线段树优化建图,用于区间到区间建边时降低空间复杂度 建立两颗线段树,一颗in, 代表进入这个区间,一颗out,代表从这个区间出去 in树从父亲向儿子建边,代表宏观进入整个区间,不向下寻找 out树从儿 ...

  2. 通过url在两个页面之间传值

    今天开发遇到一个需要通过url传值才能解决的问题,就查了一下资料 一下是整理的结果: 假如需要把a页面的值传到b页面 a页面代码 <script type="text/javascri ...

  3. Ubuntu解压windows下的.zip文件出现乱码的解决办法

    乱码类似这样的:╫╩┴╧╖┤╤▌▓т╒╛╦┘╢╚│ 这个主要是因为zip文件对文件名的编码默认为当前环境的locale,如在windows下压缩的zip文件,在linux下其中的中文名便会乱码.这是z ...

  4. 使用SQL访问MongoDB

    使用SQL访问MongoDB 简介 使用SQL访问MongoDB有多种解决方案,就我所知的,除了今天要介绍的MongoDB Connector for BI外,还有Studio 3T,但后者只有在企业 ...

  5. JAVA企业级开发-session,cookie(13)

    一. jsp jsp: java server pager        .java动态生成网页的一门技术 使用servlet生成网页时候遇到的问题,为什么使用jsp? 在servlet里面书写htm ...

  6. lightoj 1027【数学概率】

    #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e2+10; int ma ...

  7. 51nod 1278【贪心】

    主要这道题没有包含的情况,所以直接搞个左端,然后对于每个二分求一下>right的最近的位置j,那么ans就会增加 j 以后的: #include <cstdio> #include ...

  8. MQ简介1

    站在巨人的肩膀上 关于消息队列的使用 一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息 ...

  9. [题解]luogu_P2613有理数取余

    #include<bits/stdc++.h> #define ll long long using namespace std; ; inline int read(){ ,fix=;c ...

  10. Zynq7000开发系列-1(Vivado HLx 2016.4下载及安装)

    一.下载 1.访问Xilinx官方网站:www.xilinx.com,注册帐号并完善个人信息 2.点击以下选项进入下载页面:Support -> Downloads & Licensin ...