干货分享 | 分布式系统的负载均衡

2019-08-08

1  了解负载均衡

      记得第一次接触Nginx是在实验室,那时候在服务器部署网站需要用NginxNginx是一个服务组件,用来反向代理、负载平衡和HTTP缓存等。那么这里的负载均衡是什么?

      负载均衡简称LBLoad Balance),确切的说是一种技术解决方案,用于在多个资源(泛指服务器)中分配负载,达到最优化资源使用,避免设备过载。

      资源等于每个服务实例的执行操作单元,负载均衡就是将大量的数据处理操作分摊到多个操作单元进行执行,用来解决互联网分布式系统的大流量、高并发和高可用的问题。

那么,什么是高可用呢?

2  高可用的含义

      首先让我们了解一下什么是高可用?

      高可用是CAP定理是分布式系统的基础,也是分布式系统的3个指标:

High Availability-高可用是什么?

      高可用简称HA,是系统一种特征或者指标,通常是指提供一定性能上的服务运行时间,高于平均正常时间段。反之,消除系统服务不可用的时间。

      衡量系统是否满足高可用,就是当一台或者多台服务器宕机的时候,系统整体和服务依然正常可用。


      比如下单服务,可以使用带有负载均衡的多个下单服务实例,代替单一的下单服务实例,即使用冗余的方式来提高可靠性。

      总而言之,负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一。一般通过负载均衡,冗余同一个服务实例的方式,解决分布式系统的大流量、高并发和高可用的问题。负载均衡核心关键:在于是否分配均匀


3 两个负载均衡案例分享

案例1


      微服务架构中,网关路由到具体的服务实例hello


案例2


      微服务架构中,A服务调用B服务的集群。通过了Ribbon客户端负载均衡组件:

 ● 负载均衡策略算法并不高级,最简单的是随机选择和轮循。

4互联网分布式系统解决方案


      常见的几个互联网分布式系统架构分层如下:


      一个请求从第1层到第4层,层层访问都需要负载均衡。即每个上游调用下游多个业务方的时候,需要均匀调用。这样整体系统来看,就比较负载均衡。

第 一 层

客户端层 -> 反向代理层的负载均衡

      客户端层 -> 反向代理层的负载均衡如何实现呢?

      答案是:DNS的轮询。DNS可以通过AAddress,返回域名指向的IP地址)设置多个IP地址。比如这里访问bysocket.comDNS配置了ip1ip2。为了反向代理层的高可用,至少会有两条A记录。这样冗余的两个ip对应的nginx服务实例,防止单点故障。

      每次请求bysocket.com域名的时候,通过DNS轮询,返回对应的ip地址,每个ip对应的反向代理层的服务实例,也就是nginx的外网ip。这样可以做到每一个反向代理层实例得到的请求分配是均衡的。


第 二 层

反向代理层 -> Web层的负载均衡

      反向代理层 -> Web层的负载均衡如何实现呢?

      是通过反向代理层的负载均衡模块处理。比如nginx有多种均衡方法:

1请求轮询

      请求按时间顺序,逐一分配到web层服务,然后周而复始。如果web层服务down掉,自动剔除。



2ip 哈希

      按照ip的哈希值,确定路由到对应的web层。只要是用户的ip是均匀的,那么请求到Web层也是均匀的。
还有个好处就是同一个ip的请求会分发到相同的web层服务。这样每个用户固定访问一个web层服务,可以解决session的问题。


3weight权重、fairurl_hash


第 三 层

Web -> 业务服务层的负载均衡

      Web 层 -> 业务服务层的负载均衡如何实现呢?

      比如Dubbo是一个服务治理方案,包括服务注册、服务降级、访问控制、动态配置路由规则、权重调节、负载均衡。其中一个特性就是智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

      为了避免单点故障和支持服务的横向扩容,一个服务通常会部署多个实例,即Dubbo集群部署。会将多个服务实例成为一个服务提供方,然后根据配置的随机负载均衡策略,在20Provider中随机选择了一个来调用,假设随机到了第7ProviderLoadBalance组件从提供者地址列表中,使用均衡策略,选择选一个提供者进行调用,如果调用失败,再选另一台调用。


Dubbo内置了4种负载均衡策略:

 ● RandomLoadBalance:随机负载均衡。随机的选择一个。是Dubbo的默认负载均衡策略。

 ● RoundRobinLoadBalance:轮询负载均衡。轮询选择一个。

 ● LeastActiveLoadBalance:最少活跃调用数,相同活跃数的随机。活跃数指调用前后计数差。使慢的Provider收到更少请求,因为越慢的Provider的调用前后计数差会越大。

 ● ConsistentHashLoadBalance:一致性哈希负载均衡。相同参数的请求总是落在同一台机器上。

同样,因为业务的需要,也可以实现自己的负载均衡策略。


第 四 层

业务服务层 -> 数据存储层的负载均衡

      数据存储层的负载均衡,一般通过DBProxy实现。比如MySQL分库分表。

      当单库或者单表访问太大,数据量太大的情况下,需要进行垂直拆分和水平拆分两个维度。比如水平切分规则:


      但伴随着这块的负载会出现下面的问题,需要解决:


      现状分库分表的产品方案很多,包括阿里的Cobar、当当sharding-jdbc等都是。

5小结

      对外看来,负载均衡是一个系统或软件的整体。对内看来,层层上下游调用。只要存在调用,就需要考虑负载均衡这个因素。所以负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一。考虑主要是如何让下游接收到的请求是均匀分布的:



文章来源于泥瓦匠:https://mp.weixin.qq.com/s/AdCtiXBLTJrWfcNV9LO2wA