目录

Kafka架构记录

生产者kafka数据可靠性

消费者分区分配策略

Kafka事务

kafka常用命令


Kafka架构记录

kafka,是一个分布式的基于发布订阅的消息队列。消息模式包括,点对点,一对多。

kafka集群中,对于每个节点,每个主题都对应一个分区,用于提高负载能力,并且主题分区存在主从之分,在一个节点上为主分区,则在另一个节点上需要从分区副本,这是有zookeeper来实现的。

双活消费kafka kafka双活架构_java

生产者kafka数据可靠性

1.副本数据同步策略,选用全部同步完成才发送ack(选举只需n+1台机器),而不是半数机制,原因是半数机制下选举leader需要2n+1台机器。

2.ISR,kafka的leader(某个topic+partition)维护一个和leader保持同步的follower集合,如果follower长时间未同步数据,则该follower将被踢出ISR。当leader发生故障,就从ISR选举新leader。

3.ack应答机制,三种可靠性级别:

0,不等待broker的ack,最低延迟。当broker故障时有可能丢数据。At Most Once;

1,broker partition的leader落盘后返回ack。若follower同步完成之前故障,丢数据;

-1(all),leader和follower(ISR的follower)落盘完成后才返回ack。如果follower同步完成,broker发送ack之前,leader故障,则会数据重复。At Least Once。当需要保证数据既不重复也不丢失,则需要Exactly Once,Exactly Once = 幂等性 + At Least Once。enable.idompotence设置为true开启幂等性。

*当所有follower由于网络延迟长时间未同步,被踢出ISR集合中,此时leader为单节点,落盘后就返回ack(即退化为ack=1的情况),然后leader挂了,此时也会发生数据丢失!(少数情况)

4.log文件的HW和LEO

HW,消息对消费者可见的最大偏移,高水位High Watermark

LEO,表示各个副本自己最大的消息偏移量

同步时保证HW之后的数据一致,“多退少补”

消费者分区分配策略

如果一个组内的消费者多于分区数,则存在消费者没有分区可以消费。

*当组内消费者数量发生变化时会触发分区分配策略和rebalance

1.RoundRobin轮询,同一组消费的所有主题T1(p0 p1 p2)和T2(p0 p1 p2),将被哈希排序如T2p1 T1p0 ....,组内消费者按轮询方式分配主题分区。


2020-10-22 14:38:14 add

RoundRobin轮询方式:

当组内成员变化时,列出所有该组内消费者订阅的主题以及分区,按轮询方式分配给消费组里的消费者。

例如,消费组内有两个消费者C1和C2,如果C1只订阅了A(分区有3个),C2只订阅了B(分区有3个),则列出所有该组内消费者订阅的主题以及分区:

A1、A2、A3、B1、B2、B3,轮训分配给C1、C2,如下:

C1:A1、A3、B2

C2:A2、B1、B3

此时,发现C1和C2都被分配到了其他主题。

因此,采用RoundRobin策略应该保证组内每个消费者订阅的主题一致。


2.Range范围(默认)

同一个组中的消费者需要消费多个不同的主题时(例如,同一组消费者A、B,A消费T1和T2,B消费T2和T3),需要使用Range策略。

消费者offset的维护:

offset由group+topic+patition唯一确定。

0.9版本之后,offset存储在kafka本地,topic名称为__consumer_offset

Kafka事务

需要结合幂等性来说明,当消费者ack可靠性级别设置为-1时,可能会存在数据重复的问题,可以通过设置参数开启幂等性开关,实现Exactly Once,broker中保存生产者PID信息,使信息只写一次,极端情况下,当生产者也挂了并重启(PID改变),重新发送,此时kafka认为是另一个生产者的信息,那么依然会存在数据重复的问题。

kafka事务中Producer事务解决了生产者重启后PID改变的问题,实现跨分区会话的事务。broker引入全局唯一TransactionID,Producer重启将通过TransactionID来获取原PID。

kafka常用命令

列出消息主题 kafka-topics.sh --list --zookeeper zookeeper1:2181,zookeeper2:2181,zookeeper3:2181

创建消息主题, kafka-topics.sh --create --zookeeper zookeeper1:2181,zookeeper2:2181,zookeeper3:2181 --partitions 2 --replication-factor 2 --topic hello

查看主题详情 kafka-topics.sh --describe --topic hello --zookeeper zookeeper1:2181,zookeeper2:2181,zookeeper3:2181

删除主题 kafka-topics.sh --zookeeper zookeeper1:2181,zookeeper2:2181,zookeeper3:2181 --delete --topic hello

生产者 kafka-console-producer.sh --broker-list kafka1:9092,kafka2:9092 --topic hello

消费者 kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092 --topic hello --from-beginning