1.前言
我在之前的文章当中,介绍了很多有关于Flink的相关知识和内容。因为我目前阶段所做的学习和工作的内容就是围绕着这一部分知识进行的。但是在进行数据计算的时候,FLink是没有办法单独进行计算的,所以还需要使用消息队列与Flink结合起来,那这个消息队列,必然是Kafka。因为Kafka与Flink实在是太契合了。所以接下来,就让我从Kafka的组成架构开始,围绕着kafka的生产者、kafka本身、kafka消费者这几个阶段,来为大家介绍一下这款与flink亲密度极高的消息队列。
2.kafka简单介绍
大家都知道kafka是一个消息队列,它的本质就是完成对数据的传输工作。这就是代表着,Kafka除了传输功能外的其他功能,都是为了Kafka能够更好的传输数据而延伸出来的。就比如,开发人员希望Kafka能够更好的传输数据,所以为它设计了分布式结构,由多个broker组成一个大的Kafka集群。然后为了提高吞吐量,又引入了topic的概念,让数据的发送方和拉取方都面向对应的topic进行工作,topic本身实际上是一个逻辑上的概念,在其内部是由partition完成工作的。也就是说,一个topic内部可能会有多个partition,多个partition一起来完成对应topic的工作内容,使得kafka的并发能力得到了增强,数据的传输就会更棒。
但用这种方式虽然提高的传输的效率,但是传输的时候数据还会面临丢失的问题,所以这个时候就引入了副本、落盘、偏移量这些概念。大家设想一下,当数据的发送方向kafka传输数据,topic接收到数据之后,由其附属的partition来进行工作,如果partition坏掉了,那这个partition中的数据就会丢失,那整体的程序就面临着数据丢失的危害,所以针对partition分区,要对每一个分区设置规定数量的副本数,这样即使正在工作的分区坏掉了,也会有其他的副本分区代替它进行工作,这样就在partition阶段保证了数据的不丢失,但是设置副本之后,还需要知道哪个分区是主、哪个分区是从。这就引入了ISR队列机制。partition阶段的东西处理完了之后,又有新的问题出现。如果万一突然停电,那就算kafka中有一万个分区副本也是毛用没有,所以为了能够让数据即使发生停电也不丢数据,kafka又加入了落盘的概念,将数据保存在磁盘上,停电了也没什么问题了。
那就算将数据保存在磁盘上,也会有新的问题,数据一旦落盘就要序列化和反序列化,并且还有进行IO操作,这就很浪费时间,所以Kfaka开发者们又重新定义了序列化机制,并且还加入了磁盘顺序写入的概念,让数据的落盘能达到600M/s。这样就解决了数据丢失的问题。
接下来就是最后一个问题了,故障恢复之后,怎么找到故障之前处理到哪条数据了呢?这个时候就加入了偏移量的概念,由kafka内置的系统主题来维护所有topic的数据偏移量,当故障恢复的情况一旦发生,就会读取对应topic中的偏移量,在落盘处找到其对应的数据,恢复到之前的位置。
上面的这些内容,就是kafka常用到的所有概念了,只不过现阶段我描述的比较笼统,不过请大家放心,在后面我会从生产者、kafka本身、消费者这三个角度来给朋友们讲解,算上这篇文章一共会有4个,希望大家读完这篇文章之后,能够对kafka的整体有一个清晰的认识。
3.kafka组成架构
在kafka工作的时候,需要明确一些概念,才好方便大家使用。为了大家能够更好的明白我在说什么,我先用一个图来表示kafka工作的时候,都有哪些东西在干活。
这个图大概就是这个样子的,如果kafka想要运行,上面的这些内容是一个都不能少的。不过我感觉我的图画的有点乱,所以接下来我先给大家一一介绍这些组件,然后再从宏观的角度上去讲讲工作时候的流程。
1.生产者:生产者的概念是根据kafka提出的,指的就是负责向kafka发送数据的客户端。
2.消费者:消费者的概念也是根据kafka提出的,指的就是从kafka中拉取数据的客户端。
3.消费者组:是由多个消费者联合起来,形成的一个“大”的消费者,它能够同时获取一个topic中多个partition中的数据进行消费,通过提升吞吐量的方式加快数据的处理速度。如果kafka一个分区内部有多个partition,那这个时候可以设置Flink的并行度为分区数,或者是小于分区数的二进制数。
4.kafka集群:由多个broker组成,以集群的方式处理数据。
5.broker:一台kafka服务器就是一个broker,一个broker里面可以包含很多个topic。
6.topic:比较重要的一个概念,生产者和消费者都是面向它进行工作的,但它本身是一个逻辑上的概念。可以把它看成是一个消息队列。
7.partition:这个概念也很重要,因为它是kafka组件中主要负责干活的那一个。它本身是一个内部有序的消息队列,多个partition能够组成一个topic,并且如果topic足够大,甚至能够散落在很多个broker上。
8.Replica:副本,大家可以看我的这个图,是不是partition后面有一个字母L或者F,L就是leader,F就是Follow。L是干活的,F是保证其数据不丢失的。
9.Leader:分区副本中的大哥,负责干活的那一个。
10.Follow:分区副本中的小弟,负责维护数据副本,平时就从leader上同步点数据,然后随时等待上位。
11.zk集群:没有zk就没办法使用kafka,因为zk上维护了kafka一些重要的信息内容,就比如分区副本的名称以及其主从身份信息。
上述的这些概念就是kafka运行时候的基本概念了,掌握了它们之后就对kafka有一个基本的认知了。不过接下来我还要给大家唠叨一下,kafka轻度级别的工作流程。
1.生产者发送数据给kafka中对应的topic。
2.topic是逻辑上的概念,底层干活的是内部有序分区间无序的partition,当有数据进来partition就开始工作。
3.partition工作分为Leader工作和Follower工作,Leader负责接收数据,Follower负责从Leader上同步数据。这个时候能被消费者消费到的数据内容,是同步速度最慢的那个Follower的数据位置的数据。
4.消费者进行数据消费。