一、Kafka的三大组件:Producer、Server、Consumer
1、Kafka的Producer写入消息
producer采用push(推)模式将消息发布到broker,每条消息,都被追加到分区中(顺序写到磁盘,比随机写内存效率高)。
kafka单partition的写入的流程· 分区的作用:方便容量扩展,可以多并发读写数据,所以我们会指定多个分区进行数据存储。
· 一般根据 event_key的hash % numPartitions来确定写入哪个分区,如果写入时没有指定key,则轮询写入每个分区;因此导致每个partition中消息是有序的,整体无序。
kafka多partition的写入的流程每条event数据写入partitionA中,并且只会写入partitionA_leader,当partitionA_leader写入完成后partitionA_flower节点再去partitionA_leader上异步拉取数据;默认ack为1,表示不会等待partitionA_flowers写入完成;如果设置ack为副本数或ack=-1,则等待副本全部写完,再写入下一条数据。
2、kafka的broker——保存消息
1、 创建topic,并指定分区和副本数
2、每个分区(partition)有一个leader,多个follower,pull数据时先寻找leader,只会读leader上的数据,leader和follower不会在一个节点上,leader节点宕机后,其中一个follower变成leader
3、 消息数据存在每个分区中,默认配置每条消息保存7天 或 分区达到1GB 后删除数据
3、Kafka的Consumer消费数据:
1、consumer采用pull(拉)模式从broker中读取数据。
2、如果一个消费者来消费同一个topic下不同分区的数据,会读完一个分区再读下一个分区
生产者(producer)API只有一套; 但是消费者(consumer)API有两套(高级API和低级API)
一、高级API:
Zookeeper管理offset(默认从最后一个开始读新数据,可以配置从开头读)
kafka server(kafka服务)管理分区、副本
二、低级API:
开发者自己控制offset,想从哪里读就从哪里读
// SimpleConsumer是Kafka用来读数据的类
// 通过send()方法获取元数据找到leader
TopicMetadataResponse metadataResponse = simpleConsumer.send(request); //通过metadataResponse获取topic元数据,在获取topic中每个分区的元数据
// fetch 抓取数据
FetchResponse response = simpleConsumer.fetch(fetchRequest);
// 解析抓取到的数据
ByteBufferMessageSet messageAndOffsets = response.messageSet(topic, partition);
二、数据、broker状态,consumer状态的存储
一、在本地存储原始消息数据:
1、hash取模得分区、kafka中每条消息有一个Key,用来确定 每条数据存储到哪个分区中
2、轮询
3、自定义分区
first主题(topic)的第0分区的数据格式二、在zookeeper存储kafka的元数据
first_topic的某个partition在zookeeper上的数据, 对应下图 kafka元数据的目录结构图三、存储consumer的offset数据
每个consumer有一个Key(broker+Topic+partition)的hash,再取模后 用来确定offset存到哪个系统文件中,Value是partitionMetaData。
1、使用zookeeper启动,zookeeper来存储offset
消费者 消费消息时,offset(消费到的下标)会保存在consumer本地和zookeeper中(由本地上传到zookeeper中,所以本地会保存offset)
使用zookeeper存储offset,对应下图 kafka元数据的目录/consumer结构图2、使用bootstrap启动,本地存储offset(在本地可以减少两节点交互),zookeeper存储其他数据
按consumer线程的序号对50取模,存到不同分区中三、某Flume对接Kafka案例
某Flume对接Kafka案例
网友评论