Kafka主要知识点

1、Kafka描述

Kafka最初由LinkedIn开发和维护。后成为Apache软件基金会的一个开源消息系统。
Kafka是一个高吞量,高并发,可分区的分布式开源消息系统(消息中间键)。
Kafka以集群的方式运行,有一个或多个节点组成,其中每一个节点称之为一个broker。
依赖zookeeper存储一写元数据信息(比如记录曾经消费某个topic的消费者组名称,Consumer最后消费的每个分区消息的offset值等)。

topic
可以理解为一个消息队列,是对一组消息的归纳。举个例子,比如我们可以用Kafka来临时存储多个网站的log日志数据,那怎么存储好让我们区分开哪个网站的数据存储到哪了呢?此时我们就可以使用kafka的topic进行一个归纳,网站A的数据存储到topicA中,网站B的数据存储到topicB中,如果我们需要对网站A的log日志数据进行一个分析,我们可以直接让我们的Consumer去消费读取topicA存储的数据即可。
一个broker节点(集群中的单个服务器)可以包含多个topic。
Kafka会对topic根据指定的分区数进行分区,每个分区将会被存储到不同的broker(如果分区数大于节点数,一个节点可能会存储多个分区)在kafka的配置文件中,通过log.dirs=/logs/kafka配置kafka的消息存放路径,假如节点A存储了某个topic的第0个分区,那么该节点的/logs/kafka目录下,将会有一个按照topicname-0的目录,用于存储该分区的里面的数据。
一个分区下又会被分成一个或多个segment,每个segment的大小相等,但是消息数不一定相等。每个segment对应着两个文件,分别是000…0.index和000…0.log,其中第一个segment的完整命名为0000000000000000000.index和0000000000000000000.log,第二个segment命名0000000000000467832.index和0000000000000467832.log。长度为19个字符,最后的数字代表当前segment存储的消息的offset值。index文件为消息的offset索引,log文件为消息数据。Consumer消费消息时,根据Consumer自己维护的已经消费的offset值(存储到zk中)查找对应的index消息索引文件,然后根据索引文件中offset值对应的消息在log文件中的位置(索引值还对应这一个值,相当于key-value的形式),再根据得到的位置使用二分查找算法查找log文件,从而找到该offset对应的消息数据。
这里写图片描述

查找segment file:
00000000000000000000.index表示最开始的文件,起始偏移量(offset)为1
00000000000000368769.index的消息量起始偏移量为368770 = 368769 + 1
00000000000000737337.index的起始偏移量为737338=737337 + 1
其他后续文件依次类推。
以起始偏移量命名并排序这些文件,只要根据offset 二分查找文件列表,就可以快速定位到具体文件。当offset=368776时定位到00000000000000368769.index和对应log文件。
由上面的segment文件结果可以知道,因为index文件里面的数据是有序的,所以一个分区中的消息的offset是有序的,也即单个分区中的消息是能够保证有序的。
但是每个分区下,划分的segment是按照相同的策略来划分的,就是说,partition0下会有一组0000000000000000000.index和0000000000000000000.log文件,那么partition1下也会有一一组这样的文件,从而就不能保证分区间的数据的有序性了。

Producer
消息的生产者,可以通过网络将数据发送到指定的kafka topic中。如果上面的例子,可以现在kafka中创建一个topicA,然后用Flume采集网站A的数据发送到topicA中,这里Flume就充当一个消息生产者的角色。至于一条消息,可以分发到topic中的哪一个分区,我们也可以自定义分区策略来实现,就如同MapReduce中MapTask的结果数据分区一样,可以自定义分区规则,指定一条消息存放到那个分区。比如kafka里面自带的模拟生产者的程序,我们可以通过配置文件中partitioner.class变量来指定自定义的分区类。

Consumer
消息的消费者,从指定的kafka topic中消费消息数据。

ConsumerGroup
消息的消费者组。可以包含一个或多个Consumer,一个组中Consumer的数量最大值最好等于topic的分区数,等于时,能将kafka的高并发发挥到最佳。
kafka规定,一个topic的分区只能同时被一个Consumer消费(一个topic中一个分区的数据不会被一个ConsumerGroup重复消费)。而且如果一个组内已经有一个Consumer已经消费过,那么这个组的其他Consumer也就不能再继续消费该分区的数据了(如果想再重复消费,1.可以重置Consumer维护在zk中的offset值,2.重新使用另外一个ConsumerGroup)。这种策略可以保证一个topic中的数据不会被一个ConsumerGroup重复消费,导致数据的重复。

Kafka的Consumer均衡算法:后续补上。

以上很多观点都是属于个人推断得出,若有不对,恳请指出,谢谢。

猜你喜欢

转载自blog.csdn.net/LLJJYY001/article/details/81491179