有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

背景

现如今,Kafka 作为一个高性能、高可靠性、分布式的消息队列系统,广泛地被应用于大规模互联网服务中,如 Tencent、Facebook、LinkedIn、Netflix、Airbnb 等知名公司。然而,在大规模的分布式系统中,服务的不可预测性、复杂性和耦合性经常会导致一些不可预测的故障事件。当 Kafka Broker 节点宕机时,可能会出现以下故障:
数据丢失:如果正在写入宕机的 broker 的消息,则可能会导致数据丢失。在此期间,生产者可能无法将消息写入分区并将其复制到其他副本,因此可能会导致消息丢失。
可用性降低:宕机的 broker 不再处理请求,这可能会导致生产者和消费者的请求超时。如果有多个 broker 节点宕机,集群的可用性会进一步降低。
延迟增加:宕机的 broker 不再处理请求,这可能会导致生产者和消费者请求的延迟增加。当请求超时并重新发送时,它们可能需要等待其他节点回复,从而导致更长的延迟。
不均衡的领导者选举:如果宕机的 broker 是分区的领导者,则需要进行领导者选举。如果宕机的 broker 重新启动,并且在它退出之前的备份没有被删除,则可能会导致不均衡的领导者选举。
副本同步延迟:如果宕机的 broker 是一个或多个副本的复制者,则可能会导致副本同步延迟。如果这种延迟很大,可能会导致生产者和消费者读取或写入过时的数据。

腾讯云消息队列 CKafka(Cloud Kafka)

腾讯云消息队列 CKafka(Cloud Kafka)是基于开源 Apache Kafka 消息队列引擎,提供高吞吐性能、高可扩展性的消息队列服务。消息队列 CKafka 目前已经兼容 Apache Kafka 0.9、0.10、1.1、2.4、2.8、3.2 版本接口,在性能、扩展性、业务安全保障、运维等方面具有超强优势,让您在享受低成本、超强功能的同时,免除繁琐运维工作。腾讯云 CKafka 具有高可靠性、高可用性、高性能等特性,保证用户的数据安全。

故障原理

故障效果:CKafka 实例的某个或某个可用区 Broker 宕机离线。实例会出现未同步副本。
CKafka Broker 宕机逻辑:Broker 宕机之后(并不会自动拉起新的 broker 节点),会在集群中的其他 broker 节点中选出新的 topic-partition leader 副本,挂掉一台 broker,那么这台机器上的副本就不可用, 会导致 topic 少了一个副本, 并不会 “恢复到用户预期的副本数量”。对 CKafka 而言,只要有一个副本可用,就可以正常生产消费。故障恢复之后,原 Broker 上的副本会从其他 Broker 节点复制进而恢复。
CKafka Broker 节点宕机用户侧风险:故障之后,leader 副本切换通常是秒级的,在此期间,用户也许会收到重试警告,由于切换非常迅速,通常不会发生消息丢失(极小概率:消息写到 page cache,由异步线程刷盘,若在 page cache 数据没有刷盘的同时, follower 并未同步到 leader 副本的消息的情况下,会出现部分消息丢失)
故障示例图:一个 CKafka 实例(4个 Broker 节点部署在两个可用区),将 Broker A 宕机之后,离线,CKafka 实例会将位于 Broker C 上的 Partition 0 的副本选为新的 Leader 副本,对外提供消息服务。



注意事项

实例类型:该动作只对实例类型为 CKafka 专业版实例开放故障注入能力。
实例状态:进行演练的实例需要存在有效数据(需要存在 Topic)。
请勿短时间内频繁演练:频繁演练会导致实例健康状态数据不足,不足以判断是否是非演练造成,会拒绝演练请求,演练失败,若出现演练失败,请间隔15分钟之后重试。
防止演练导致实例生产消费流量过载:Broker宕机故障演练时,除宕机的Broker外,其他Broker的带宽使用率不能超过80%

演练准备

准备一台可供演练的 CKafka 专业版实例,并且具有一定的有效数据。文档采用一个跨 AZ 部署的容灾实例(共4个 Broker)作为演示。

步骤一:创建演练

1. 登录 腾讯云混沌演练平台 控制台。
2. 在左侧导航栏选择演练管理页面,单击新建演练。


3. 选择创建空白演练


4. 填写完基本信息后,进入演练对象配置,对象类型选择云资源下的 CKafka,单击添加实例。单击添加实例后,会列出目标地域下所有的 CKafka 实例信息,可以根据实例 ID、VPC-ID、 子网 ID 以及标签筛选符合要求的实例。


5. 选择目标实例后,单击立即添加,即可添加演练动作。


6. 演练动作选择 Broker 宕机(专业版),然后单击下一步


7. 设置动作参数。文档选择随机单 Broker 宕机模式,单击确认
注意:
该故障动作支持以下2种注入方式:
1. 随机单 Broker 宕机:会在 CKafka 实例所有的 Broker 节点中随机选择一个节点注入故障。
2. 随机可用区宕机(容灾实例):该注入方式仅支持容灾实例,会从 CKafka 实例可用区中随机选择一个可用区注入故障,故障后,选中可用区的所有 Broker 宕机离线。若使用非容灾实例进行演练时,将不会注入故障,注入会失败。



8. 单击下一步,进入全局配置,全局配置请参见 快速入门


9. 确认无误后,单击提交。


10. 可单击跳转演练详情开始演练。



步骤二:执行演练

1. 观察演练前实例监控数据,这里可以重点关注 Broker 存活率指标以及未同步副本数2个监控指标。可前往 CKafka 控制台 查看。
注意:
CKafka 控制台 监控会有一定的延迟时间,可待故障注入成功之后观察到数据变化。其中 Broker 存活率每5分钟采集一个点。



2. 由于演练为手动推进,所以需要手动执行故障动作。可单击动作卡片中的执行按钮启动故障注入。启动故障注入,等待故障注入成功。


3. 故障注入成功,可以单击动作卡片,查看执行详情。可发现故障于2023-07-14 15:47:32注入成功。此时,可前往 CKafka 控制台 观察数据变化。


观察 Broker 存活率指标,发现在15:45~15:50之间 Broker 存活率由100%下降至75%。说明存在一台 Broker 宕机。


同时观察未同步副本数指标,存在未同步的副本5个。


4. 执行恢复,单击恢复动作的执行按钮。


5. 待恢复成功之后,继续观察指标。


Broker 存活率指标:从75%恢复到100%。


未同步副本数,恢复到0。