目录
Kafka架构记录
生产者kafka数据可靠性
消费者分区分配策略
Kafka事务
kafka常用命令
Kafka架构记录
kafka,是一个分布式的基于发布订阅的消息队列。消息模式包括,点对点,一对多。
kafka集群中,对于每个节点,每个主题都对应一个分区,用于提高负载能力,并且主题分区存在主从之分,在一个节点上为主分区,则在另一个节点上需要从分区副本,这是有zookeeper来实现的。
生产者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