分布式系统的负载均衡

一、 什么是负载均衡?什么是负载均衡?
记得第一次接触 Nginx 是在实验室 , 那时候在服务器部署网站需要用 Nginx。Nginx 是一个服务组件 , 用来反向代理、负载平衡和 HTTP 缓存等 。那么这里的 负载均衡 是什么?
负载均衡(LB , Load Balance) , 是一种技术解决方案 。用来在多个资源(一般是服务器)中分配负载 , 达到最优化资源使用 , 避免过载 。

分布式系统的负载均衡

文章插图
 
资源 , 相当于每个服务实例的执行操作单元 , 负载均衡就是将大量的数据处理操作分摊到多个操作单元进行执行 , 用来解决互联网分布式系统的大流量、高并发和高可用的问题 。那什么是高可用呢?
二、什么是高可用?首先了解什么是高可用?
【分布式系统的负载均衡】这是 CAP 定理是分布式系统的基础 , 也是分布式系统的 3 个指标:
  1. Consistency(一致性)
  2. Availability(可用性)
  3. Partition tolerance(分区容错性)
那高可用(High Availability)是什么?高可用 , 简称 HA , 是系统一种特征或者指标 , 通常是指 , 提供一定性能上的服务运行时间 , 高于平均正常时间段 。反之 , 消除系统服务不可用的时间 。
衡量系统是否满足高可用 , 就是当一台或者多台服务器宕机的时候 , 系统整体和服务依然正常可用 。
举个例子 , 一些知名的网站保证 4 个 9 以上的可用性 , 也就是可用性超过 99.99% 。那 0.01% 就是所谓故障时间的百分比 。比如电商网站有赞 , 服务不可用会造成商家损失金钱和用户 。那么在提高可用性基础上同时 , 对系统宕机和服务不可用会有补偿 。
分布式系统的负载均衡

文章插图
 
比如下单服务 , 可以使用带有负载均衡的多个下单服务实例 , 代替单一的下单服务实例 , 即使用冗余的方式来提高可靠性 。
总而言之 , 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一 。一般通过负载均衡 , 冗余同一个服务实例的方式 , 解决分布式系统的大流量、高并发和高可用的问题 。负载均衡核心关键:在于是否分配均匀 。
三、常见的负载均衡案例
分布式系统的负载均衡

文章插图
 
场景1:微服务架构中 , 网关路由到具体的服务实例 hello:
  • 两个相同的服务实例 hello service  , 一个端口 8000  , 另一个端口 8082
  • 通过 Kong 的负载均衡 LB 功能 , 让请求均匀的分发到两个 hello 服务实例
  • Kong 的负载均衡策略算法很多:默认 weighted-round-robin 算法 , 还有 consumer: consumer id 作为 hash 算法输入值等

分布式系统的负载均衡

文章插图
 
场景2:微服务架构中 , A 服务调用 B 服务的集群 。通过了 Ribbon 客户端负载均衡组件:
  • 负载均衡策略算法并不高级 , 最简单的是随机选择和轮循
四、互联网分布式系统解决方案
分布式系统的负载均衡

文章插图
 
常见的互联网分布式系统架构分为几层 , 一般如下:
  • 客户端层:比如用户浏览器、App 端
  • 反向代理层:技术选型 Nignx 或者 F5 等
  • Web 层:前后端分离场景下 ,  Web 端可以用 NodeJS 、 RN 、Vue
  • 业务服务层:用 JAVA 、Go , 一般互联网公司 , 技术方案选型就是 SC 或者 Spring Boot + Dubbo 服务化
  • 数据存储层:DB 选型 MySQL  , Cache 选型 redis  , 搜索选型 ES 等
一个请求从第 1 层到第 4 层 , 层层访问都需要负载均衡 。即每个上游调用下游多个业务方的时候 , 需要均匀调用 。这样整体系统来看 , 就比较负载均衡
第 1 层:客户端层 -> 反向代理层 的负载均衡
客户端层 -> 反向代理层的负载均衡如何实现呢?
答案是:DNS 的轮询 。DNS 可以通过 A (Address , 返回域名指向的 IP 地址)设置多个 IP 地址 。比如这里访问 bysocket.com 的 DNS 配置了 ip1 和 ip2。为了反向代理层的高可用 , 至少会有两条 A 记录 。这样冗余的两个 ip 对应的 nginx 服务实例 , 防止单点故障 。


推荐阅读