聊聊ShardingSphere的主从路由
聊聊ShardingSphere的主从路由
本篇文章源码基于4.0.1版本
前几篇文章中我们讲了分片路由的流程,这篇文章我们看一看分片主从路由的流程又是怎样的
通过StatementRoutingEngine的route()方法我们可以看出,在执行完分片路由后进行主从路由
public SQLRouteResult route(final String logicSQL) {
SQLStatement sqlStatement = shardingRouter.parse(logicSQL, false);
return masterSlaveRouter.route(shardingRouter.route(logicSQL, Collections.emptyList(), sqlStatement));
}
在进行主从路由的时候会判断语句如果是查询语句并且加锁了或者不是查询语句或者当前线程中访问主数据源或者进行Hint机制强制只走主库路由就进行主库路由,否则进行从库的路由
分片主从路由数据源的选择
主库一般只有一个,很好确定
从库有多个,是怎么确定的呢?
ShardingMasterSlaveRouter的route()方法中获取从库数据源的代码片段:
actualDataSourceName = masterSlaveRule.getLoadBalanceAlgorithm().getDataSource(
masterSlaveRule.getName(), masterSlaveRule.getMasterDataSourceName(), new ArrayList<>(masterSlaveRule.getSlaveDataSourceNames()));
先获取负载均衡算法,然后获取响应的数据源
对应的是主从数据库负载均衡算法MasterSlaveLoadBalanceAlgorithm接口
负载均衡算法
MasterSlaveLoadBalanceAlgorithm接口有两个实现类,分别是随机从库负载均衡算法RandomMasterSlaveLoadBalanceAlgorithm和轮询从库负载均衡算法RoundRobinMasterSlaveLoadBalanceAlgorithm
MasterSlaveRule的构造方法中可以看出通过调用MasterSlaveLoadBalanceAlgorithmServiceLoader的newService()方法来确定负载均衡算法,MasterSlaveLoadBalanceAlgorithmServiceLoader利用的JDK的SPI机制,加载resources文件夹下的META-INF/services/org.apache.shardingsphere.spi.masterslave.MasterSlaveLoadBalanceAlgorithm文件中定义的类,正好配置的是轮询和随机这两个负载均衡算法
普通主从路由
普通主从路由MasterSlaveRouter的路由方法和分片主从路由的路由方法基本一致,也是判断是否满足主库路由,不满足就选择路由算法获取从库数据源
总结
这篇文章我们讲了ShardingSphere的主从路由的逻辑,分为分片主从路由和普通的主从路由,这两个类的路由方法整体逻辑一致,从库数据源的选择有轮询和随机两种负载均衡算法,其中负载均衡算法实例的加载是通过JDK的SPI机制实现的。
- 点赞
- 收藏
- 关注作者
评论(0)