Apache Kafka的4个混沌工程实验 | IDCF
发布时间:2025-05-22 00:49:11
作者:益华网络
来源:undefined
浏览量(19)
点赞(33)
摘要:来源:混沌工程实践 作者:李大山原文作者:Andree Newman 原文来源:Gremlin.com原文标题:The first 4 chaos experiments to run on Apache KafkaApache Kafka是一个开放源代码的分布式消息传递平台,高吞吐量和低延迟交付数据。在规模上,它每天可以处理数万

Apache Kafka是一个开放源代码的分布式消息传递平台,高吞吐量和低延迟交付数据。在规模上,它每天可以处理数万亿条记录,同时还提供容错、复制和自动灾难恢复功能。
尽管Kafka有许多不同的使用场景,但最常见的是作为应用程序之间的消息broker。Kafka可以从多个上游源头接收、处理和重新分配消息到多个下游使用者,而无需重新配置应用程序。这就可以流式传输大量数据,同时保持应用程序的松散耦合,支持诸如分布式计算、日志记录和监控、网站活动跟踪以及物联网(IoT)设备通信之类的场景。
由于Kafka提供了应用程序之间的关键管道,因此可靠性至关重要。我们需要计划来减轻几种可能的故障模式,包括:
消息broker中断和其他不正常的群集状况; Apache ZooKeeper失效,这是Kafka的关键依赖项;上游和下游应用程序中的故障。不必等待这些故障在预生产或生产中发生,我们就能通过混沌工程主动对其进行测试,以便制定适当的策略减轻影响。本文,我们将演示混沌工程如何帮助提高Kafka部署的可靠性。为此,我们将使用企业SaaS混沌工程平台Gremlin创建并运行四个混沌实验。通过阅读本文,了解Kafka群集可能发生故障的不同方式,如何设计混沌实验来测试这些故障模式,以及如何使用观测结果提高其可靠性。本文中,我们将在Confluent平台上演示混乱的实验,该平台是Kafka最初的创建者提供的企业事件流平台。Confluent平台基于Kafka构建并添加企业功能(例如基于Web的GUI,全面的安全控制以及轻松部署多区域集群的功能)。但是,本文中的实验将适用于任何Kafka集群。一、Apache Kafka架构概述
为了了解Kafka如何从混沌工程中受益,我们应该首先研究一下Kafka的体系架构设计。Kafka使用发布者/订阅者(或pub/sub)消息传递模型传输数据。上游应用程序(在Kafka中称为发布者或生产者)会生成发送到Kafka服务器(称为broker)的消息。然后,下游应用程序(在Kafka中称为订阅者或使用者)可以从broker获取这些消息。消息被组织在主题的类别中,消费者可以订阅一个或多个主题以使用其消息。通过充当生产者和消费者之间的中间人,Kafka使我们能够彼此独立地管理上游和下游应用程序。Kafka将每个主题细分为多个分区。分区可以跨多个broker镜像以提供复制。还允许多个使用者(更具体地说,是使用者组)同时处理一个主题。为了防止多个生产者写入单个分区,每个分区都有一个充当领导者的broker,以及没有或多个充当追随者的broker。新消息将被写入领导者,而追随者则将其复制。追随者被完全复制后,称为同步副本(ISR)。该过程由Apache ZooKeeper协调,ZooKeeper管理有关Kafka集群的元数据,例如哪些分区分配给了哪些broker。ZooKeeper是Kafka的必要依赖项(编者注:2.8版本就可以不需要ZooKeeper了),但在其自己的集群上作为完全独立的服务运行。改善Kafka集群的可靠性必然涉及提高其关联的ZooKeeper集群的可靠性。Kafka和Confluent平台还有其他组件,但是在提高可靠性时,这些是最重要的考虑因素。当本文介绍其他组件时,我们会对其进行更详细的说明。
二、为何要对Kafka进行混沌工程?
混沌工程是一种主动测试系统故障的方法,目的是使它们更具韧性。我们通过向系统中注入少量受控故障,观察影响并解决观察到的问题。这使我们能够在系统出现问题之前,为用户找到解决问题的方法,同时还教会了我们更多关于系统在各种条件下的行为信息。由于有数不清的配置选项,灵活的生产者和消费者的部署方式以及许多其他因素,使得像Kafka这样的分布式系统难以高效管理和运维。仅仅使我们的broker和ZooKeeper节点不失效是不够的,我们需要考虑在应用程序、副本和其他基础架构组件中可能发生的更加细微和难以预测的问题。这些可能会以意想不到的方式影响整个部署,如果在生产中发生,则可能需要进行大量的排障开销。使用混沌工程,我们可以主动测试这些类型的故障,并在部署到生产之前解决这些故障,从而降低停机和紧急事件的风险。
三、在Kafka上运行混沌实验
在本节中,我们将逐步介绍在Confluent平台上部署执行四个不同的混沌实验。混沌实验是一个有计划的过程,将故障注入系统以了解其响应方式。在系统上运行任何实验之前,应充分考虑并开发要运行的实验。创建实验时。第一步:设定假说要回答的问题以及预期结果是什么。例如,如果实验是测试承受broker中断的能力,则假说可能会指出:“如果broker节点发生故障,则消息会自动路由到其他broker,而不会丢失数据。”第二步:定义爆炸半径,受实验影响的基础架构组件。减小爆炸半径限制了实验可能对基础架构造成的潜在危害,同时还可以将精力集中在特定系统上。我们强烈建议从尽可能小的爆炸半径开始,然后随着对进行混沌实验的适应性提高,将其增大。另外,还应该定义幅度,即注入攻击的规模或影响力。例如,低幅度的实验可能是在生产者和broker之间的网络流量中增加20毫秒的延迟。大幅度的实验可能是增加500毫秒的延迟,因为这将对性能和吞吐量产生显着的影响。与爆炸半径一样,从低幅度开始,然后逐渐增大。第三步:监控基础架构。确定哪些指标将助力得出有关假说的结论,在测试之前进行观测以建立基线,并在整个测试过程中记录这些指标,以便可以监测预期和意外的变化。借助Confluent平台,我们可以使用Control Center从Web浏览器实时直观地观察群集的性能。第四步:运行实验。Gremlin允许以简单、安全和可靠的方式在应用程序和基础架构上运行实验。我们通过运行注入攻击来做到这一点,它提供了各种向系统中注入故障的方法。我们还要定义中止条件,这是我们应该停止测试以避免意外损坏的条件。使用Gremlin,我们可以将状态检查定义为场景的一部分。通过状态检查,我们可以在进行注入攻击时验证服务状态。如果基础架构运行不正常,并且状态检查失败,将自动停止实验。另外,我们可以使用内置的暂停按钮立即停止实验。第五步:从观察结果得出结论。它是否证实或反驳了原先的假设?使用收集的结果来修改基础架构,然后围绕这些改进设计新的实验。随着时间的推移,重复此过程将有助于使Kafka部署更具韧性。本文中介绍的实验绝不是详尽无遗的,而应将其作为在系统上进行实验的起点。请记住,尽管我们正在Confluent平台上运行这些实验,但它们可以在任何Kafka集群上执行。请注意,我们使用的是基于Kafka 2.5.0构建的Confluent 平台 5.5.0。屏幕截图和配置详细信息可能会因版本而异。实验1: Broker负载对处理延迟的影响资源利用率可能会对消息吞吐量产生显着影响。如果broker正在经历较高的CPU、内存或磁盘I/O利用率,则处理消息的能力将受到限制。由于Kafka的效率依赖于最慢的组件,因此延迟可能会在整个管道中产生级联效应,并导致故障条件,例如生产者备份和复制延迟。高负载还会影响集群操作,例如broker运行状况检查,分区重新分配和领导者选举,从而使整个集群处于不正常状态。优化Kafka时要考虑的两个最重要的指标是网络延迟和磁盘I/O。Broker不断在本地存储中读写数据,随着消息速率和群集大小的增加,带宽使用可能成为限制因素。在确定集群大小时,我们应该确定资源利用率在哪一点上会对性能和稳定性产生不利影响。为了确定这一点,我们将进行一个混沌实验,逐步提高broker之间的磁盘I/O利用率,并观察其对吞吐量的影响。在运行此实验时,我们将使用Kafka Music演示应用程序发送连续的数据流。该应用程序将消息发送到分布在所有三个broker中的多个主题,并使用Kafka Streams聚合和处理消息。使用IO Gremlin生成Broker负载在本实验中,我们将使用IO Gremlin在broker节点上生成大量磁盘I/O请求。我们将创建一个方案,并在四个阶段中逐步增加注入攻击的强度。每次注入攻击将运行三分钟,中间会间隔一分钟,因此我们可以轻松地将I/O利用率的变化与吞吐量的变化联系起来。此外,我们将创建一个状态检查,该状态检查使用Kafka Monitoring API在每个阶段之间检查broker的运行状况。状态检查是通过Gremlin发送自动HTTP请求到我们选定的端点,在这种情况下,该端点是我们集群的REST API服务器。我们将使用主题的端点来检索broker的状态,并解析JSON响应以确定它们当前是否处于同步状态。如果任何broker不同步,我们将立即停止实验并将其标记为失败。在场景运行期间,我们还将使用Confluent Control Center监视吞吐量和延迟。









四、进一步提高Kafka的可靠性
Kafka是一个复杂的平台,具有大量相互依赖的组件和流程。要使Kafka可靠地运行,就需要进行计划、持续的监控和主动的故障测试。这不仅适用于我们的Kafka和ZooKeeper集群,还适用于使用Kafka的应用程序。混沌工程使我们能够安全有效地发现Kafka部署中的可靠性问题。为今天的故障做准备可以防止或减少将来发生故障的风险和影响,从而节省组织的时间、工作量以及挽救客户的信任。现在,我们已经展示了Kafka的四个不同的混沌实验,请尝试注册Gremlin Free帐户来运行这些实验。创建实验时,请考虑Kafka部署中的潜在故障点(例如,broker与使用者之间的连接),并观察它们如何应对不同的注入攻击。如果发现问题,请实施修复程序并重复实验以验证它可以解决问题。随着系统变得更加可靠,逐渐增加幅度(实验的强度)和爆炸半径(受实验影响的系统数量),以便全面地测试整个部署。
扫一扫,关注我们
声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。
33