构建容错系统的 9 个开源工具

使用这些开源工具最大程度地延长正常运行时间并最大限度地减少问题。
273 位读者喜欢这个。
magnifying glass on computer screen, finding a bug in the code

Opensource.com

我一直对 Web 开发和软件架构感兴趣,因为我喜欢看到工作系统的更广阔前景。 无论您是构建移动应用程序还是 Web 应用程序,它都必须连接到互联网才能在不同模块之间交换数据,这意味着您需要 Web 服务。

如果您使用云系统作为应用程序的后端,您可以利用更强大的计算能力,因为后端服务将水平和垂直扩展并协调不同的服务。 但是,无论您是否使用云后端,构建容错系统——一个具有弹性、稳定、快速和安全的系统——都非常重要。

为了理解容错系统,让我们以 Facebook、亚马逊、谷歌和 Netflix 为例。 数百万和数十亿用户同时访问这些平台,同时通过点对点和用户到服务器网络传输大量数据,您可以肯定,也有恶意用户怀有不良意图,例如黑客攻击或拒绝服务 (DoS) 攻击。 尽管如此,这些平台仍可以每天 24 小时、每年 365 天不间断运行。

尽管机器学习和智能算法是这些系统的支柱,但它们在没有一分钟停机的情况下实现一致的服务这一事实值得称赞。 它们昂贵的硬件和庞大的数据中心当然很重要,但支持这些服务的优雅软件设计也同样重要。 而容错系统是构建如此优雅的系统的原则之一。

生产中导致问题的两种行为

这是另一种考虑容错系统的方式。 当您在本地运行应用程序服务时,一切似乎都很好。 太棒了! 但是,当您将服务提升到生产环境时,一切都乱了套。 在这种情况下,容错系统通过解决两个问题来提供帮助:故障停止行为和拜占庭行为。

故障停止行为

故障停止行为是指正在运行的系统突然停止或系统中的几个部分发生故障。 服务器停机和数据库无法访问都属于这一类。 例如,在下图中,服务 1 无法与服务 2 通信,因为服务 2 无法访问

Fail-stop behavior due to Service 2 downtime

由于服务 2 停机导致的故障停止行为

但是,如果服务之间存在网络问题,也可能发生问题,如下所示

Fail-stop behavior due to network failure

由于网络故障导致的故障停止行为

拜占庭行为

拜占庭行为是指系统持续运行,但没有产生预期的行为(例如,错误的数据或无效的值)。

即使服务看起来运行良好,如果服务 2 的数据或值已损坏,则可能会发生拜占庭故障,如下例所示

Byzantine failure due to corrupted service

由于服务损坏导致的拜占庭故障

或者,可能存在恶意中间人拦截服务之间并注入不需要的数据

Byzantine failure due to malicious middleman

由于恶意中间人导致的拜占庭故障

故障停止行为和拜占庭行为都不是期望的情况,因此我们需要方法来预防或修复它们。 这就是容错系统发挥作用的地方。 以下是八个开源工具,可以帮助您解决这些问题。

用于构建容错系统的工具

虽然构建真正实用的容错系统涉及深入的分布式计算理论和复杂的计算机科学原理,但有许多软件工具(其中许多是开源的,如下所示)可以通过构建容错系统来减轻不良结果。

断路器模式:Hystrix 和 Resilience4j

断路器模式是一种技术,当服务失败时,它可以帮助返回准备好的虚拟响应或简单响应

Circuit breaker pattern

断路器模式

Netflix 的开源 Hystrix 是断路器模式最流行的实现。

我以前工作过的许多公司都在利用这个出色的工具。 令人惊讶的是,Netflix 宣布将不再更新 Hystrix。 (是的,我知道。)相反,Netflix 建议使用替代解决方案,例如 Resilence4j,它支持 Java 8 和函数式编程,或者替代实践,例如 自适应并发限制

负载均衡:Nginx 和 HaProxy

负载均衡是分布式系统中最基本的概念之一,并且必须存在才能拥有生产质量的环境。 为了理解负载均衡器,我们首先需要理解冗余的概念。 每个生产质量的 Web 服务都有多台服务器,这些服务器提供冗余,以便在服务器宕机时接管并维护服务。

Load balancer

想想现代飞机:它们的双引擎提供了冗余,即使一个引擎着火,它们也能安全降落。 (大多数商用飞机都配备了最先进的自动化系统,这也很有帮助。)但是,拥有多个引擎(或服务器)意味着必须存在某种调度机制,以便在发生故障时有效地路由系统。

负载均衡器是一种设备或软件,它通过平衡多个服务器节点来优化繁重的流量事务。 例如,当数千个请求涌入时,负载均衡器充当中间层,以路由和均匀分配跨不同服务器的流量。 如果服务器宕机,负载均衡器会将请求转发到其他运行良好的服务器。

有许多可用的负载均衡器,但最著名的两个是 Nginx 和 HaProxy。

Nginx 不仅仅是一个负载均衡器。 它是一个 HTTP 和反向代理服务器、邮件代理服务器以及通用 TCP/UDP 代理服务器。 Groupon、Capital One、Adobe 和 NASA 等公司都在使用它。

HaProxy 也非常流行,因为它是一个免费、非常快速且可靠的解决方案,为基于 TCP 和 HTTP 的应用程序提供高可用性、负载均衡和代理。 许多大型互联网公司,包括 GitHub、Reddit、Twitter 和 Stack Overflow,都在使用 HaProxy。 哦,是的,Red Hat Enterprise Linux 也支持 HaProxy 配置。

Actor 模型:Akka

Actor 模型是一种并发设计模式,当actor(计算的基本单元)收到消息时,它会委托职责。 Actor 可以创建更多 actor 并将消息委托给它们。

Akka 是用于 Actor 模型实现的最著名的工具之一。 该框架支持 Java 和 Scala,它们都基于 JVM。

使用消息队列的异步、非阻塞 I/O:Kafka 和 RabbitMQ

多线程开发在过去很流行,但这种做法已不再提倡,而是被异步、非阻塞 I/O 模式所取代。 对于 Java,这在其 企业 Java Bean (EJB) 规范中明确指出

“企业 Bean 不得使用线程同步原语来同步多个实例的执行。

“企业 Bean 不得尝试管理线程。 企业 Bean 不得尝试启动、停止、挂起或恢复线程,或更改线程的优先级或名称。 企业 Bean 不得尝试管理线程组。”

现在,还有其他实践,例如流 API 和 Actor 模型。 但是,像 KafkaRabbitMQ 这样的消息队列为异步和非阻塞 IO 功能提供了开箱即用的支持,它们是功能强大的开源工具,可以替代线程来处理并发进程。

其他选项:Eureka 和 Chaos Monkey

用于容错系统的其他有用工具包括监控工具(例如 Netflix 的 Eureka)和压力测试工具(例如 Chaos Monkey)。 它们的目的是通过在较低环境(如集成 (INT)、质量保证 (QA) 和用户验收测试 (UAT))中进行测试来更早地发现潜在问题,以防止在转移到生产环境之前出现潜在问题。 


您正在使用哪些开源工具来构建容错系统? 请在评论中分享您的最爱。

标签
User profile image.
Bryant Jimin Son 是一位 Octocat,这不是正式头衔,但喜欢这样称呼自己,在 GitHub 工作,GitHub 是一家以托管世界上大多数开源项目而闻名的公司。 在工作中,他正在探索不同的 git 技术、GitHub Actions、GitHub 安全等。 此前,他曾在 Red Hat 担任高级顾问,Red Hat 是一家以其 Linux 服务器和开源贡献而闻名的技术公司。

6 条评论

当负载均衡器发生故障时会发生什么? 这个盒子看起来像一个单点故障。 Linux-ha 或基于仲裁的设计可能是一种解决方案,但列出的工具似乎都没有提供这一点。

如果数据流经一个单点,则单点故障可能会导致系统性故障。 提高可用性需要对所有内容使用某种形式的冗余:数据、服务器、网络设备、布线、电源、冷却系统等。

作为旁注,分布式系统设计本身会增加故障率。 这是因为全局 mtbf 随着物理机器数量的增加而降低:如果一台机器一年发生一次故障,那么拥有 365 台机器平均每天会导致一次故障。 容错是基于冗余的,冗余是一个与分布略有不同的概念。 即使许多分布式系统确实在其设计中包含冗余,容错也不是分布式设计模式固有的,不应默认认为它存在。

Pascal,这是一个非常好的观点。 如果您能为此撰写一篇文章,那将是一个很棒的主意! 我也会寻找扩展这个主题的方法。 谢谢。

回复 作者 pascal martin (未验证)

嗨 Pascal,的确,仅仅通过引入多个解决方案/硬件,您就增加了故障的可能性。 但是,与任何解决方案一样,在实际进行之前,应该仔细分析和权衡新事物。 在上面的示例中,是的,引入负载均衡器可能会引入 spof,但与任何工程师应该做的那样,它也应该在 ha 模式(vrrp vip 等)下配置。 此外,更多硬件不一定提供更多冗余。 集群中的多个成员分布在不同的硬件上,但确实如此:)

回复 作者 pascal martin (未验证)

我同意。 例如,pfsense 软件就具有这种能力。 EMS 工具也可以支持冗余(例如 qpid)。

似乎这篇文章更多地从软件质量的角度看待“容错”一词:为规模而设计、首选 EMS 而不是线程、充分测试和持续监控。

所有这些都是非常好的建议,但容错与其说是避免故障,不如说是当故障(硬件或软件)最终发生时保持系统正常运行和数据安全。

回复 作者 MariusP

我们使用的一个解决方案是使用两台运行 ha proxy 和 keepalived 的服务器。 效果很好。

回复 作者 pascal martin (未验证)

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.