《Mycat学习笔记》 第二篇. MySql 读写分离与日志分析——主从多结点

1    环境说明

接上篇环境   《Mycat学习笔记》 第一篇. MySql 读写分离与日志分析——主从单结点 http://www.cnblogs.com/kaye0110/p/5134588.html

增加一套 mysql 实例,端口为3308 ,通过Binlog方式同步主机情况

localhost : 3306 主机,    在mycat 中配置为 writehost 1

localhost : 3307 从机 a ,在mycat 中配置为 readhost

localhost : 3308 从机 b ,在mycat 中配置为 writehost 2

2    MyCat 配置

基本配置参考上篇,差异在于 switchType 和 balance  和 心跳监控语句

根据参数说明,其实在此处配置readhost已无意义

switchType属性

-  1 表示不自动切换-   1 默认值,自动切换

-  2 基于MySQL主从同步的状态决定是否切换

心跳语句为 show slave status

-  3 基于MySQL galera cluster的切换机制(适合集群)(1.4.1)

心跳语句为 show status like ‘wsrep%’

balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
  writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
  <heartbeat>show slave status</heartbeat>

  <!-- can have multi write hosts -->
  <writeHost host="hostM1" url="localhost:3306" user="root" password="root123">
  <!-- can have multi read hosts -->
    <readHost host="hostS1" url="localhost:3307" user="root" password="root123" />
  </writeHost>

  <writeHost host="hostM2" url="localhost:3308" user="root" password="root123"></writeHost>

</dataHost>

3    基本SQL操作验证

 直接看下insert 操作的日志,目前数据是直接进入了3306端口的主机了。

01/17 10:53:58.596 DEBUG [$_NIOREACTOR-1-RW] (ServerQueryHandler.java:56) -ServerConnection [id=1, schema=TESTDB, host=0:0:0:0:0:0:0:1, user=test,txIsolation=3, autocommit=true, schema=TESTDB]insert into aaa (id,context) values (7,‘ insert by M1‘)

01/17 10:53:58.601 DEBUG [$_NIOREACTOR-1-RW] (NonBlockingSession.java:113) -ServerConnection [id=1, schema=TESTDB, host=0:0:0:0:0:0:0:1, user=test,txIsolation=3, autocommit=true, schema=TESTDB]insert into aaa (id,context) values (7,‘ insert by M1‘), route={
1 -> dn1{insert into aaa (id,context) values (7,‘ insert by M1‘)}
} rrs

01/17 10:53:58.601 DEBUG [$_NIOREACTOR-1-RW] (MySQLConnection.java:445) -con need syn ,total syn cmd 1 commands SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;schema change:false con:MySQLConnection [id=1, lastTime=1452999238601, user=root, schema=mycat_sync_test, old shema=mycat_sync_test, borrowed=true, fromSlaveDB=false, threadId=43, charset=utf8, txIsolation=0, autocommit=true, attachment=dn1{insert into aaa (id,context) values (7,‘ insert by M1‘)}, respHandler=SingleNodeHandler [node=dn1{insert into aaa (id,context) values (7,‘ insert by M1‘)}, packetId=0], host=localhost, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]

再看下select 操作的日志 ,数据从M1 结点获取,即为3306口的Mysql主机

01/17 10:54:04.466 DEBUG [$_NIOREACTOR-1-RW] (ServerQueryHandler.java:56) -ServerConnection [id=1, schema=TESTDB, host=0:0:0:0:0:0:0:1, user=test,txIsolation=3, autocommit=true, schema=TESTDB]select * from aaa

01/17 10:54:04.467 DEBUG [$_NIOREACTOR-1-RW] (EnchachePool.java:70) -SQLRouteCache hit cache ,key:TESTDBselect * from aaa

01/17 10:54:04.467 DEBUG [$_NIOREACTOR-1-RW] (NonBlockingSession.java:113) -ServerConnection [id=1, schema=TESTDB, host=0:0:0:0:0:0:0:1, user=test,txIsolation=3, autocommit=true, schema=TESTDB]select * from aaa, route={
1 -> dn1{SELECT *
FROM aaa
LIMIT 100}
} rrs
01/17 10:54:04.467 DEBUG [$_NIOREACTOR-1-RW] (PhysicalDBPool.java:452) -select read source hostM1 for dataHost:localhost1

01/17 10:54:04.468 DEBUG [$_NIOREACTOR-1-RW] (MySQLConnection.java:445) -con need syn ,total syn cmd 1 commands SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;schema change:false con:MySQLConnection [id=3, lastTime=1452999244468, user=root, schema=mycat_sync_test, old shema=mycat_sync_test, borrowed=true, fromSlaveDB=false, threadId=38, charset=utf8, txIsolation=0, autocommit=true, attachment=dn1{SELECT *
FROM aaa
LIMIT 100}, respHandler=SingleNodeHandler [node=dn1{SELECT *
FROM aaa
LIMIT 100}, packetId=0], host=localhost, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]

4    主机下线,读写验证

通过Windows 服务停止Mysql 主机 3306 的服务,开始验证Mycat 主从自动切换效果。

 

数据库SQL验证,前两次查询时直接返回异常,第三次已能正常返回数据

mysql> select * from aaa;
ERROR 1184 (HY000): Connection refused: no further information
mysql> select * from aaa;
ERROR 1184 (HY000): Connection refused: no further information
mysql> select * from aaa;
+----+----------------+
| id | context |
+----+----------------+
| 1 | hello 1 |
| 2 | hello 2 |
| 3 | hello3 |
| 4 | hello4 |
| 5 | hell world5 |
| 6 | new mysql 3308 |
| 7 | insert by M1 |
+----+----------------+
7 rows in set (0.00 sec)

再来看下logs/mycat.log 日志文档

还是从dn1获取数据,不过已经改从hostM2取数了。

01/17 11:09:04.975 DEBUG [$_NIOREACTOR-1-RW] (ServerQueryHandler.java:56) -ServerConnection [id=1, schema=TESTDB, host=0:0:0:0:0:0:0:1, user=test,txIsolation=3, autocommit=true, schema=TESTDB]select * from aaa
01/17 11:09:04.980 DEBUG [$_NIOREACTOR-1-RW] (EnchachePool.java:76) -SQLRouteCache miss cache ,key:TESTDBselect * from aaa
01/17 11:09:05.110 DEBUG [$_NIOREACTOR-1-RW] (EnchachePool.java:59) -SQLRouteCache add cache ,key:TESTDBselect * from aaa value:select * from aaa, route={
1 -> dn1{SELECT *
FROM aaa
LIMIT 100}
}
01/17 11:09:05.111 DEBUG [$_NIOREACTOR-1-RW] (NonBlockingSession.java:113) -ServerConnection [id=1, schema=TESTDB, host=0:0:0:0:0:0:0:1, user=test,txIsolation=3, autocommit=true, schema=TESTDB]select * from aaa, route={
1 -> dn1{SELECT *
FROM aaa
LIMIT 100}
} rrs
01/17 11:09:05.113 DEBUG [$_NIOREACTOR-1-RW] (PhysicalDBPool.java:452) -select read source hostM2 for dataHost:localhost1
01/17 11:09:05.114 DEBUG [$_NIOREACTOR-1-RW] (MySQLConnection.java:445) -con need syn ,total syn cmd 1 commands SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;schema change:false con:MySQLConnection [id=14, lastTime=1453000145114, user=root, schema=mycat_sync_test, old shema=mycat_sync_test, borrowed=true, fromSlaveDB=false, threadId=10, charset=utf8, txIsolation=0, autocommit=true, attachment=dn1{SELECT *
FROM aaa
LIMIT 100}, respHandler=SingleNodeHandler [node=dn1{SELECT *
FROM aaa
LIMIT 100}, packetId=0], host=localhost, port=3308, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]

同时mycat 出现警告,通知hostM2切为主机,hostS1失效。

01/17 11:09:17.412 WARN [$_NIOREACTOR-0-RW] (MySQLDetector.java:139) -found MySQL master/slave Replication err !!! DBHostConfig [hostName=hostM2, url=localhost:3308]error reconnecting to master ‘[email protected]:3306‘ - retry-time: 60 retries: 86400
01/17 11:09:17.413 DEBUG [$_NIOREACTOR-1-RW] (PhysicalDatasource.java:403) -release channel MySQLConnection [id=11, lastTime=1453000157394, user=root, schema=mycat_sync_test, old shema=mycat_sync_test, borrowed=true, fromSlaveDB=true, threadId=53, charset=utf8, txIsolation=0, autocommit=true, attachment=null, respHandler=null, host=localhost, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
01/17 11:09:17.413 WARN [$_NIOREACTOR-1-RW] (MySQLDetector.java:139) -found MySQL master/slave Replication err !!! DBHostConfig [hostName=hostS1, url=localhost:3307]error reconnecting to master ‘[email protected]:3306‘ - retry-time: 60 retries: 86400
01/17 11:09:18.418 INFO [$_NIOConnector] (AbstractConnection.java:458) -close connection,reason:java.net.ConnectException: Connection refused: no further information ,MySQLConnection [id=0, lastTime=1453000157394, user=root, schema=mycat_sync_test, old shema=mycat_sync_test, borrowed=false, fromSlaveDB=false, threadId=0, charset=utf8, txIsolation=0, autocommit=true, attachment=null, respHandler=null, host=localhost, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
01/17 11:09:18.418 INFO [$_NIOConnector] (SQLJob.java:111) -can‘t get connection for sql :show slave status
01/17 11:09:18.418 INFO [$_NIOConnector] (PhysicalDatasource.java:373) -not ilde connection in pool,create new connection for hostM1 of schema mycat_sync_test

通过Mycat数据库insert 操作验证

mysql> insert into aaa (id,context) values (8,‘insert by M2‘);
Query OK, 1 row affected (0.01 sec)

mysql> select * from aaa;
+----+----------------+
| id | context |
+----+----------------+
| 1 | hello 1 |
| 2 | hello 2 |
| 3 | hello3 |
| 4 | hello4 |
| 5 | hell world5 |
| 6 | new mysql 3308 |
| 7 | insert by M1 |
| 8 | insert by M2 |
+----+----------------+
8 rows in set (0.00 sec)

再来看下物理机 3307 的情况,查询无最新数据

mysql> use mycat_sync_test
Database changed
mysql> select * from aaa;
+----+----------------+
| id | context |
+----+----------------+
| 1 | hello 1 |
| 2 | hello 2 |
| 3 | hello3 |
| 4 | hello4 |
| 5 | hell world5 |
| 6 | new mysql 3308 |
| 7 | insert by M1 |
+----+----------------+
7 rows in set (0.00 sec)

再来看下物理机 3308 M2 的情况,查询有最新数据,说明mycat 自动切换正常。

mysql> use mycat_sync_test
Database changed
mysql> select * from aaa;
+----+----------------+
| id | context |
+----+----------------+
| 1 | hello 1 |
| 2 | hello 2 |
| 3 | hello3 |
| 4 | hello4 |
| 5 | hell world5 |
| 6 | new mysql 3308 |
| 7 | insert by M1 |
| 8 | insert by M2 |
+----+----------------+
8 rows in set (0.00 sec)

5    MyCat 监控管理功能

通过9066端口登陆MyCat管理功能 

mysql -u test -ptest -P 9066

mysql> show @@datasource;
+----------+--------+-------+-----------+------+------+--------+------+------+--
-------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE |
+----------+--------+-------+-----------+------+------+--------+------+------+---------+
| dn2 | hostM1 | mysql | localhost | 3306 | W | 0 | 0 | 1000 |0 |
| dn2 | hostM2 | mysql | localhost | 3308 | W | 0 | 8 | 1000 |161 |
| dn2 | hostS1 | mysql | localhost | 3307 | R | 0 | 8 | 1000 |137 |
| dn1 | hostM1 | mysql | localhost | 3306 | W | 0 | 0 | 1000 |0 |
| dn1 | hostM2 | mysql | localhost | 3308 | W | 0 | 8 | 1000 |161 |
| dn1 | hostS1 | mysql | localhost | 3307 | R | 0 | 8 | 1000 |137 |
+----------+--------+-------+-----------+------+------+--------+------+------+---------+
6 rows in set (0.02 sec)

6    补充说明

回头还要验证下主从恢复功能

另有一篇文章也有提到可以参考:http://www.2cto.com/database/201511/448344.html

本篇完。

时间: 2024-10-25 20:23:40

《Mycat学习笔记》 第二篇. MySql 读写分离与日志分析——主从多结点的相关文章

java学习笔记 第二篇 核心技术(二)

第十四章 集合类 集合类用来存放对象的引用.继承关系如下图: 14.1 Collection 接口 是层次结构中的根接口,构成Collection的单位称为元素.Collection接口不能直接使用,但该接口提供了添加元素.删除元素.管理数据的方法. Collection接口常用方法: 14.2 List 集合 包括List接口以及List集合的所有实现类.List集合中的元素允许重复,各元素循序就是对象插入的顺序 1.List接口,两个重要方法: get(int index): 获取指定索引位

js学习笔记第二篇

Js笔记整理 1.StringAPI a)        大小写转换:str.toUpperCase();str.toLowerCase(); b)        获取指定位置字符: Str[i]--->倒数第二个str[str.length-2] str.charAt(i) str.charCodeAt(i);返回字符的Unicode吗? c)  查找关键字的位置: I.var i=str.indexOf(“kword”[,starti]);如果找不到返回-1,starti默认为0 Ii va

Android学习笔记(第二篇)View中的五大布局

PS:人不要低估自己的实力,但是也不能高估自己的能力.凡事谦为本... 学习内容: 1.用户界面View中的五大布局... i.首先介绍一下view的概念   view是什么呢?我们已经知道一个Activity是Android的显示层,但是Activity是不能直接显示在屏幕上的,它也像JSP那样,显示的东西是html,那么Android也不例外,Activity是一个抽象的壳子,而显示的东西就是view或者是viewgroup(图形用户组件)....   有了这个概念,我们就清楚view是如何

Node 之 Express 学习笔记 第二篇 Express 4x 骨架详解

周末,没事就来公司加班继续研究一下Express ,这也许也是单身狗的生活吧. 1.目录结构: bin, 存放启动项目的脚本文件 node_modules, 项目所有依赖的库,以及存放 package.json 中安装的模块,当你在 package.json 添加依赖的模块并安装后,存放在这个文件夹下 public,静态文件(css,js,img) routes,路由文件(MVC中的C,controller) views,页面文件(jade模板),后期打算换成 Ejs 模板搞搞 package.

《Mycat学习笔记》 第三篇. MySql 主从同步异常后,主从切换

1)系统环境说明 MySql 5.5 主从节点 127.0.0.1:3306   主结点,为验证主从切换效果,手动停止服务 127.0.0.1: 3307    从结点 1 127.0.0.1:338     从结点 2 ,为验证主从切换效果,在主结点停止后,新增两个记录. MyCat 1.5 schema.xml 配置 具体配置说明,参考上篇: <Mycat学习笔记> 第二篇. MySql 读写分离与日志分析——主从多结点 <dataHost name="localhost1

MySQL学习笔记之十:使用mysql-proxy实现MySQL读写分离

MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力. 本文使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上.对于多节点slave集群,还可以起到负载均衡的效果. 一.准备实验环境 MySQL的主从复制架构搭建详见http://9124573.bl

MyCat 学习笔记 第十篇.数据分片 之 ER分片

1 应用场景 这篇来说下mycat中自带的er关系分片,所谓er关系分片即可以理解为有关联关系表之间数据分片.类似于订单主表与订单详情表间的分片存储规则. 本文所说的er分片分为两种: a. 依据主键进行数据分片,验证发现主表数据保存在第1个datanode中,子表数据根据分片规则存储. b. 依据分片关键字段进行分片,验证发现主表与子表根据分片规则存储,且保存在相同的分片内. 接下来,可以下实际配置与数据验证 2 环境说明 参考  <MyCat 学习笔记>第六篇.数据分片 之 按月数据分片 

《MyCat 学习笔记》第八篇.数据分片 之 求摸运算分片

1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值取摸应该是最简单的一种. 优点:数据离散概率较为平均,可以有效的提高应用的数据吞吐. 缺点:比较明显,后期数据运维与迁移比较困难.好在Mycat有对应的解决方案,具体后期验证或可直接参考Mycat权威指南相应章节. 2 环境说明 参考  <MyCat 学习笔记>第六篇.数据分片 之 按月数据分片  http://www.cnblogs.com/kaye0110/p/5160826.html 3 参数配置 3.1 server.xm

haproxy+keepalived+mycat+mysql (读写分离)

描述: 架构方案: mysql (master/slave) --gtid 方式主备(pos 也可) mycat (master/slave) --xinted 插件时间主备模式 haproxy (master/slave) --keepalived 自动切换 --keepalived和haproxy必须装在同一台机器上, keepalived负责为该服务器抢占vip(虚拟ip),抢占到vip后,对该主机的访问可以通过原来的ip(10.118.242..214)访问,也可以直接通过vip(10.