大数据之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的数据生产、消费以及分区的相关知识,如果有不足之处或者表述不当的地方欢迎大家指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值