【死磕Sharding-jdbc】-读写分离

有内涵、有价值的文章第一时间送达!

读写分离支持项

提供了一主多从的读写分离配置,可独立使用,也可配合分库分表使用。

同一线程且同一数据库连接内,如有写入操作,以后的读操作均从主库读取,用于保证数据一致性。

Spring命名空间。

基于Hint的强制主库路由。

读写分离不支持范围

主库和从库的数据同步。

主库和从库的数据同步延迟导致的数据不一致。

主库双写或多写。

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

源码分析

先执行 模块中的的SQL脚本 ,这里有读写分离测试的需要的数据库、表以及数据;

两个主数据库和;

数据库有两个从库和,这个集群体系命名为;

数据库有两个从库和,这个集群体系命名为;

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

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

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

主路由逻辑如下:

非查询SQL(SQLType.DQL != sqlType)

当前数据源在当前线程访问过主库(数据源访问过主库就会通过ThreadLocal将DMLFLAG置为true,从而路由主库)(DMLFLAG.get())

HintManagerHolder方式设置了主路由规则(HintManagerHolder.isMasterRouteOnly())

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

主从负载均衡分析

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

轮询策略

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

随机策略

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

默认策略

END

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180705G1HGU800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券