热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

服务负载均衡系统设计与实践

认知才是最重

为什么要聊负载均衡系统,因为服务都做了无状态化目的不就是为了扩容缩容吗?没有负载均衡系统怎么做扩容缩容?


负载均衡系统分类

负载均衡系统可以分为两大类:

  1. 硬件负载

  2. 软件负载


硬件负载设备常见的有F5、Array,硬件负载设备的优点在于能够直接通过智能交换机实现,处理能力更强,而且与系统无关,负载性能强更适用于一大堆设备、大访问量、应用简单。但是硬件负载均衡设备成本都比较高,反正到目前为止我没有见过F5。

软件负载均衡常见的有LVS、Nginx、HAProxy,LVS是四层负载,Nginx是七层负载,而HAProxy则同时支持四层或者七层负载。四层负载和七层负载的概念大家可以自行去了解下网络的OSI7层模型,大致上就是四层负载是根据ip和端口号信息进行转发,七层负载就是在四层负载的基础上(一定要记住七层不可能脱离四层单独存在,这是TCP/IP报文处理的机制决定的)再根据url信息或者其它应用关键信息进行转发。

这里还有个概念要给大家解释清楚,我们都说Nginx是个反向代理软件,那什么是反向代理呢?有反向是不是还有正向呢?有的。那怎么去理解呢?先说正向代理,你就理解为当请求某个服务时,如果请求自己能决定请求到服务集群的某个节点,这就叫正向代理。反之,如果这一系列操作是在服务端或者在某个中间件完成的,对请求来说是透明的,这就叫反向代理。


负载均衡算法

负载均衡的算法有很多,我们拿SpringCloud核心组件Ribbon来说,其内置的算法有:

  1. RoundRobinRule:轮询

  2. RandomRule:随机

  3. AvailabilityFilteringRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问。

  4. WeightedResponseTimeRule: 根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越大,被选中的机率越高。刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够时,会切换到WeightedResponseTimeRule。

  5. RetryRule: 先按照RoundRobinRule的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用的服务。

  6. BestAvailableRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务。

  7. ZoneAvoidanceRule: 默认规则,复合判断server所在区域的性能和server的可用性选择服务器。


其实Ribbon的AvailabilityFilteringRule负载均衡算法就支持简单的熔断策略在里面了,只不过熔断是在客户端做的。

那讲到这里咱们负载均衡是不是就讲完了,NO。我们从相对论的角度来分析,以上这些都是狭义上的负载均衡,都不需要我们动脑子,买个设备装个软件学个API就行了。有狭义是不是就有广义?广义上的负载均衡怎么说呢?那就是负载均衡系统嘛,就以上这些是不是顶到天就只算负载均衡设备、软件介绍。


负载均衡系统

什么是负载均衡系统?我们可以这么认为拥有一整套完整的故障处理恢复机制的软硬件结合体就叫负载均衡系统,负载均衡系统应该包括以下特性:

  • 故障自动发现

  • 故障服务自动剔除

  • 故障服务熔断

  • 请求自动重试

  • 服务恢复自动发现


我们还是拿水平分层的架构来分析:

首先我有以下假设:

  • 注册中心使用Zookeeper

  • 网关层有业务逻辑层的服务信息缓存

  • 网关层与业务逻辑层之间保持tcp长连接

  • 网关层有rsp队列


其实Zookeeper不适合做注册中心,因为其是CP模型,而对于服务注册中心来说夸机房出现网络分区的情况下CP模型会导致服务不可用,但是对于服务来说我们要保持高可用,即AP模型,也就是说我宁愿调用一个旧的服务缓存也比直接报错好。Eureka是目前比较合适做服务注册中心的,这个后续再聊,现在我们就假设我们拿Zookeeper做服务注册中心。


故障自动发现

故障自动发现我们要怎么做?即假如我的业务逻辑层1挂了后网关层怎么自动发现。其实很简单,因为我们的业务逻辑层服务起来后都会把name、ip、端口信息注册到Zookeeper,并且会不停的向Zookeeper发送心跳报文,所以我们可以利用Zookeeper的watch机制向网关层更新服务信息。


故障服务自动剔除

服务自动剔除与服务故障自动发现其实同步的,按照故障自动发现的思路来处理就行了。


请求自动重试

请求自动重试也很简单,现在开源的rpc框架(Dubbo、Dubbox、brpc、grpc、RPC Over HTTP)基本上都自带请求超时重试,跟着API来就完事。


服务故障熔断

很多朋友会好奇,为什么我们有了服务自动剔除还需要服务故障熔断。我这里说的服务故障熔断是客户端的服务故障熔断,因为我们业务逻辑层向Zookeeper发送心跳报文肯定不是业务服务线程去做的,对吧?肯定会另外起一个单独的线程去做这个事,那如果服务出现假死,即我们的业务服务线程死循环了或者其他的乱八七糟的故障,但是我们的心跳报文线程是好的,这个时候其实Zookeeper是不会主动向网关层推送故障服务信息的,所以网关层还是会继续请求出现故障的服务,那这个时候怎么办呢?其实很简单,我们可以在网关层维护一个rsp队列,记录1分钟或者5分钟之内(这个时间根据业务实际PV去调整)的请求相应状态,我们可以拿count(失败) + count(超时)/count(失败) + count(超时) + count(正常)算出一个比例,如果超过10%或者20%(这个比例可以根据业务实际PV去调整)那我就在网关层主动剔除服务缓存中对应的服务节点。


服务恢复自动发现

服务怎么自动恢复呢?很简单,重启服务就行了,重启服务后Zookeeper就会重新向网关层推送最新的服务信息。当然如果是物理机直接kill进程再重启,如果是容器我们除了要kill进程还要kill docker和pod。



推荐阅读
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • java大数据量调优(超赞值得收藏)
    从总体上来看,对于大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节: ... [详细]
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • B站服务器故障影响豆瓣评分?别担心,阿里巴巴架构师分享预防策略与技术方案
    13日晚上,在视频观看高峰时段,B站出现了服务器故障,引发网友在各大平台上的广泛吐槽。这一事件导致了连锁反应,大量用户纷纷涌入A站、豆瓣和晋江等平台,给这些网站带来了突如其来的流量压力。为了防止类似问题的发生,阿里巴巴架构师分享了一系列预防策略和技术方案,包括负载均衡、弹性伸缩和容灾备份等措施,以确保系统的稳定性和可靠性。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
  • 目录结构如下:Nginx基础知识NginxHTTP服务器的特色及优点Nginx的主要企业功能Nginx作为web服务器的主要应用场景包括:Nginx的安装安装环境 ... [详细]
  • 本文介绍了在 Spring Boot 中使用 JPA 进行数据删除操作时遇到的 SQL 错误及其解决方法。错误表现为:删除操作失败,原因是无法打开 JPA EntityManager 以进行事务处理。 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
author-avatar
许更剑_725
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有