聊聊ShardingSphere的主从路由

举报
周杰伦本人 发表于 2022/11/29 17:35:33 2022/11/29
【摘要】 聊聊ShardingSphere的主从路由本篇文章源码基于4.0.1版本前几篇文章中我们讲了分片路由的流程,这篇文章我们看一看分片主从路由的流程又是怎样的通过StatementRoutingEngine的route()方法我们可以看出,在执行完分片路由后进行主从路由 public SQLRouteResult route(final String logicSQL) { ...

聊聊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机制实现的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。