MySQL的replication是如何做到读写分离的

引言

最近在排查数据库连接问题的时候,突然发现jdbcurl使用的是 jdbc:mysql:replication://
对此产生了好奇,所以想要看一下这种连接是如何做到读写分离的

环境说明

数据库连接池:druid 1.1.9
数据库驱动包:5.1.45 com.mysql.jdbc.ReplicationDriver
MySQL:5.7
mybatis:3.4.6

我的疑问

  1. 数据库读写分离获取连接肯定是不同的,这个连接的选择是druid做的还是MySQLDriver做的?
  2. 主/从连接是什么时候进行的选择?

结论写在前面

问题1 数据库读写分离获取连接肯定是不同的,这个连接的选择是druid做的还是MySQLDriver做的?

实际上这个选择是由druid和MySQLdriver一起做的。

ReplicationDriver:
ReplicationDriver中分为两个连接池,一个是主库连接池,一个是从库连接池
通过readOnly属性去判定走主库(false)还是从库(true)

那么如何去修改这个readOnly属性呢?

druid中:
需要自己创建一个proxyFilter,
在执行select语句的时候readOnly设置为true;
在执行update语句的时候readOnly设置为false;

问题2 主/从连接是什么时候进行的选择?

这部分还没找到对应的源码暂时还不确定是在哪执行的,姑且判定的范围是 com.mysql.jdbc.PreparedStatement#executeInternal 前

流程分析

初始化线程池

  1. druid:首先加载jdbc相关配置;
  2. druid:尝试创建连接池的数据库连接(DruidDataSource),设置proxyFilter和filter
  3. ReplicationDriver:创建数据库连接,这里的连接是代理对象 ReplicationConnectionProxy(主从两种生成方案)
  4. druid:对创建的数据连接进行检测 testOnBorrow,removeAbandoned,defaultAutoCommit
  5. druid:检测没有问题后放入连接池供后续使用

执行一个SQL(这里没有看全,只针对主从选择大致看了一下)

  1. druid:从线程池中获取一个逻辑连接;
  2. druid:对SQL进行语法分析;
  3. druid:执行proxyfilter和filter的before方法(readOnly就是在这步设置的);
  4. ReplicationDriver:执行SQL并拿到结果;
  5. druid:执行filter的after方法;
  6. druid:拿到结果;

总结

以现有的了解来看,主从分离是需要通过 druid的proxy + MySQL的ReplicationDriver 一起配置才能实现读写分离
并没有尝试直接使用ReplicationDriver进行读写分离,这也是个可以尝试的方案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值