1 首先要了解kafka是什么
Kafka是一个分布式的消息订阅系统
1.1 kafka存储消息的过程
消息被持久化到一个topic中,topic是按照“主题名-分区”存储的,一个topic可以分为多个partition,在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),记录消息的消息位置**
1.2 partition 不能不了解的知识
Partition是Kafka中数据分布的基本单位,里面的数据是储存在硬盘中的,追加式的,通过将数据分散到多个Partition上,多个partition可以并行处理数据,所以可以处理相当量的数据,可以实现数据的并行处理和负载均衡。同一个 Consumer Group 中,只有一个 Consumer 实例可消费某个 Partition 的消息; 每个Topic可以根据预期的数据量和处理需求设置适当数量的Partition
虽然分区机制可以提高系统的整体吞吐量,但它并不是为了实现负载均衡而设计的。相反,Kafka 更关注的是数据的持久性、可用性和容错能力
请注意,Partition的数量一旦确定后,一般情况下是不能直接更改的。因为更改Partition数量可能会影响数据的分布和处理,所以在设计Topic时需要仔细考虑预期的数据量、吞吐量以及系统的伸缩性需求。
1.3 partition和replica之间的暧昧关系
具体来说,Kafka 通过将主题(topic)分为多个分区(partition),并将每个分区复制到多个节点上来实现高可用性和扩展性。每个分区都有一个主节点(leader)和多个副本节点(replica)。主节点负责处理来自生产者的消息和消费者的读取请求,而副本节点则用于备份数据并提供冗余。如果主节点失效,Kafka 会自动选举一个副本节点作为新的主节点,以保持服务的连续性。**
这种设计确保了高可用性和数据冗余,但并不是所有节点都直接参与消息的处理。
2 kafka的相关名词
1.producer:
消息生产者,发布消息到 kafka 集群的终端或服务。
2.broker:
kafka 集群中包含的服务器。
3.topic:
每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic 的。
4.partition:
partition 是物理上的概念,每个 topic 包含一个或多个 partition。kafka 分配的单位是 partition。
5.consumer:
从 kafka 集群中消费消息的终端或服务。
6.Consumer group:
high-level consumer API 中,每个 consumer 都属于一个 consumer group,每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group 消费。
7.replica:
partition 的副本,保障 partition 的高可用。
8.leader:
replica 中的一个角色, producer 和 consumer 只跟 leader 交互。
9.follower:
replica 中的一个角色,从 leader 中复制数据。
10.controller:
kafka 集群中的其中一个服务器,用来进行 leader election 以及 各种 failover。
12.zookeeper:
kafka 通过 zookeeper 来存储集群的 meta 信息
2.1 kafka的工作流程
3 不能不知道的主角zk
在 Kafka 中,ZooKeeper(简称为ZK)并不用来直接存储消息数据,而是用于协调和管理 Kafka 集群的元数据和状态信息。ZooKeeper 在 Kafka 中扮演以下几个角色:
1. 保存 Kafka 集群的元数据:ZooKeeper 存储了关于 Kafka 集群的元数据,包括主题(topics)、分区(partitions)、副本(replicas)等信息。这些元数据描述了 Kafka 集群的整体结构和配置。
2. 管理消费者组的偏移量(offset):ZooKeeper 用于存储和管理消费者组的偏移量信息。消费者组在消费消息时,会将当前消费的偏移量保存在 ZooKeeper 中,以便后续继续消费。
3. 选举 Kafka 控制器(Controller):Kafka 集群中的一个节点会被选举为控制器,负责管理分区的分配和副本的重新分配。ZooKeeper 用于协调和选举控制器节点。
4. 监测集群成员状态:ZooKeeper 监测和报告 Kafka 集群中各个节点的状态,例如节点的上线和下线。
3.1 生产者往zk注册消息
消息发送者会在Zookeeper中注册相关信息,在Zookeeper中获取Broker以及Topic的信息,然后将消息数据写入到指定的Kafka Topic中。
3.2 消费者往zk注册
Kafka依托于Zookeeper来注册Broker的信息,消费者会在Zookeeper注册消费者信息,同时也是通过Zookeeper来发现Kafka中的Broker列表。
发送者和消费者都会在Zookeeper中注册信息,通过Zookeeper来获取要存储或者消费的Kafka Broker列表。
Kafka的消息数据都是存储在Topic中的,Kafka会将Topic的元数据(信息)存储在Zookeeper中,维护Topic和Broker的关系,只存储元数据不存储消息数据。
3.3 你知道的元数据
(topic信息;topic有哪些分区,哪些副本,分别在哪台broker上,哪个是leader;consumer信息及读取消息后提交的偏移量数据等),元数据存储在zk中
3.4 被需要的zk
Kafka使用Zookeeper的原因:Kafka中会有若干个Broker,Broker需要通过分布式协调服务来维护,统一管理Broker的配置信息,客户端和消费者直接从配置中心获取Broker的信息,为Broker与Broker之间的请求建立安全协议,而这种分布式协调服务中Zookeeper是最可靠的
每个broker只存储消息体,不存储元数据
4、非常关键(副本)
高可用,数据持久化,数据备份
4.1 kafka副本的选举策略
其中:kafka分区中所有的副本统称未AR;副本leader的选举策略为:在isr中存活为前提,按照AR中排在前面的优先,例如AR[1,0,2] ,isr [1,0,2],那么leader就会按照1,0,2的顺序进行轮询
4.2 分区和副本数据一致性
分区领导者选举:每个分区都有一个 leader 和多个副本(replica)。在一个分区中,只有 leader 能够处理读写请求,而副本只负责复制数据以实现高可用性。当某个分区的 leader 发生故障或宕机时,Kafka 需要在副本中选择一个新的 leader。这个选举过程由 ZooKeeper 协助完成。ZooKeeper 负责跟踪每个分区的 leader 和副本状态,并在 leader 不可用时发起新的选举。
ISR(In-Sync Replicas)机制:Kafka 引入了 ISR 机制来确保 leader 和 leader 副本之间的数据一致性。ISR 是指与 leader 处于同步状态的副本集合。在正常情况下,leader 和 ISR 中的副本具有相同的数据。当生产者发送消息时,只有写入 leader 并复制到 ISR 中的副本才被视为成功。这确保了所有可用的副本在给定时间点都具有相同的数据。
消息确认机制:生产者发送消息后,可以选择等待确认或异步发送。如果设置为等待确认,生产者将在消息成功写入 leader 和 ISR 中的所有副本之后,收到来自 Kafka 的确认。这种方式保证了消息的可靠性。
数据同步:Kafka 使用副本同步机制来保持 leader 和 follower 副本之间的数据一致性。当消息被写入 leader 时,leader 将消息发送给其 ISR 中的所有副本。副本收到消息后会回复确认,leader 在收到 ISR 中的大多数副本确认后才认为消息成功提交,然后将确认发送给生产者。这确保了所有 ISR 中的副本在给定时间点具有相同的数据。
5、producer发布消息
producer 采用 push 模式将消息发布到 broker,每条消息都被 append 到 patition 中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障 kafka 吞吐率)。
5.1 是如何发布消息到分区的
producer 发送消息到 broker 时,会根据分区算法选择将其存储到哪一个 partition。
其路由机制为:
1. 指定了 patition,则直接使用;
2. 未指定 patition 但指定 key,通过对 key 的 value 进行hash 选出一个 patition
3. patition 和 key 都未指定,使用轮询选出一个 patition
5.2 流程说明:
1. producer 先从 zookeeper 的 "/brokers/.../state" 节点找到该 partition 的 leader
2. producer 将消息发送给该 leader
3. leader 将消息写入本地 log
4. followers 从 leader pull 消息,写入本地 log 后 leader 发送 ACK
5. leader 收到所有 ISR 中的 replica 的 ACK 后,增加 HW(high watermark,最后 commit 的 offset) 并向 producer 发送 ACK
5.3 发送消息topic分类
Producer即生产者,向Kafka集群发送消息,在发送消息之前,会对消息进行分类,即Topic,两个producer发送了分类为topic1的消息,另外一个发送了topic2的消息。 Topic即主题,通过对消息指定主题可以将消息分类,消费者可以只关注自己需要的Topic中的消息 Consumer即消费者,消费者通过与kafka集群建立长连接的方式,不断地从集群中拉取消息,然后可以对这些消息进行处理。 从上图中就可以看出同一个Topic下的消费者和生产者的数量并不是对应的
6 消费者消费消息
在消费者消费消息时,kafka使用offset来记录当前消费的位置 在kafka的设计中,可以有多个不同的group来同时消费同一个topic下的消息,有两个不同的group同时消费,他们的的消费的记录位置offset各不相同,不互相干扰。 对于一个group而言,消费者的数量不应该多余分区的数量,因为在一个group中,每个分区至多只能绑定到一个消费者上,即一个消费者可以消费多个分区,一个分区只能给一个消费者消费 因此,若一个group中的消费者数量大于分区数量的话,多余的消费者将不会收到任何消息。
7、broker存储消息周期分类
Kafka中的消息保留策略是通过配置参数进行配置的。一种常见的配置是使用时间保留策略,即设置一个保留时间,超过该时间的消息将被删除。另一种常见的策略是基于消息的大小来设置保留策略,即设置一个最大的消息保留容量,一旦超过这个容量,旧的消息将被删除。
因此,即使消息被消费完,它们可能在Kafka集群中保留一段时间,直到达到保留策略所定义的条件。这样可以确保消息在需要时可以重新消费或重新读取。但请注意,一旦消息达到保留策略的条件,它们将被永久删除,无法再次访问。
无论消息是否被消费,kafka 都会保留所有消息。有两种策略可以删除旧数据:
-
基于时间:log.retention.hours=168
-
基于大小:log.retention.bytes=1073741824 需要注意的是,因为Kafka读取特定消息的时间复杂度为O(1),即与文件大小无关,所以这里删除过期文件与提高 Kafka 性能无关