互联网架构中的负载均衡
计算机的资源在分配和使用有两大思维:效率和公平。比如负载均衡技术就体现了公平思维。
负载均衡(Load Balance)是集群和分布式系统中必须考虑的关键因素,它通常是指把数据或请求均匀分摊到操作单元上,它的灵魂就是“均匀”。
负载均衡主要分为硬件负载均衡和软件负载均衡两大类。我在某央企工作时,使用的F5就是硬件负载均衡(记得均衡策略是轮询),本文主要谈软件负载均衡。
说到负载均衡,我第一反应是Nginx,其实互联网架构中到处体现着负载均衡的设计。
四层架构
上图是常见的互联网架构,它的最大特点就是分层,每层可以水平扩展。在上层访问下层的时候,就会用到用负载均衡技术。
1. 客户端层 -> 反向代理层
上网的第一步骤,就是解析域名,得到IP,这通过DNS实现。DNS-server对于一个域名,可能配置多个IP,此时的负载均衡是通过DNS轮询实现的,会轮询返回IP,保证每个IP访问是均匀的。这些IP就是Nginx的外网IP。
2. 反向代理层 -> 站点层
这一步骤的负载均衡是通过Nginx实现的。通过修改nginx.conf可以配置多种负载均衡策略。
常见的Nginx负载均衡策略有以下三种:
- 轮询(Round Robin,RR)
- 随机(Random)
- 权重轮询(Weighted Round Robin,WRR)
- 最少连接(Least Connections):那个web-server连接少,就路由到哪个web-server
- 源地址哈希(Source hashing):只要IP是均匀的,那么请求理论上也是均衡的。
3.站点层 -> 服务层
4.服务层->数据层:
请求是否均衡取决于数据分布是否均衡。
在数据量很大的时候,数据层(db和cache)会做水平切分。所以数据层的负载均衡,分为数据的均衡和请求的均衡。
数据的均衡是指,水平切分后的每个服务,数据量是差不多的
请求的均衡是指,水平切分后的每个服务,请求量是差不多的。
数据的均衡提现在水平切分的策略上,最常见的有两种:
A)按照range水平切分
这种切分的优点:实现简单, 数据均衡,易于扩展
缺点:请求的负载不够均衡。可能在某个range中服务请求压力比较大。
B)根据id做哈希
这种切分的优点:实现简单,数据均衡,请求均衡
缺点:不易扩展,增加或减少机器,需要rehash,伴随数据迁移。可以利用一致性哈希来优化这种方案。
5.总结:
客户端层->反向代理层:DNS轮询
反向代理层->站点层:Nginx
站点层->服务层:服务连接池
服务层->数据层:请求是否均衡依据数据分布是否均衡,数据层的数据切分方式,常见的有按照范围水平切分和hash水平切分。
Thanks a million:一分钟了解负载均衡的一切