[zebra源码]GroupDataSource读库的负载均衡
2021/7/17 1:05:39
本文主要是介绍[zebra源码]GroupDataSource读库的负载均衡,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
GroupDataSource的物理结构
负载均衡的对象
zebra的负载均衡是在GroupDataSource的读库 readDataSource( LoadBalanceDataSource) 中进行的, 它内部包含多个读库节点的SingleDataSource
LoadBalanceDataSource#getConnection() -> router.select(context);
关键对象DataSourceRouter 数据源路由器
负载均衡由 DataSourceRouter 数据源路由器实现具体的逻辑 => 它是个套娃
包含 中心路由、idc路由、区域路由和权重, 这几个负载均衡算法是嵌套执行的, 从范围大到小逐层进行
默认的 routerStrategy=“WeightRouter" 即 WeightDataSourceRouter 在最里层同机房范围内的多个读库是根据权重来选择的
了解更多,官方文档 zebra路由设计
区域、中心、机房,最后都会走向基于权重的路由 WeightDataSourceRouter#select()
public RouterTarget select(Set<RouterTarget> excludeTargets) { if (!this.targets.isEmpty()) { TreeSet<RouterTarget> weights = this.targets; int tmpGroupDataSourceTargetSize = this.groupDataSourceTargetSize; if (excludeTargets != null && !excludeTargets.isEmpty()) { // 需要排除某些GroupDataSourceTarget的话,就重新copy一个weights TreeSet<RouterTarget> copyWeights = new TreeSet<RouterTarget>(); tmpGroupDataSourceTargetSize = 0; for (RouterTarget routerTarget : weights) { if (excludeTargets.contains(routerTarget)) { continue; } // 先将节点先放入到排序集合中 // 假设 节点1 -> weight=2, 节点2 -> weight=3 // 则在排序树中 节点1 -> sort=2, 节点2 -> sort = 2+3 int weight = routerTarget.getWeight(); tmpGroupDataSourceTargetSize += weight; copyWeights.add(new RouterTarget(routerTarget.getId(), weight, tmpGroupDataSourceTargetSize - 1)); } weights = copyWeights; } if (weights.isEmpty() || tmpGroupDataSourceTargetSize <= 0) { return null; } // 取一个随机数 int randomNum = random.nextInt(tmpGroupDataSourceTargetSize); RouterTarget tempForSearch = new RouterTarget(null, -1, randomNum); //排序集合中最靠近随机数的entry则为目标节点 return weights.ceiling(tempForSearch); } else { return null; } } }
想要查看具体执行细节 ,可以debug 源码里 com.dianping.zebra.group.router 包下的 DataSourceRouter 单测
这篇关于[zebra源码]GroupDataSource读库的负载均衡的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享