高性能负载均衡:分类及架构
通过增加更多的服务器来提升系统整体的计算能力。高性能集群的复杂性体现在需要增加一个任务分配器,以及为任务选择一个合适的任务分配算法。任务分配器也被称为负载均衡器。不同的任务分配算法目标不一样,比如:基于负载考虑、基于性能(吞吐量、响应时间)考虑、基于计算单元考虑
常见的负载均衡系统包括:DNS负载均衡、硬件负载均衡、软件负载均衡
一、DNS负载均衡
一般用来实现地理级别的均衡,本质是DNS 解析同一个域名可以返回不同的 IP 地址。
DNS 负载均衡实现简单、成本低,但也存在粒度太粗、负载均衡算法少等缺点
优点:
- 简单、成本低:负载均衡工作交给 DNS 服务器处理,无须自己开发或者维护负载均衡设备
- 就近访问,提升访问速度:DNS 解析时可以根据来源IP,解析成距离用户最近的服务器地址,较少流量穿越
缺点:
- 更新不及时,DNS 缓存的时间比较长,修改DNS 配置后,由于缓存的原因,还会访问到错误IP
- 扩展性差,DNS 负载均衡的控制权在域名商那里,无法根据业务特点针对其做更多定制化功能和扩展特性
- 分配策略比较简单,支持的负载均衡算法少,不能区分服务器差异,无法感知后端服务器的状态
二、硬件负载均衡
通过单独的硬件设备来实现负载均衡功能,这类设备和路由器、交换机类似,可以理解为一个用于负载均衡的基础网络设备。这类设备性能强劲、功能强大,但是价格昂贵
三、软件负载均衡
常见的有 Nginx 和 LVS。Nginx 是软件的 7 层负载均衡,支持 HTTP E-mail 协议。LVS 是 linux 内核的 4 层负载均衡,和协议无关,几乎所有的应用都可以做
软件和硬件的最主要区别就在于性能,硬件负载均衡性能远远高于软件负载均衡性能
简单、便宜、灵活。但是性能没有硬件负载均衡好,功能没有硬件负载均衡强大,一般不具有防火墙和防 DDoS 攻击等安全功能
四、负载均衡算法
根据算法期望达到的目的,大体可以分为下面几类
- 任务平分类:负载均衡系统将收到的任务平均分配给服务器进行处理。平均可以是绝对数量上的平均,也可以是比例或者权重上的平均
- 负载均衡类:根据机器负载进行分配,可以是CPU 负载,连接数、I/O使用率、网卡吞吐率等
- 性能最优类:根据服务器的响应时间来进行分配任务,优先将任务分配给响应最快的机器
- Hash 类:根据任务中某些关键信息进行 Hash 运算,将相同的 Hash 值的请求分配到同一台服务器。比如源地址 Hash、目标地址Hash、session id hash、用户ID Hash 等
1. 轮询
按照顺序轮流分配到服务器上。比较简单,但是没有关注服务器本身的状态
加权轮询,可以解决不同服务器处理能力有差异的问题
2. 负载最低优先
分配当前负载最低的服务器,负载可以用不同的指标来衡量,比如:连接数、HTTP请求数、CPU负载、I/O负载。解决了轮询算法中无法感知服务器状态的问题。同时获取这些机器的指标需要一定的复杂度。比如:CPU 负载,需要以某种方式收集每个服务器的 CPU 负载,而且要确定收集的时间间隔,间隔太短容易造成频率波动,间隔太长造成峰值来的时候响应缓慢
3. 性能最优类
站在客户端的角度来分配,通过响应时间来衡量服务器的状态,优先将任务分配给处理速度最快的服务器,以此达到最快响应客户端的目的。复杂度体现在:
- 需要收集和分析每个服务器每个任务的响应时间,在大量任务处理的场景下,这种收集和分析本身也会消耗较多的性能
- 为了减少统计上的消耗,可以采取采样的方式来统计,需要确定合适的采样率,太低导致结果不准确,太高消耗性能。
- 全部统计还是采样统计,都需要选择合适的周期,没有统一的标准,需要根据实际业务进行判断或者上线之后进行调优
4. Hash 类
根据任务中某些关键信息进行Hash 运算,将相同 Hash 值的请求分配到同一台服务器上。
- 源地址Hash,适合存在事务、会话的业务
- ID Hash,比如 session id hash,同样可以实现同一个会话期间,用户每次都是访问到同一台服务器的目的
1 | https://www.infoq.cn/article/2017hongbao-weixin // 百亿级微信红包的高并发资金交易系统设计方案 |