一 简介 今天咱们来聊聊mycat的一个功能 读写分离
二 前沿: mycat的核心功能之一,读写分离的测试
三
1读写分离的需求
1 将业务的读需求定向到从库去查询,减轻主库压力
2 将业务的特殊读需求定向到主库去查询
2 读写分离要考虑的问题
1 当从库出现问题时踢出有问题的从库(从库down机或者复制停止)
2 当从库出现延迟时踢出有问题的从库(单个从库延迟),但是当从库正常时,从库节点从新提供读服务
3 当所有提供读取的从节点的从库出现问题时,查询指向主库,当从库恢复正常时,从库节点从新提供读服务
四 测试与配置
一 环境配置 与初步测试
1 修改schemal.xml配置文件
在<writeHost>标签内添加
<readHost host="readM1" url="1.1.1.2:3306" user="mycat" password="mycat"> </readHost>
<heartbeat>show slave status</heartbeat> 监控主从服务
2 登录管理服务端口9066
reload @@config 重新加载配置文件
3 登录执行服务端口8086
1 解析数据查询语句
explain select * from people
| DATA_NODE | SQL |
| db1 | SELECT * FROM people LIMIT 100 |
| db2 | SELECT * FROM people LIMIT 100 |
在这里我们也可以发现 我们搜全表数据 自动加上了limit 100
2 执行查询语句并查询日志
1 select * from people
2 过滤相关日志可发现以下内容
threadId=28911, charset=utf8, txIsolation=3, autocommit=true, attachment=db1{SELECT *
FROM people
WHERE id > 151
LIMIT 100}, respHandler=SingleNodeHandler [node=db1{SELECT *
FROM people
WHERE id > 151
LIMIT 100}, packetId=17], host=1.1.1.2, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
3 select操作解析到从库,证明读写分离完成
二 模拟故障1
1 从库stop slave
2 观察mycat日志
观察日志发现 found MySQL master/slave Replication err !!
3 执行查询并过滤相关日志
threadId=28911, charset=utf8, txIsolation=3, autocommit=true, attachment=db1{SELECT *
FROM people
WHERE id > 151
LIMIT 100}, respHandler=SingleNodeHandler [node=db1{SELECT *
FROM people
WHERE id > 151
LIMIT 100}, packetId=17], host=1.1.1.1, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
这里变成了主库IP,查询成功
4 从库 start slave
5 再次执行查询并过滤日志,发现slave继续提供读操作
三 模拟故障2
1 从库stop slave
2 从库设置延时库
3 从库start slave
4 观察mycat日志
观察日志发现 found MySQL master/slave Replication delay !!
5 执行查询并过滤相关日志
threadId=28911, charset=utf8, txIsolation=3, autocommit=true, attachment=db1{SELECT *
FROM people
WHERE id > 151
LIMIT 100}, respHandler=SingleNodeHandler [node=db1{SELECT *
FROM people
WHERE id > 151
LIMIT 100}, packetId=17], host=1.1.1.1, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
这里变成了主库IP,查询成功
6 将从库恢复正常
7 再次执行查询并过滤日志,发现slave继续提供读操作
四 特殊需求
需求说明:一些sql需要强制走主库
样例说明: /*#mycat:db_type=master*/ select * from people 根据注解选择数据源
具体说明:从mycat 1.6开始,对于一些特殊的sql语句,采用注解实现,这里的例子仅仅是一个简单的单表查询,复杂语句并未做测试
五 总结
通过测试我们可以发现,mycat完美的支持了读写需求的完全功能,通过注解可以实现特殊的sql查询需求,当然这只是测试,仅供参考哦
这就是今天的成果