解析Kafka High Available

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: Kafka在HA架设需要两个内容 Replication (主从复制) Leader Election (从属选取主级) 在Kafka在0.8以前的版本中,是没有Replication(主从控制)的,一旦某一个Broker(服务器节点)宕机,则其上所有的Partition(topic分区)数据都不可被消费,这与Kafka数据持久性及Delivery Guarantee(消息消费保障的设计目标相悖。

Kafka在HA架设需要两个内容

Replication (主从复制)
Leader Election     (从属选取主级)
在Kafka在0.8以前的版本中,是没有Replication(主从控制)的,一旦某一个Broker(服务器节点)宕机,则其上所有的Partition(topic分区)数据都不可被消费,这与Kafka数据持久性及Delivery Guarantee(消息消费保障的设计目标相悖。同时Producer(生产者)都不能再将数据存于这些Partition(topic分区)中。

一、如何进行Replication主从复制:

1、如何把replica均匀的分布到集群中的每一个或者大多数的节点上(broke)

可以从前面的文章回到一个事实,为了能够提高整个集群的性能需要吧同一个topic下面的所有partition尽可能的分布到整个集群上去,一个典型的解决方案就是topic的partition的数量大于broke的数量.同样的,为了提高卡夫卡的HA,我们需要吧同一个partitio下面的所有replica(备份)尽量的分散到不同的服务器上去.(事实上,如果我们把某一个partition的所有replica全部放到同一个broker上那么同样的这个broker宕机了,也就回到这这个partition下面的所有信息丢失,没有起到HA的效验)

2、kafka分派replica算法:

分配条件
    N 个broker
    x 个 partition
    y 个replica
分配方式
    将所有的broker和所有的partition进行排序
    把第i个partition分配到 [i [ mod] n](i 除以 你的余数)(就是从第一台broker上开始部署,部署到最后一台broker,如果还没部署完,怎进行循环)个broker上(分配topic的分区的部署位置)
    把第i个partition的第j个replica分配到[(i+j) mod n]个broker上,效果和上年的分配partition是一样的.

3、如何进行主从数据propagate

有一个前提,product生产的消息只是和partition的leader进行通信,是不关心partition是有多少个replica的.
    product在发布消息到partition时,先通过zookeeper找到该partition的leader
    leader把数据写入log
    所有的follower都从leader pull拉去数据,而后写入这些follower的log里面
    通过pull的方式可以保证replica的消息顺序是和其leader的消息顺序一致
    然后每个follower都向leader发送ACK
    一但leader收到ISR(同步列表)的所有ACK,则认为该条消息已经被commit了

**4、为了保住高吞吐量,kafka同样对replication的过程做了优化,

过程不是纯同步(性能会很忙),也不是纯异步(消息会丢失)**
kafka采用了ISR列表的方式来进行维护
    ISR列表标识in-sync Replica 其意义为:与leader保持同步的Replica列表
    如果一个Follower宕机,或者落后太多,Leader将把它从ISR中移除。
    Kafka处理失败需要明确定义一个Broker是否“活着”。对于Kafka而言,Kafka存活包含两个条件,一是它必须维护与ZooKeeper session(这个通过ZooKeeper的Heartbeat机制来实现)。二是Follower必须能够及时将Leader的消息复制过来,不能“落后太多”。

二、如何保证给product ACK之前的备份数量

**1、需要说明的是,Kafka只解决fail/recover,不处理“Byzantine”(“拜占庭”)问题。**
**2、一条消息只有被ISR里的所有Follower都从Leader复制过去才会被认为已提交。**
**3、而对于Producer而言,它可以选择是否等待消息commit,这可以通过request.required.acks来设置。**
**4、这种机制确保了只要ISR有一个或以上的Follower,一条被commit的消息就不会丢失。**

三、如何进行Leader Election

1、使用的选举Leader方式

Kafka在ZooKeeper中动态维护了一个ISR(in-syncreplicas),这个ISR里的所有Replica都跟上了leader,只有ISR里的成员才有被选为Leader的可能。
        在这种模式下,对于f+1个Replica,一个Partition能在保证不丢失已经commit的消息的前提下容忍f个Replica的失败。在大多数使用场景中,这种模式是非常有利的。

四、如何处理所有的replica都宕机了

1、等待ISR中的任一个Replica“活”过来,并且选它作为Leader
2、选择第一个“活”过来的Replica(不一定是ISR中的)作为Leader

五、如何选举leader

1、它在所有broker中选出一个controller,所有Partition的Leader选举都由controller决定。
**2、controller会将Leader的改变直接通过RPC的方式(比ZooKeeper Queue的方式更高效)通知需为为此作为响应的Broker。
3、同时controller也负责增删Topic以及Replica的重新分配。
**

六、节点故障企切换过程(broker failover)

**1. Controller在ZooKeeper注册Watch,一旦有Broker宕机(这是用宕机代表任何让系统认为其die的情景,包括但不限于机器断电,网络不可用,GC导致的Stop The World,进程crash等),其在ZooKeeper对应的znode会自动被删除,ZooKeeper会fire Controller注册的watch,Controller读取最新的幸存的Broker。

  1. Controller决定set_p,该集合包含了宕机的所有Broker上的所有Partition。**
    3. 对set_p中的每一个Partition
3.1 从/brokers/topics/[topic]/partitions/[partition]/state读取该Partition当前的ISR
3.2 
决定该Partition的新Leader。
如果当前ISR中有至少一个Replica还幸存,则选择其中一个作为新Leader,新的ISR则包含当前ISR中所有幸存的Replica。
否则选择该Partition中任意一个幸存的Replica作为新的Leader以及ISR(该场景下可能会有潜在的数据丢失)。
        如果该Partition的所有Replica都宕机了,则将新的Leader设置为-1。
3.3 将新的Leader,ISR和新的leader_epoch及controller_epoch写入/brokers/topics/[topic]/partitions/[partition]/state。
注意,该操作只有其version在3.1至3.3的过程中无变化时才会执行,否则跳转到3.1

4. 直接通过RPC向set_p相关的Broker发送LeaderAndISRRequest命令。Controller可以在一个RPC操作中发送多个命令从而提高效率。

核心内容以及数据结构请查看该博客

目录
相关文章
|
1月前
|
消息中间件 存储 负载均衡
Apache Kafka核心概念解析:生产者、消费者与Broker
【10月更文挑战第24天】在数字化转型的大潮中,数据的实时处理能力成为了企业竞争力的重要组成部分。Apache Kafka 作为一款高性能的消息队列系统,在这一领域占据了重要地位。通过使用 Kafka,企业可以构建出高效的数据管道,实现数据的快速传输和处理。今天,我将从个人的角度出发,深入解析 Kafka 的三大核心组件——生产者、消费者与 Broker,希望能够帮助大家建立起对 Kafka 内部机制的基本理解。
68 2
|
4月前
|
消息中间件 Kafka API
【Kafka消费新风潮】告别复杂,迎接简洁之美——深度解析Kafka新旧消费者API大比拼!
【8月更文挑战第24天】Apache Kafka作为一个领先的分布式流处理平台,广泛用于实时数据管道和流式应用的构建。随着其发展,消费者API经历了重大更新。旧消费者API(包括“低级”和“高级”API)虽提供灵活性但在消息顺序处理上存在挑战。2017年引入的新消费者API简化了接口,自动管理偏移量,支持更强大的消费组功能,显著降低了开发复杂度。通过对比新旧消费者API的代码示例可以看出,新API极大提高了开发效率和系统可维护性。
134 58
|
3月前
|
消息中间件 安全 Kafka
Kafka支持SSL/TLS协议技术深度解析
SSL(Secure Socket Layer,安全套接层)及其继任者TLS(Transport Layer Security,传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。这些协议在传输层对网络连接进行加密,确保数据在传输过程中不被窃取或篡改。
240 0
|
4月前
|
消息中间件 域名解析 网络协议
【Azure 应用服务】部署Kafka Trigger Function到Azure Function服务中,解决自定义域名解析难题
【Azure 应用服务】部署Kafka Trigger Function到Azure Function服务中,解决自定义域名解析难题
|
6月前
|
消息中间件 Kafka 程序员
Kafka面试必备:深度解析Replica副本的作用与机制
**Kafka的Replica副本是保证数据可靠性的关键机制。每个Partition有Leader和Follower副本,Leader处理读写请求及管理同步,Follower被动同步并准备成为新Leader。从Kafka 2.4开始,Follower在完全同步时也可提供读服务,提升性能。数据一致性通过高水位机制和Leader Epoch机制保证,后者更精确地判断和恢复数据一致性,增强系统容错能力。**
230 1
|
2月前
|
消息中间件 存储 运维
为什么说Kafka还不是完美的实时数据通道
【10月更文挑战第19天】Kafka 虽然作为数据通道被广泛应用,但在实时性、数据一致性、性能及管理方面存在局限。数据延迟受消息堆积和分区再平衡影响;数据一致性难以达到恰好一次;性能瓶颈在于网络和磁盘I/O;管理复杂性涉及集群配置与版本升级。
|
2月前
|
消息中间件 Java Kafka
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
51 1
|
4月前
|
消息中间件 Java Kafka
Kafka不重复消费的终极秘籍!解锁幂等性、偏移量、去重神器,让你的数据流稳如老狗,告别数据混乱时代!
【8月更文挑战第24天】Apache Kafka作为一款领先的分布式流处理平台,凭借其卓越的高吞吐量与低延迟特性,在大数据处理领域中占据重要地位。然而,在利用Kafka进行数据处理时,如何有效避免重复消费成为众多开发者关注的焦点。本文深入探讨了Kafka中可能出现重复消费的原因,并提出了四种实用的解决方案:利用消息偏移量手动控制消费进度;启用幂等性生产者确保消息不被重复发送;在消费者端实施去重机制;以及借助Kafka的事务支持实现精确的一次性处理。通过这些方法,开发者可根据不同的应用场景灵活选择最适合的策略,从而保障数据处理的准确性和一致性。
314 9
|
4月前
|
消息中间件 负载均衡 Java
"Kafka核心机制揭秘:深入探索Producer的高效数据发布策略与Java实战应用"
【8月更文挑战第10天】Apache Kafka作为顶级分布式流处理平台,其Producer组件是数据高效发布的引擎。Producer遵循高吞吐、低延迟等设计原则,采用分批发送、异步处理及数据压缩等技术提升性能。它支持按消息键值分区,确保数据有序并实现负载均衡;提供多种确认机制保证可靠性;具备失败重试功能确保消息最终送达。Java示例展示了基本配置与消息发送流程,体现了Producer的强大与灵活性。
73 3
|
4月前
|
vr&ar 图形学 开发者
步入未来科技前沿:全方位解读Unity在VR/AR开发中的应用技巧,带你轻松打造震撼人心的沉浸式虚拟现实与增强现实体验——附详细示例代码与实战指南
【8月更文挑战第31天】虚拟现实(VR)和增强现实(AR)技术正深刻改变生活,从教育、娱乐到医疗、工业,应用广泛。Unity作为强大的游戏开发引擎,适用于构建高质量的VR/AR应用,支持Oculus Rift、HTC Vive、Microsoft HoloLens、ARKit和ARCore等平台。本文将介绍如何使用Unity创建沉浸式虚拟体验,包括设置项目、添加相机、处理用户输入等,并通过具体示例代码展示实现过程。无论是完全沉浸式的VR体验,还是将数字内容叠加到现实世界的AR应用,Unity均提供了所需的一切工具。
153 0

推荐镜像

更多