mysql 第十七篇文章~mycat的读写分离

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 第十七篇文章~mycat的读写分离相关的知识,希望对你有一定的参考价值。

一 简介 今天咱们来聊聊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查询需求,当然这只是测试,仅供参考哦

这就是今天的成果










































































以上是关于mysql 第十七篇文章~mycat的读写分离的主要内容,如果未能解决你的问题,请参考以下文章

基于Mycat实现读写分离

Mysql+Mycat实现数据库主从同步与读写分离

Linux云计算-使用 MyCat 实现 MySQL 主从读写分离

Mysql读写分离(Mycat版)

Mysql+Mycat实现数据库主从同步与读写分离

MyCat安装及配置读写分离