了解什么是断路器模式,如何实现它,以及如何进行负载平衡。

图片由:
Opensource.com
分布式系统对网站可靠性工程师(SRE)有独特的要求。维护网站可靠性的最佳方法之一是执行一定的最佳实践。这些作为配置基础设施和政策的指导方针。
什么是断路器模式?
当另一个服务没有响应时,断路器模式可以使你的服务不会停止或崩溃。

图片由:
(Robert Kimani, CC BY-SA 40)
例如,在示例图片中,业务逻辑微服务与用户授权服务、账户服务和网关服务对话。
正如你所看到的,这个业务应用的 "引擎 "是业务逻辑微服务。不过,有一个陷阱。假设账户服务坏了。也许它的内存用完了,或者是后端数据库坏了。当这种情况发生时,调用的微服务开始有背压,直到它最终崩溃。这导致你的网络服务性能不佳,从而导致其他组件断裂。必须实现一个断路器模式,将你的分布式系统从这个问题中拯救出来。
实施一个断路器模式
当一个远程服务发生故障时,最理想的情况是让它快速故障。当你的应用程序与它所依赖的东西失去联系时,不要让整个应用程序瘫痪,而是以减少的功能运行。例如,保持你的应用程序在线,但牺牲其账户服务的可用性。像断路器一样进行设计有助于避免连带故障。
下面是一个断路器设计的秘诀。
-
追踪调用远程服务时遇到的失败次数。
-
当达到预定的计数或超时时,失败(打开电路)。
-
再次等待预定义的时间,重新尝试连接到远程服务。
-
连接成功后,关闭电路(意味着你可以重新建立与远程服务的连接。)然而,如果服务一直失败,就重新启动计数器。
与其挂在一个性能不佳的远程服务上,不如快速失败,这样你就可以继续进行你的应用程序的其他操作。
开源断路器模式
开源提供了一些非常具体的组件来实现基础设施中的断路器逻辑。首先,使用一个代理层,比如Istio。Istio是一个技术独立的解决方案,使用 "黑盒 "方法(意味着它位于你的应用程序之外)。
另外,你可以使用Hystrix,这是一个来自Netflix的开源库,被许多应用团队广泛和成功地使用。Hystrix被内置到你的代码中。人们普遍认为,Hystrix可以提供比Istio更多的功能和特性,但它必须被 "硬编码 "到你的应用程序中。这对你的应用程序是否重要,取决于你如何管理你的代码库和你实际需要的功能。
实施有效的负载均衡
负载均衡是在一组资源(计算单元)上分配一组任务的过程,目的是使其整体处理尽可能高效。负载平衡可以优化响应时间,并避免一些计算机节点不均衡地超载,而其他计算机节点则处于闲置状态。

图片由:
(Robert Kimani, CC BY-SA 40)
左边的用户与负载均衡器上的一个虚拟IP(vIP)对话。负载平衡器在一个系统池中分配任务。用户不知道后端系统,只通过负载平衡器与系统互动。
负载平衡有助于确保高可用性(HA)和良好的性能。高可用性意味着可以容忍服务器池内的故障,从而使你的服务在很大程度上保持可用。通过添加更多的服务器到你的池子里,通过横向分散负载来提高有效性能(这被称为横向扩展。)
3种做负载平衡的方法
-
DNS 负载平衡。这是最直接的方法,而且是免费的。你不必购买任何专门的硬件,因为它是DNS协议的基本功能,你只需返回多个A-记录。当DNS服务器为一个主机名返回多个IP地址时,客户端会随机选择一个IP地址,换句话说,负载平衡是由客户端自动为你完成的。
-
专门的基于硬件的负载平衡器。 这就是通常在数据中心内使用的东西,它的功能丰富,性能高。
-
当你拥有一个软件负载平衡器时,你不需要为这种类型的负载平衡拥有一个专用的硬件,你可以简单地在商品硬件上安装负载平衡器软件,并将其用于你的负载平衡使用案例。
Nginx和HAProxy大多被用作软件负载平衡器,在开发环境中非常有用,你可以快速启动它们的功能。
DNS负载平衡
当一个客户查询一个主机名时,一个DNS服务器可能会返回多个IP地址。这是因为在大规模部署中,网络目标不仅仅是在一台服务器上运行,甚至不仅仅是在一个集群上运行。一般来说,客户端软件会从返回的地址中随机选择一个IP地址。要控制客户端选择哪个IP并不容易。
除非你有定制的软件来确定服务器的健康状况,否则纯粹的DNS负载平衡不知道一个服务器是在运行还是停机,所以一个客户端可能被发送到一个停机的服务器。
客户端在设计上也会对DNS条目进行缓存,而要清除这些条目并不容易。许多供应商提供了根据地理位置选择客户端被路由到哪个数据中心的能力。最终,影响客户如何到达你的服务的一个重要方法是通过负载平衡。
专用的负载均衡器
负载平衡可以发生在OSI(开放系统互连)模型的第三层(网络)、第四层(运输)或第七层(应用)。
- 一个L3负载平衡器在源和目的IP地址上操作。
- L4负载平衡器使用IP和端口号(使用TCP协议)。
- L7负载平衡器在最后一层,即应用层,通过利用整个有效载荷进行操作。它利用整个应用数据,包括HTTP URL、cookies、头文件等。它能够为路由提供丰富的功能。例如,你可以根据进来的数据类型,向一个特定的服务发送请求。例如,当一个视频文件被请求时,L7负载平衡器可以将该请求发送到一个流媒体设备。
目前,有5种常见的负载平衡方法在使用。
- Round Robin:这是最简单和最常见的。负载平衡池中的目标在一个循环中轮换。
- 加权循环:像循环一样,但对后端目标手动分配重要性。
- 最小负载或最小连接。请求根据目标后端报告的目标的负载进行路由。
- 最少负载与慢速启动或**最少响应时间:**根据其负载选择目标,并随着时间推移逐渐增加请求,以防止淹没负载最少的后端。
- 利用率限制:基于后端报告的每秒查询次数(QPS),或每秒事件数(EPS)。
有基于软件的负载均衡器。这可以是在商品硬件上运行的软件。你可以拿起任何Linux盒子,在上面安装HAProxy或Nginx。软件负载平衡器倾向于快速发展,就像软件经常做的那样,而且价格相对便宜。
你也可以使用基于硬件的、专门建造的负载平衡器设备。这些设备可能很贵,但它们可能为专业市场提供独特的功能。
过渡到基于Canary的部署
在我之前的文章中,我解释了基于Canary的部署如何帮助SRE确保顺利升级和过渡。你在基于Canary的部署中使用的具体方法取决于你的要求和环境。
一般来说,你先在一台服务器上发布变化,只是为了看看部署的软件包的表现如何。在这一点上,你所寻找的是确保没有灾难性的故障,例如,一台服务器没有启动或启动后服务器崩溃了。
一旦一个服务器部署成功,你要继续在最多1%的服务器上安装它。同样,这个1%是一个通用的指导原则,但它真的取决于你的服务器数量和你的环境。然后,如果你的环境适用,你可以继续为早期的适配器发布。
最后,一旦金丝雀测试完成,你就可以为所有用户发布。
请记住,一个失败的金丝雀是一个严重的问题。分析和实施强大的测试流程,以便在测试阶段而不是在金丝雀测试中发现这样的问题。
可靠性问题
可靠性是关键,所以要利用断路器模式在分布式系统中快速失效。你可以使用Hystrix库或Istio。
用DNS和专用负载均衡器的混合设计负载均衡,特别是如果你的应用是网络规模的。DNS负载平衡可能不完全可靠,主要是因为DNS服务器可能不知道哪些后端服务器是健康的,甚至是正常运行的。
最后,你必须使用金丝雀版本,但请记住,金丝雀不是测试的替代品。