1.1、工作流程
kafka整体工作流程图:
通过这张图可以看出消费者消费生产者产生的消息,消费者有消费者组的概念,消息属于某一个主题topic,并且消息在产生的时候会进行消息的分区存放可以搭建集群,不同分区隶属于不同的节点。一个主题的某一个分区不会放在同一个节点,这是为了防止消息随着服务器的宕机丢失
Kafka 生产端发送消息的机制是 Kafka 高吞吐的基础,生产端的基本流程如下图所示:
在kafka中,消息以topic进行分类:
1.指定生产者向某一个topic生产消息
./bin/kafka-console-producer.sh --broker-list CentOSA:9092,CentOSB:9092,CentOSC:9092 --topic topic01
2.定义消费者指定消费的topic和所属组
./bin/kafka-console-consumer.sh --bootstrap-server CentOSA:9092,CentOSB:9092,CentOSC:9092 --topic topic01 --group g1 --property print.key=true --property print.value=true --property key.separator=,
topic是逻辑上的概念,partiotion是物理上的概念。每个 partition 对应于一个 log 文件,该 log 文件中存储的就是 producer 生产的数据。(topic = N partition,partition = log)
producer生产的数据会放在log文件的末尾,每条数据都有自己的offset,消费者组中的消费者每消费一个消息,都会实时记录自己消费到了哪个offset,以便出错时恢复从上次的位置继续消费。(producer -> log with offset -> consumer(s))
1.2、文件存储机制
由于生产者生产的消息会不断追加到 log 文件末尾, 为防止 log 文件过大导致数据定位效率低下, Kafka 采取了分片和索引机制,将每个 partition 分为多个 segment。
每个 segment对应两个文件“.index”文件和“.log”文件。 这些文件位于一个文件夹下, 该文件夹的命名规则为: topic 名称+分区序号。例如, first 这个 topic 有三个分区,则其对应的文件夹为 first-0,first-1,first-2。
00000000000000000000.index
00000000000000000000.log
00000000000000170410.index
00000000000000170410.log
00000000000000239430.index
00000000000000239430.log
index 和 log 文件以当前 segment 的第一条消息的 offset(偏移量) 命名。下图为 index 文件和 log文件的结构示意图。
index 文件和 log文件详解:
“.index”文件存储大量的索引信息,“.log”文件存储大量的数据,索引文件中的元数据指向对应数据文件中 message 的物理偏移地址。
值得注意的是:.index文件是很大的,并且其中的每一条数据的大小都是一样的(如上图所示,左边存放的是消息索引值;右边对应的是消息真实的物理偏移地址,还有消息的内存大小),这样的好处是:有利于快速定位。例如上述寻找offet=3的message,先通过二分法寻找索引存放在哪个segment中,然后(假设每条数据的大小为1k),3*1k,得到索引信息,进而找到message具体的信息。