Kafka(下)
前言
在 大数据之Kafka(上)中介绍了Kafka的基本概念,包括:Kakfa的定义、Kafka的架构、Kafka的特点等。本文会介绍有关Kafka的数据生产、消费以及分区的相关知识。
一、kafka生产数据的应答机制
1 :生产者发送数据(kafka默认),等待Leader应答,如果应答完成,才发送下一条数据,不关心follower是否接受成功,效率会慢一些,但是数据比较安全。但是在leader保存数据成功后,突然宕机,此时follower还没有保存数据,那么数据就会丢失。
0 :生产者发送数据,不关心数据是否到达kafka,直接发送下一条,效率高但是数据丢失的可能性大
-1(all) :生产者发送数据,需要等待所有副本(follower+leader)的应答,这种方式效率最低但是数据也最安全。
二、kafka生产数据
生产者通过sender向集群询问topic的分区信息,两者建立连接,集群将信息返回给生产者(因为Broker的信息存储在zookeeper中,集群和zookeeper一直连接)。生产者生产数据到p0,p1中,但是并不是每生产一个数据就向集群中传输一个数据,而是有一个双端队列(DQ)用来存储数据。Sender会定期访问DQ,如果队列满了或者到达了数据的传输时间,便将数据传输到集群中。
DQ:正常的队列是一边进一边出,DQ是两边都可以进出,避免在数据被sender读出时失败,DQ可以再将数据写会到队列中。如果是普通队列,数据取出失败,就会将失败的数据追加到队列头部,打乱了数据的顺序。
三、kafka的数据消费
3.1 kafka的数据消费
消费者组先访问zookeeper获取集群的相关信息(老版本的kafka,新版本的kafka在集群中就会有相关信息)。得到后,再去读取数据,读取数据同样先放到一个缓冲区中再读入。
3.2 kafka的再平衡
如果原来有三个分区,A消费p0,B =消费p1,p2,此时又多了一个消费者,此时消费者会触发再平衡的效果。此时就会取消目前正在消费的状态,重新获取集群的信息,再重新分配消费(在消费者组中选出一个leader来分)
四、kafka消费方式
kafka的消费者采用pull(拉)模式从broker中读取数据。因为push模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的,他的目标是以最快的速度将数据传递出去,很容易造成消费者来不及处理数据。
五、kafka中副本的数据存储机制
问题:当向Leader中写入数据后,follower还没有来的及取数据,此时leader挂掉,follower会成为新的leader,那么数据如何同步?
在kafka中通过HW(High WaterMark 高水位)和 LEO(Log End Offset 日志最后偏移)来进行副本之间的数据同步,同时这也是保证所有消费者端数据一致性的策略;其中HW取自所有副本中LEO的最小值
初始的Leader Follower状态:
Leader中新增一条数据:
此时Leader中的LEO变为4,但是因为HW还是3,所以用户还是只能得到前三条数据;Follower会定期的访问Leader,发现Leader的LEO变化了,就要取出数据,此时
(1)第一种情况,此时Leader挂掉了
Follower的HW 和 LEO都不变,此时follower变成Leader,用户还是只能看到前三条,所以对于用户来说,数据并没有丢失。至于第四条数据重新发送就可以。
(2)第二种情况,Follower成功拿到数据,在向leader发送确认消息的时候,Leader挂掉
此时,follower的LEO变为4,由于Leader挂掉,follower成为Leader,所以他的HW也变为4(最小的LEO此时也是4),所以用户可以看到四条数据,数据仍然没有丢失。
(3)第三种情况,Follower成功拿到数据,在向leader发送确认消息的时候,Leader收到
六、kafka 分区
6.1 分区原因
(1)方便在集群中扩展,每个partition可以通过调整以适应他所在的机器,而一个topic又可以由多个partition组成,因此整个集群就可以适应任意大小的数据;
(2)可以提高并发,因为可以以partition为单位读写了。
6.2 分区选择原则
(1) 指定了分区,直接使用;
(2) 未指定分区但是指定了key,通过对key进行hash出一个分区;
(3) 都未指定,使用轮询选出一个partition
6.3 分区消费策略
6.3.1 Range 范围分区策略
该策略是对每个 topic 而言的。首先对同一个 topic 里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。假如现在有 10 个分区,3 个消费者,排序后的分区将会是0,1,2,3,4,5,6,7,8,9;消费者排序完之后将会是C1-0,C2-0,C3-0。通过 partitions数/consumer数 来决定每个消费者应该消费几个分区。如果除不尽,那么前面几个消费者将会多消费 1 个分区。
6.3.2 RoundRobin 分区策略
轮询分区策略,是把所有的 partition 和所有的 consumer 都列出来,然后按照 hascode 进行排序,最后通过轮询算法来分配 partition 给到各个消费者。
总结
在 大数据之Kafka(上)中介绍了Kafka的基本概念,包括:Kakfa的定义、Kafka的架构、Kafka的特点等。本文介绍了有关Kafka的数据生产、消费以及分区的相关知识,如果有不足之处或者表述不当的地方欢迎大家指正。