Kafka 概述

下载安装4.0 不再支持 JDK8

https://kafka.apache.org/downloads & https://mirrors.aliyun.com/apache/kafka/

修改 config\kraft\reconfig-server.properties 中的 log.dirs=D:/kafka_2.13-3.9.0/data,Win11 在设置->系统->可选功能中可添加 WMIC

title kafka 9092
cd /d D:\kafka_2.13-3.9.0
set JAVA_HOME=D:\jdk21.0.6
set PATH=%PATH%;%JAVA_HOME%\bin
rem bin\windows\kafka-storage.bat random-uuid
if not exist "data" (
    bin\windows\kafka-storage.bat format --standalone -t FajESpVaT7GczOW1rCPuhQ -c config\kraft\reconfig-server.properties
)
bin\windows\kafka-server-start.bat config\kraft\reconfig-server.properties

cd /d D:\kafka_2.13-3.9.0
set JAVA_HOME=D:\jdk21.0.6
set PATH=%PATH%;%JAVA_HOME%\bin
bin\windows\kafka-server-stop.bat

可视化:https://github.com/provectus/kafka-ui/releases & https://docs.kafka-ui.provectus.io/configuration/configuration-wizard

title kafkaui 8080
cd /d D:\kafkaui0.7.2
set JAVA_HOME=D:\jdk21.0.6
set PATH=%PATH%;%JAVA_HOME%\bin
rem set DYNAMIC_CONFIG_ENABLED=true
rem set DYNAMIC_CONFIG_PATH=./dynamic_config.yaml
rem set SERVER_PORT=8080
set KAFKA_CLUSTERS_0_NAME=kafka
set KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=127.0.0.1:9092
java -jar kafka-ui-api-v0.7.2.jar

 

单 Broker 集群(Kafka 以一个或多个服务器的集群运行,形式上不太强调单机和集群)大致工作流程

多 Broker 集群大致工作流程

Producer:消息生产者(向 Kafka Broker 发消息的 Client)

Consumer:消息消费者(向 Kafka Broker 取消息的 Client)

Consumer Group:由多个 Consumer 组成,组内每个消费者负责消费不同 Partition,一个 Partition 只能由一个组内消费者消费。消费者组间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者

Broker:一台 Kafka 服务器就是一个 Broker。一个集群由多个 Broker 组成。一个 Broker 可以容纳多个 Topic

Topic:可理解为一个队列,生产者和消费者面向的都是一个 Topic

Partition:为了实现扩展性,一个非常大的 Topic 可以分为多个 Partition,每个 Partition 是一个有序队列,这些 Partition 可以分布到不同的 Broker 上(即一个 Topic 可以分布到多个 Broker 上)

Replica:副本,为保证集群中的某些节点发生故障时,Kafka 集群任然能够继续工作,Kafka 提供了 Replica 机制,即一个 Topic 的每个 Partition 都有若干副本(一个 Leader 和若干 Follower)

Leader:每个 Partition 多个 Replica 中的主,生产者发送数据的对象,以及消费者消费数据的对象都是 Leader

Follower:每个Partition 多个 Replica 中的从,实时从 Leader 中同步数据。Leader 发生故障时,某个 Follower 会成为新的 Leader

 

Offset

Producer Offset 由 Kafka Broker 管理,Consumer Offset 由 Kafka Broker(__consumer_offsets)/Client 共同管理。replay 基于 offset 完成

Consumer Lag:Producer Offset 与 Consumer Offset 的差值,过大时容易消息积压

 

Partition

如果一个 Topic 只有一个队列,随着数据量的增加,可能出现性能瓶颈。Kafka 采取将一个队列拆分成若干子队列,这些子队列在 Kafka 被称为 Partition,这些 Partition 被分配到不同 Broker 时,就可提高负载能力

 

生产者负载均衡

由于 Topic 可以有多个 Partition,生产者将消息发送到那个 Partition 就需要一个策略,Kafka 提供 RoundRobin(轮询) 和 Hash(发送时需设置 key,根据 hash(key) 确定发送到那个 Partition)

同一个 Partition 的消息可以保证有序,跨 Partition 不保证

 

Consumer Commit Offset

Kafka Broker 有一个名为 __consumer_offsets 的 Topic,用于存储 Client 的 Consumer Offset,记录了 Consumer 在某个 Topic 中的某个 Partition 的 Offset,避免 Client 重启丢失消费进度

由于消费时需提交 Offset,于是出现:先消费后提交(保证消息不丢失(可靠性,但需要业务幂等),可能重复消费(at least once,至少消费一次)),先提交后消费(保证消费一次(at most once,最多消费一次),可能丢失消息(提交后就宕机了))

Kafka 提供精确一次(exactly once,不丢失,不重复,但使用较复杂)消费

提交可以是自动(默认 5 秒 1 次)或手动(支持同步或异步)

 

Consumer Partition Assignment

引入多个 Partition 后,如何尽可能将多个 Partition 尽可能平均分配给多个 Consumer

一个分区在同一时间只能被一个消费者消费、一个消费者可以消费多个分区、一个消费者可暂时不消费任何分区

 

Consumer Rebalance

Consumer 的 Partition 分配是个复杂的过程,随着 Consumer 数量的变化,Kafka 会自动调整 Consumer 与 Partition 的对应关系,尽可能让 Consumer 负载均衡,该过程称为重平衡

重平衡时会暂停(stop the world)所有消费,待分配好 Offset 后再开始。2.3 开始支持协作式重平衡(Cooperative Rebalancing),允许未受影响的 Partition 保持消费,减少整体的停顿时间

 

Consumer Group

同一个 Topic 会有不同的消费需求,即多个 Consumer 消费同一 Topic 如何互不干扰

消费者组是消费者重平衡和分区分配的基本单位,即不同消费者组是完全隔离(通过 Consumer Group ID 区分消费者组)的

消费进度通过 Offset 实现,会记录<消费者组,主题,分区,偏移量>,但不记录具体消费者,具体消费者和分区的对应由重平衡动态管理

 

Retention Policy

当 Partition 太大时的保留策略:基于时间(默认会删除 7 天前的数据)或大小(删除最早的数据)

 

Broker

Kafka 集群由 Broker 组成,每个 Broker 有唯一编号(Broker ID)

 

Partition Broker Assignment

Kafka 会尽量将一个 Topic 中的 Partition 分配在不同的 Broker 上

 

Partition Discovery

每个 Topic 的 Partition 在不同的 Broker 上,Producer 和 Consumer 如何知道这些信息

引导服务器(Bootstrap Server):Kafka 集群中的每个 Broker 都有 metadata(记录了集群中有哪些 Broker、集群中有那些 Topic、每个 Topic 有多少 Partition,每个 Partition 分布在那些 Broker 上等)

Kafka Client 大致连接流程:

 

Replica(High Availability Issue)

Kafka 用 Partition 的副本来保证高可用性,Leader 负责读写,其余 Follwer 副本负责同步(ISR:In-Sync Replica) Leader 的数据

 

Producer Ack

为了平衡可靠性和性能,Kafka 提供 3 种生产者确认模式

acks=0:Producer 发送消息后不需要等待确认,简单高效,但可能丢失消息

acks=1:默认 Producer 需等待 Leader 确认,平衡性能和可靠性,但此时若 Leader 故障则可能丢失消息

acks=-1(acks=all):需等待 Leader + 足够数量(min.insync.replicas)的 ISR 确认,若没有足够数量的 Broker,则会直接拒绝写入

 


https://kafka.apache.org/39/documentation.html

https://www.bilibili.com/video/BV15Bx7ewEDU

posted @ 2019-09-10 22:06  江湖小小白  阅读(516)  评论(0)    收藏  举报