详谈kafka的主题、分区和副本机制

Kafka主题、分区和副本概念解析
本文介绍了Kafka中主题、分区和副本三个重要概念。Kafka消息以主题分类,生产者发消息到主题,消费者订阅主题消费。主题可分多个分区,分区内消息有序,通过偏移量保证。还介绍了分区规则和副本机制,副本“一主多从”提升容错性。
部署运行你感兴趣的模型镜像
kafka中有三个特别重要的概念:主题(topic)、分区(partition)和副本(replication)。

我们先来看kafka在创建时候的命令
bin/kafka-topics.sh --zookeeper node01:2181 --create --topic t_cdr --partitions 3 --replication-factor 3
从中可以看出创建需要指定四个参数:–zookeeper、 --topic、–partitions、–replication-factor。第一个为kafka所依赖的集群的管理者的地址,第二个为主题名称,第三个为主题分区的数量,第四个为分区的副本数,下面我主要谈一下后三者的相关知识点。

kafka的消息是以主题为单位进行分类的,生产者负责将消息发送到指定的主题(topic),而消费者则订阅主题消费数据。一个主题可以分为多个分区(partition),一个分区只属于一个主题。同一个主题下不同分区的消息是不一样的,分区在存储方面来讲可以看做成一个可追加的日志文件,消息分别被追加在日志文件的末尾,并却还会维护一个偏移量(offset)。偏移量在分区内是唯一的,kafka通过它来保证同一个分区内消息的顺序性。也就是说,kafka会保证同一个分区内的消息有序,但是不保证主题内的消息有序。

生产者生产的每一条消息,在被发送到broker之前,会先根据分区规则选择存储在那个分区。如果分区规则设置的合理,那么该主题下的所有消息都会被均匀的分布在各个分区中。如果该topic只有一个分区,那么就能保证这个topic所有消息的顺序性,但是这个文件所在的机器的I/O将会是这个主题的性能瓶颈。 而分区则解决了这个问题,但是却不能保证整个topic的顺序性。主题在创建的时候,可以通过指定 --partitions参数来控制分区数量,当然,也可以在创建完后去修改分区的数量。

补充kafka的一个分区规则:kafka对每一条消息的key做一个hashcode运算,然后将得到的数值对分区数量进行模运算就得到了这条消息所在分区的数字。

kafka为了提升分区的容错性,加入了副本机制,通过--replication-factor来指定每一个分区的副本数量。同一分区的几个副本之间保存的是相同的数据(同一时刻,副本之间可能因为没来得及复制,可能不一定完全相同),副本之间的关系是“一主多从”,其中的主(leader)则负责对外提供读写操作的服务,而从(follower)则负责与主节点同步数据,当主节点宕机,从节点之间能重新选举leader进行对外服务。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### Kafka 分区机制详解 Kafka分区机制是其高吞吐量可扩展性的核心设计之一。每个主题(Topic)可以被划分为多个分区(Partition),每个分区是一个有序的、不可变的消息日志,消息以追加的方式写入分区。这种设计使得 Kafka 能够水平扩展,通过将分区分布在不同的 Broker 上来提升整体性能[^1]。 在 Kafka 中,分区不仅用于负载均衡,还决定了据的并行处理能力。生产者发送的消息会被分配到某个具体的分区中,通常使用轮询或基于键值的哈希算法来决定消息归属哪个分区。消费者也可以根据分区进行并行消费,从而实现高效的流式处理[^3]。 分区机制的一个关键参是 `replica.lag.time.max.ms`,该参控制 Follower 副本与 Leader 副本之间的最大允许延迟时间。如果一个 Follower 落后于 Leader 的时间超过了这个阈值,则它将被从 ISR(In-Sync Replica)集合中移除,以确保副本之间的同步性[^4]。 ### Kafka 副本机制详解 Kafka副本机制是其容错性据一致性的关键保障。每个分区可以配置多个副本(Replica),这些副本分为两类:**领导者副本(Leader Replica)** **追随者副本(Follower Replica)**。只有领导者副本对外提供读写服务,而追随者副本的任务是从领导者副本异步拉取消息,并将其写入本地的日志文件,以此实现据的复制[^2]。 Kafka 采用基于领导者的副本机制,所有生产者消费者的请求都必须由领导者副本处理。这种方式简化了客户端逻辑,并保证了“Read-your-writes”的一致性体验。当领导者副本所在的 Broker 宕机时,Kafka 会通过 ZooKeeper 检测到故障,并从当前的 ISR 集合中选举一个新的领导者,从而实现快速的故障转移[^3]。 副本之间同步的核心操作包括: - **创建副本对象**:使用 `getOrCreateReplica` 方法为分区创建副本。 - **角色切换**:通过 `makeLeader` `makeFollower` 方法切换副本的角色。 - **ISR 管理**:使用 `maybeExpandIsr()` `maybeShrinkIsr()` 来管理同步副本集合。 - **消息写入**:调用 `appendMessagesToLeader` 方法将消息写入领导者副本。 - **HW(High Watermark)检测**:通过 `checkEnoughReplicasReachOffset` 方法判断是否有足够的副本完成消息同步[^5]。 ### 分区副本的协同工作 Kafka分区副本机制协同工作,确保系统的高可用性据一致性。每个分区的多个副本分布在不同的 Broker 上,领导者副本负责接收写请求并将据同步给追随者副本。追随者副本定期向领导者副本发起拉取请求,获取最新的消息内容,并更新自己的日志。这种异步复制方式降低了网络开销,同时也能容忍部分节点的故障。 在实际运行过程中,Kafka 会维护一个 ISR 列表,记录当前与领导者副本保持同步的追随者副本。当 ISR 中的副本数量达到一定要求时,Kafka 才认为该消息已经成功提交。这种机制避免了因副本滞后而导致的据丢失问题,同时也提高了系统的可靠性[^4]。 例如,以下是一个简单的 Kafka 主题创建命令,指定分区为 3,副本因子为 2: ```bash bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 2 --partitions 3 --topic example-topic ``` 上述命令将创建一个名为 `example-topic` 的主题,包含 3 个分区,每个分区有 2 个副本,分别分布在不同的 Broker 上。 ### 总结 Kafka分区机制通过将据拆分到多个分区中,提升了系统的并行处理能力可扩展性。副本机制则通过领导者追随者的角色划分,确保了据的高可用性一致性。两者的结合使得 Kafka 成为了一个高性能、可靠的分布式消息系统。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值