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的顺序进行轮询