②动态负载均衡
一般上游服务器都采用微服务的架构,那么负载均衡会把数据报发给哪个服务呢?如果服务出现了问题如何通知负载均衡器呢?有新的服务注册怎么办呢?
文章插图
动态负载均衡流程
微服务首先会注册到“服务注册发现”中心(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 特点是:
推荐阅读
- 漫谈Gossip协议与其在Redis Cluster中的实现
- Python实现全自动购买火车票!抢票回家过年咯
- 微软开源CMS,开公司想创业用它就对了
- Mysql数据库实现主从同步,看这一篇就够了
- 不想吃饭是什么病前兆
- 国企|“理想男友”职业排名公布,国企职员意外垫底,前三甲门槛都很高
- 联想|联想ZUI手机/平板无法联网激活 官方回应:已修复
- 西装|简单聊一聊,夏天想要穿衣显瘦,还得管好自己
- 发型|换发型就像换脸,前后对比大变样,让你美到不敢想象
- 荔枝红茶的保健功效,常喝红茶有四个意想不到保健功效