高并发系列:垂直性能优化之细说负载均衡
高并发是业务发展到一定阶段必须面对的问题,那么面对高并发的问题,我们可以从哪些方面入手优化呢?
垂直性能优化 [包含整体层面的负载均衡、中间件异步化、存储优化、代码层面调优、jvm容器调优等等]
整体可用性优化 [包含服务治理、服务保护、可靠性保障、生产验证、故障演练等等]
水平扩展提升 [包含分层架构、弹性架构、服务拆分及单元化等等]
从这篇开始将对上述问题进行逐点阐述,欢迎大家一起交流讨论~
前言
性能为王。可用性和水平扩展,都要建立在性能优良的基础上才会去考虑。
性能是高并发的基础,而且涉及面极广,也是需要我们投入更多的精力去对待;同时,大部分优化点也是我们一线研发日常可以直接接触的模块。也是大厂面试的时候会经常涉及到的模块。
所以第一部分大概十几篇可能都会在垂直性能优化上。第一篇,垂直性能优化之细说集群部署和负载均衡。
从阿里架构演变来看负载均衡
我们将淘宝网的架构演进(即时通讯网[1])整理到一个滑动图里,如下图所示:
<<< 左右滑动见更多 >>>
当然,比如中台建设、上云等更高级演进就在此忽略了;
可以更清晰的看到,在集群部署和负载均衡,几乎分布在了整个演进链路上最关键的节点上:
-
当解决了本地存储的性能瓶颈,新的瓶颈出现在了web容器的单体性能上。因此,使用 nginx反向代理来实现多个web容器负载均衡 -
当数据库和tomcat都达到水平扩容,可支撑的并发大幅提升时,单体nginx代理的性能成了新的瓶颈。因此,使用 F5或LVS来实现多个nginx反向代理服务器负载均衡 -
当业务进一步发展,达到多地多机房部署,垮地域访问延迟成了新的瓶颈。因此,使用 DNS来实现地域机房间的负载均衡。
细说负载均衡方案
常见的实现方案,其实从上面的演进链路中也已经可以基本了解到各个方案适用的发展阶段和应对常见,这里再系统的总结下:
-
基于DNS的负载 -
基于硬件的负载,如F5 -
基于软件的负载,如Nginx/Squid
DNS负载
<<< 左右滑动见更多 >>>
头条号[2] 知乎[3]
上面两副图,可以看到DNS的解析过程和负载均衡的原理。天然的优势就是配置简单,实现成本非常低,无需额外的开发和维护工作。
而缺点也比较明显:
-
目前的DNS是多级解析的,每一级都可能缓存。所以生效不及时。 -
不能按服务器的处理能力来分配负载。DNS负载均衡采用的是简单的轮询算法,不能区分服务器之间的差异和运行状态,不灵活 -
额外的网络问题。为了使本DNS服务器和其他DNS服务器及时交互,保证数据及时更新,一般都要将刷新时间设置的较小,可能造成流量增大。
基于硬件的负载均衡
「F5 Network Big-IP」 是一个网络设备,可以简单的认为是一个网络交换机一类的东西,性能非常好,百万级TPS。
性能优良、功能强大,多种均衡算法都可以支持,还有防火墙等安全功能。但,非常贵,一般小公司可用不起。
基于软件的负载均衡
软件负载均衡都是以TCP/IP协议的OSI模型的运用:(即时通讯网[4])根据OSI模型可将负载均衡分为:
-
二层负载均衡(一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应); -
三层负载均衡(一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应); -
四层负载均衡(在三次负载均衡的基础上,用 ip+port 接收请求,再转发到对应的机器); -
七层负载均衡(根据虚拟的url或是IP,主机名接收请求,再转向相应的处理服务器)。
常见的其实只有4层和7层负载。
四层和七层的横向对比
四层 | 七层 | |
---|---|---|
原理 | 基于IP+端口 | 基于虚拟的URL或主机IP |
分析内容 | IP层及TCP/UDP层 | 应用层信息,如HTTP协议URI或Cookie信息 |
复杂度 | 架构简单、管理容易、问题定位方便 | 比较复杂 |
灵活性 | 仅支持基于网络层的需求转发 | 可对所有跟服务端的请求进行修改 |
安全性 | 无法直接抵御网络攻击 | 更容易抵御来自网络的攻击 |
效率 | 基于更底层设置,效率高 | 需要更多的资源损耗 |
常见的负载均衡算法
算法名 | 优点 | 缺点 |
---|---|---|
轮询 | 简单高效,兼顾所有节点 | 集群性能瓶颈更多的会受性能差的服务器影响 |
随机 | 同轮询类似 | |
一致性hash | 相同来源请求落点相同,有利于灰度发布等功能 | 遇到热点会对节点有冲击;节点故障影响上游调用 |
加权轮询 | 将机器性能考虑在内,集群性能最大化 | 生产环境复杂多变,无法动态调整权重,只能粗略预先优化 |
动态连接数、最快响应 | 动态,根据节点状况实时变化 | 增大的复杂度和资源消耗 |
广义的负载均衡
上述内容基本都是基于服务级别来叙述的负载均衡的概念。其实,负载被运用的场景还很多,比如,服务端rpc选址、以及一些中间件的投递和请求分发,再有一些弹性架构下的弹性路由,单元化下的单元路由,其实也是更高层面的负载均衡。相应的,也有很多特定的负载算法,比如rpc中的本地优先负载等等。
结束语
负载均衡是业务发展到一定阶段必经的优化过程。掌握负载相关的原理和算法,对我们日常业务问题排查甚至是架构设计都可以起到很好的帮助。
本篇是高并发系列中垂直性能优化的第一篇,从服务的整体优化为出发点叙述了主要技术手段--负载均衡的主要内容,下一篇,将从中间件的应用入手,再聊性能优化。欢迎大家来一起交流。
Reference
从100到1000万高并发的架构演进之路: http://www.52im.net/thread-2665-1-1.html
[2]头条号: 程序员小新人学习
[3]知乎: foxgab:DNS如何实现全局负载均衡
[4]一篇读懂分布式架构下的负载均衡技术: http://www.52im.net/thread-2494-1-1.html