想实现高可用?先搞定负载均衡原理( 三 )

  • Hash Key:这个算法是对 Hash 算法的补充,主要是考虑当出现上游服务器增加/删除的情况,请求无法正确的被同一服务器处理 。
  • 所以对每个请求都设置 Hash Key,这样就算服务器发生了变化,Key 的值没有变,也可以找到对应的服务器 。
    ②动态负载均衡
    一般上游服务器都采用微服务的架构,那么负载均衡会把数据报发给哪个服务呢?如果服务出现了问题如何通知负载均衡器呢?有新的服务注册怎么办呢?
    想实现高可用?先搞定负载均衡原理

    文章插图
     
    动态负载均衡流程
    微服务首先会注册到“服务注册发现”中心(Consul,Eureka) 。注册中心包含微服务的信息,Nginx 会定期从这里拉取服务信息(Lua) 。
    获取微服务信息以后,Nginx 收到数据报的时候,就可以从注册中心获取的服务地址,把信息传递给服务了 。
    ③限流
    限流的工作可以在接入层用硬件负载均衡器来完成,也可以在代理层来完成 。
    限流实际上就是限制流入请求的数量,其算法不少,有令牌桶算法,漏桶算法,连接数限制等等 。这里我们就介绍三个常用的 。一般通过 Nignx+Lua 来实现 。
    【想实现高可用?先搞定负载均衡原理】连接数限流:通过 ngx_http_limit_conn_module 模块实现 。设置最大的连接数以及共享内存的区域大小,请求的时候判断是否超过了最大连接数 。
    如果超过最大连接数就被限流,否则针对连接数就 +1,请求结束以后会将连接数 -1 。
    漏桶算法:通过 ngx_http_limit_req_module 模块实现 。一个固定容量的桶,数据报按照固定的速度流出 。
    数据报可以按照任意的速度流入桶中,如果数据报的容量超过了桶的容量,再流入的数据报将会被丢弃 。
    按照这个规则,需要设置限流的区域以及桶的容量,以及是否延迟 。
    想实现高可用?先搞定负载均衡原理

    文章插图
     
    漏桶策略
    令牌桶算法,桶的大小是固定的,以固定的速度往桶里丢令牌 。桶满了后,后面添加的令牌无法添加 。
    数据报到来时从桶中取令牌,如果桶中有令牌,凭借令牌处理请求,处理完毕令牌销毁;数据报到来时发现桶中没令牌,该请求将被拒绝 。
    请求在发往令牌桶之前需要经过过滤/分类器,可以对报文进行分类,例如:某类报文可以直接发往应用服务器,某类报文需要经过令牌桶获取令牌以后才能发 。
    又例如:VIP 就可以直接把请求发往服务器,用不着经过令牌桶 。
    想实现高可用?先搞定负载均衡原理

    文章插图
     
    令牌桶示意图
    ④缓存
    想实现高可用?先搞定负载均衡原理

    文章插图
     
    Nginx 本地缓存机制
    接入层发送请求,如果能够在 Nginx 本地缓存命中,直接返回缓存数据,如果没有命中回源到应用服务器 。
    缓存更新服务器定时更新 Nginx 本地缓存信息 。这些需要考虑数据的一致性,何时更新以及何时失效等情况 。
    Nginx 缓存可以大大提高请求响应时间,可以把不经常更改的信息,例如:用户信息,提前放入缓存中,每次请求就不用再去请求应用服务器了 。一旦用户信息更新,可以按照一定时钟频率写入缓存中 。
    另外,一般 HTTPHEAD 中都带有一些信息更新的信息 。Nginx 也可以通过 expires,etag,if-modified-since 来实现浏览器缓存的控制 。
    其他的几个功能如下:
    • 客户端超时重试
    • DNS 超时重试
    • 代理超时重试
    • 失败重试
    • 心跳检测
    • 配置上有服务器
    流行的软件负载均衡器
    目前比较流行的有 LVS,Nginx 和 HAProxy,逐个看看他们的特点 。
    LVS
    LVS(linux Virtual Server) 是使用 Linux 内核集群实现的一个高性能、高可用的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability) 。
    LVS 特点是:
    • 仅作分发之用,即把请求直接分发给应用服务器,因此没有流量的产生,对资源的消耗低 。
    • 配置简单,能够配置的项目少 。
    • 工作在第四层(传输层),支持 TCP/UDP,对应用的支持广泛 。
    HAProxy
    HAProxy 实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数 。
    多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接 。
    HAProxy 特点是:


    推荐阅读