Kafka基本概念

本文深入解析Kafka的架构和核心概念,包括Topic、Partition、Broker、Producer、Consumer、ConsumerGroup等,阐述了消息传递机制、副本管理、高水位线、偏移量提交等关键特性。

Kafka基本概念及术语

1 Topic

        主题。在Kafka中,使用一个类别属性来划分消息的所属类,划分消息的这个类称为topic。topic相当于消息的分类标签,是一个逻辑概念。

2 Partition

        分区。topic中的消息被分割为一个或多个partition,其是一个物理概念,对应到系统上就是一个或若干个目录。 分区本身是一个FIFO的队列,所以分区中的消息是有序的。但当topic拥有多个partition的时候,那么多个partition就不存在其顺序性。

  • 一般情况下一个topic的分区数量是broker数量的整数倍,即 partition % broker = 0
  • 一个分区只允许同一个消费者组的一个消费者消费,不允许同组多个消费者同时消费一个partition
  • 一个分区可以允许多个不同消费者组的消费者消费,每组有且只能有一个消费者消费

3 segment

        段。将partition进一步细分为了若干的segment,每个segment文件的最大大小相等;segment有三个文件组成

前面的20位数字代表offset偏移量,.index为索引文件,.log为消息内容,.timeindex为时间文件。

4 Broker

        Kafka 集群包含一个或多个服务器,每个服务器节点称为一个broker;假设某topic中具有N个分区(partition),集群中共有M个broker。则分区与broker间的关系是:

  • 若N>M且N%M=0,则每个broker会平均存储这些分区
  • 若N>M且N%M!=0,则每个broker中的分区是不平均的
  • 若N<M,则会有N台broker中具有一个分区,另外M-N台broker中是没有分区的

5 Producer

        生产者。即消息的发布者,其会将某topic的消息发布到相应的partition中。 生产者所生产的消息默认会平均分配到各个分区,但也可以直接指定要写入的分区,也可根据消息的key来计算路由。

6 Consumer

        消费者。可以从broker中读取消息。

  • 一个消费者可以消费多个topic中的消息
  • 一个消费者可以消费同一个topic中的多个partition中的消息
  • 一个分区中的消息允许多个无关的消费者(无关消费者即不在同一个消费者组Consumer Group)同时消费。

7 Consumer Group

        consumer group是kafka提供的可扩展且具有容错性的消费者机制。组内可以有多个消费者,它们共享一个公共的ID,即group ID。组内的所有消费者会协调在一起平均消费(对分区的消费是平均的,但对于消息的消费不一定是平均的)订阅主题的所有分区。

        Kafka可以保证在稳定状态下,一条消息只能被同一个consumer group中的一个consumer消费,当然,一个消息可以同时被多个consumer group消费。另外,Kafka还可以保证,在稳定状态下每一个组内consumer只会消费某一个或几个特定的partition;组中consumer数量与partition数量的对应关系如下。

     

8 Replicas of partition

        分区副本。副本是一个分区的备份,是为了防止消息丢失而创建的分区的备份。

9 Partition Leader

        每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责消息读写的partition。即所有读写操作只能发生于Leader分区上。

  • Leader与Follower是主备关系,不是主从关系。
  • Leader宕机后,Broker Controller会从Follower中选举出一个新的Leader;注意,这个选举不是由zk完成的。

10 Partition Follower

        所有Follower都需要从Leader同步消息,Follower与Leader始终保持消息同步。

11 ISR

        ISR,In-Sync Replicas,是指副本同步列表;ISR列表是由Leader负责维护;Assigned Replicas,AR全副本列表初始化时AR = ISR;OSR,Outof-Sync Replicas,不可用副本列表,AR = ISR + OSR。

12 offset

        偏移量。每条消息都有一个当前Partition下唯一的64字节的offset,它是相对于当前分区第一条消息的偏移量。查找具体消息消费需要通过定位偏移量来实现,例:需求查找第170213消息,通过2分法定位到partition分区中的00000000000000170210.index文件,在通过170213 - 170210 = 3,得到偏移量为3,定位到0348查找00000000000000170210.log文件,获取到m170213的这条消息。

13 Broker Controller

        Kafka集群的多个broker中,有一个会被选举为controller,负责管理整个集群中partition和replicas的状态。 例如,partition leader故障,由Controller负责从ISR中的followr中重新选举出一个新的leader,其选举算法为轮训选举。

如图,现有leader为1,isr:[1,2],当1故障后就是leader为2,如有3,那么当2故障leader即为3,恢复后列表顺位加入;

再如,当某个topic的partition数量发生变化时,由Controller负责管理partition与消费者间的分配关系,即Rebalance。

当前版本的Kafka只有Controller会向zk中注册Watcher。

早期版本的Kafka(0.8版本及之前),每一个broker及partition(所有副本)都会向zk中注册watcher。这种方式会导致Kafka的分区中出现脑裂,并且频繁更新造成zk性能下降。

14 HWLEO

        HW,HighWatermark,高水位,表示Consumer可以消费到的最高partition偏移量。HW保证了Kafka集群中消息的一致性。确切地说,是保证了partition的Follower与Leader间数据的一致性。

        LEO,Log End Offset,日志最后消息的偏移量。消息是被写入到Kafka的日志文件中的,这是当前最后一个写入的消息在Partition中的偏移量。

        对于leader新写入的消息,consumer是不能立刻消费的。leader会等待该消息被所有ISR中的partition follower同步后才会更新HW,此时消息才能被consumer消费。

15 Zookeeper

        Zookeeper负责维护和协调broker,负责Broker Controller的选举。 从Kafka 0.9版本开始,offset的管理由broker负责管理与保存,不再由zk负责管理。

总结:zk负责Broker中Controller的选举,Partioin Leader是由Controller负责选举。

16 Coordinator

        Coordinator一般指的是运行在每个broker上的group Coordinator进程,用于管理Consumer Group中的各个成员,主要用于offset位移管理和Rebalance。一个Coordinator可以同时管理多个消费者组。

17 Rebalance

        当消费者组中消费者数量发生变化,或Topic中的partition数量发生了变化时, partition的所有权会在消费者间转移,即partition会重新分配,这个过程称为再均衡Rebalance。

        再均衡能够给消费者组及broker集群带来高可用性和伸缩性,但在再均衡期间消费者是无法读取消息的,即整个broker集群有一小段时间是不可用的。因此要避免不必要的再均衡。

18 offset commit

        Consumer从partition中取出一批消息写入到buffer对其进行消费,在规定时间内消费完消息后,会自动将其消费消息的offset提交给broker,以让broker记录下哪些消息是消费过的。当然,若在时限内没有消费完毕,其是不会提交offset。

发生Rebalance后会使用到之前提交的offset。

        系统会将提交的offset作为消息写入到__consumer_offsets主题的partition中。不过需要注意,这个offset消息在写入时是有key的,其key为该offset所示消息的消费者的id。那么该offset应该放到哪个partition中呢?其会首先计算出key的hash值,然后再将此hash与50进行取模。其余数即为相应的partition编号。

### Kafka 基本概念 Kafka 是一种分布式流处理平台,主要用于高吞吐量的实时数据传输和处理。它最初由 LinkedIn 开发并开源,广泛应用于日志收集、监控数据聚合、在线和离线分析等领域。 #### Topic(主题) 主题是 Kafka 中的一个核心概念,表示一类消息或者一个 feed 名称[^4]。它可以看作是一个分类器,用于区分不同类型的数据。每个主题可以有多个生产者向其发送消息,同时也有多个消费者订阅这些消息。主题中的消息会被存储一段时间,具体时间可以通过配置来设定。 #### Broker(代理) Broker 是 Kafka 集群中的节点[^1]。每个 Kafka 实例运行在一个 Broker 上,负责接收来自 Producer 的消息并将它们存储在磁盘中。此外,Broker 还负责响应 Consumer 请求并向其提供所需的消息。 #### Producer(生产者) 生产者是指向 Kafka 主题发布消息的应用程序或服务[^1]。Producer 负责将数据序列化为字节流,并将其发送到指定的主题。为了提高性能,Producer 可以批量发送消息或将消息压缩后再发送。 #### Consumer(消费者) 消费者是从 Kafka 主题订阅消息的应用程序或服务[^3]。Consumer 使用 Pull 模型从 Broker 获取数据,而不是依赖 Push 模型。这样设计的好处在于能够更好地控制流量以及应对突发的大规模请求。另外,Consumer 需要记录自己的消费位置 (Offset),以便在网络中断或其他异常情况发生后可以从上次停止的地方继续消费。 #### Partition(分区) 分区是对同一主题下不同部分进行划分的结果。通过引入分区机制,不仅实现了水平扩展能力(即增加更多的机器加入集群从而分担负载压力),而且也支持并发访问同一个主题的不同子集。每条记录只会属于某一分区内的某个偏移量(offset)处。值得注意的是,在创建新分区时无法迁移已存在的旧数据至新的分区之中。 #### ISR 和 Leader/Follower - **ISR(In-Sync Replicas)** 表示当前同步状态良好的副本集合[^1]。只有当 follower 完全复制了 leader 所有的更新操作之后才能成为 isr 成员之一。 - 对于每一个 partition 来说都存在两种类型的 leaders: - **Controller Leader**: 控制整个 cluster metadata changes like creating/deleting topics etc. - **Partition Leader**: 处理 client requests related to that particular partition. #### 数据持久性和可靠性保障措施 每当 producer 将一条 message 发送给特定 topic-partition 后,kafka 不会立即将此 message 存储进 memory cache ,而是直接 flush 到 disk log file 当中去[^2].这种做法虽然牺牲了一定程度的速度优势但却极大地增强了 system fault tolerance level because even if there was a crash immediately after writing but before acknowledging receipt back to sender side still all written records would remain safe on persistent storage medium until they get consumed by corresponding consumers later according their retention policy settings defined earlier during setup phase of respective environments accordingly as well ! ```python from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers='localhost:9092') future = producer.send('my-topic', b'raw_bytes') result = future.get(timeout=60) print(result) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值