欢迎光临
我们一直在努力

13. sharding-jdbc源码之读写分离

12. sharding-jdbc源码之强制路由

读写分离支持项

  • 提供了一主多从的读写分离配置,可独立使用,也可配合分库分表使用。
  • 同一线程且同一数据库连接内,如有写入操作,以后的读操作均从主库读取,用于保证数据一致性。
  • Spring命名空间。
  • 基于Hint的强制主库路由。

读写分离不支持范围

  • 主库和从库的数据同步。
  • 主库和从库的数据同步延迟导致的数据不一致。
  • 主库双写或多写。

读写分离支持项和不支持范围摘自sharding-jdbc使用指南?读写分离

源码分析

先执行sharding-jdbc-example-config-spring-masterslave模块中的的SQL脚本all_schema.sql,这里有读写分离测试的需要的数据库、表以及数据;

  • 两个主数据库dbtbl_0_master和dbtbl_1_master;
  • 数据库dbtbl_0_master有两个从库dbtbl_0_slave_0和dbtbl_0_slave_1,这个集群体系命名为dbtbl_0;
  • 数据库dbtbl_1_master有两个从库dbtbl_1_slave_0和dbtbl_1_slave_1,这个集群体系命名为dbtbl_1;

以SpringNamespaceWithMasterSlaveMain.java为入口,分析读写分离是如何实现的:

router()路由时,会尝试读写分离:

13. sharding-jdbc源码之读写分离

 

13. sharding-jdbc源码之读写分离

 

13. sharding-jdbc源码之读写分离

 

主从数据源中根据负载均衡策略获取数据源核心源码–MasterSlaveDataSource.java:

13. sharding-jdbc源码之读写分离

 

主路由逻辑如下:

  1. 非查询SQL(SQLType.DQL != sqlType)
  2. 当前数据源在当前线程访问过主库(数据源访问过主库就会通过ThreadLocal将DML_FLAG置为true,从而路由主库)(DML_FLAG.get())
  3. HintManagerHolder方式设置了主路由规则(HintManagerHolder.isMasterRouteOnly())

当前线程访问过主库后,后面的操作全部切主,是为了防止主从同步数据延迟导致写操作后,读不到最新的数据?我想应该是这样的^^

主从负载均衡分析

从对MasterSlaveDataSource.java的分析可知,如果不符合强制主路由规则,那么会根据负载均衡策略选多个slave中选取一个slave;MasterSlaveLoadBalanceStrategy接口有两个实现类:RoundRobinMasterSlaveLoadBalanceStrategyRandomMasterSlaveLoadBalanceStrategy,简单分析其实现;

轮询策略

轮询方式的实现类为RoundRobinMasterSlaveLoadBalanceStrategy,核心源码如下:

13. sharding-jdbc源码之读写分离

 

随机策略

随机方式的实现类为RandomMasterSlaveLoadBalanceStrategy,核心源码如下:

13. sharding-jdbc源码之读写分离

 

默认策略

13. sharding-jdbc源码之读写分离

 

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

未经允许不得转载:英协网 » 13. sharding-jdbc源码之读写分离

分享到: 生成海报
avatar

热门文章

  • 评论 抢沙发

    • QQ号
    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址

    登录

    忘记密码 ?

    切换登录

    注册

    我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活