文章插图
我们都对高可用有一个基本的认识 , 其中负载均衡是高可用的核心工作 。本文将通过如下几个方面 , 让你妥妥的吃透“”负载均衡” 。
- 负载均衡是什么
- 常用负载均衡策略图解
- 常用负载均衡策略优缺点和适用场景
- 用健康探测来保障高可用
- 结语
文章插图
正如上图所示的这样 , 由一个独立的统一入口来收敛流量 , 再做二次分发的过程就是负载均衡 , 它的本质和分布式系统一样 , 是分治 。
如果大家习惯了开车的时候用一些导航软件 , 我们会发现 , 导航软件的推荐路线方案会有一个数量的上限 , 比如 3 条、5 条 。
因此 , 其实本质上它也起到了一个类似负载均衡的作用 , 因为如果只能取 Top3 的通畅路线 , 自然拥堵严重的路线就无法推荐给你了 , 使得车流的压力被分摊到了相对空闲的路线上 。
在软件系统中也是一样的道理 , 为了避免流量分摊不均 , 造成局部节点负载过大(如 CPU 吃紧等) , 所以引入一个独立的统一入口来做类似上面的“导航”的工作 。
但是 , 软件系统中的负载均衡与导航的不同在于:导航是一个柔性策略 , 最终还是需要使用者做选择 , 而前者则不同 。
怎么均衡的背后是策略在起作用 , 而策略的背后是由某些算法或者说逻辑来组成的 。
比如 , 导航中的算法属于路径规划范畴 , 在这个范畴内又细分为静态路径规划和动态路径规划 , 并且 , 在不同的分支下还有各种具体计算的算法实现 , 如 Dijikstra、A* 等 。
同样的 , 在软件系统中的负载均衡 , 也有很多算法或者说逻辑在支撑着这些策略 , 巧的是也有静态和动态之分 。
常用负载均衡策略图解
下面来罗列一下日常工作中最常见的 5 种策略 。
轮询
文章插图
这是最常用也最简单策略 , 平均分配 , 人人都有、一人一次 。大致的代码如下:
文章插图
加权轮询
文章插图
在轮询的基础上 , 增加了一个权重的概念 。权重是一个泛化后的概念 , 可以用任意方式来体现 , 本质上是一个能者多劳思想 。
比如 , 可以根据宿主的性能差异配置不同的权重 。大致的代码如下:
【负载均衡?看这一篇就够了】int matchedIndex = -1;
int total = 0;
for (int i = 0; i < servers.Length; i++)
{
servers[i].cur_weight += servers[i].weight;//①每次循环的时候做自增(步长=权重值)
total += servers[i].weight;//②将每个节点的权重值累加到汇总值中
if (matchedIndex == -1 || servers[matchedIndex].cur_weight < servers[i].cur_weight) //③如果 当前节点的自增数 > 当前待返回节点的自增数 , 则覆盖 。
{
matchedIndex = i;
}
}
servers[matchedIndex].cur_weight -= total;//④被选取的节点减去②的汇总值 , 以降低下一次被选举时的初始权重值 。
return servers[matchedIndex];
这段代码的过程如下图的表格 。"()"中的数字就是自增数 , 即代码中的 cur_weight 。
文章插图
值得注意的是 , 加权轮询本身还有不同的实现方式 , 虽说最终的比例都是 2:1:2 。
但是在请求送达的先后顺序上可以有所不同 。比如「5-4 , 3 , 2-1」和上面的案例相比 , 最终比例是一样的 , 但是效果不同 。
「5-4 , 3 , 2-1」更容易产生并发问题 , 导致服务端拥塞 , 且这个问题随着权重数字越大越严重 。
例子:10:5:3 的结果是「18-17-16-15-14-13-12-11-10-9 , 8-7-6-5-4 , 3-2-1」
最少连接数
推荐阅读
- 高并发解决方案之负载均衡篇
- MySQL 数据库性能优化,看这篇就够了
- linux终端mysql用户操作只看这篇够了
- 求职|面试时表现不好怎么办?看这里!
- 不会vi/vim,看这一篇足矣
- MySQL单表查询看这一篇文章就够了
- 想要快速认识电脑接口,看这篇就够了
- 造型美观,性能均衡AOC战神937系列一体机评测
- 你,真的会用macOS了吗?看这就够了
- 非常全面的网桥基础知识,只看这一篇文章就足够了