借鉴:https://blog.csdn.net/CHINACR07/article/details/129699173
https://blog.csdn.net/qq_53578500/article/details/126372922
https://blog.csdn.net/qq_38571892/article/details/115084423
https://blog.csdn.net/weixin_44873607/article/details/109037897
https://blog.csdn.net/csdnzhang365/article/details/104412692
数据存储形式借鉴链接
简介:
Kafka是最初由linkedin公司开发的,使用 scala语言编写
Kafka目前支持多种客户端的语言:java,python、c++、php等
现在:Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写(不需要数据库,直接写在磁盘)
是一个消息中间件,消息队列
一:Kafka发送数据流程
**Main线程:**在客户端将数据放入双端队列里
拦截器: 消息发送之前会调用前者方法,可以在发送之前假如处理逻辑,比如计费。在收到服务端ack响应后会触发后者方法。需要注意的是拦截器中不要加入过多的复杂业务逻辑,以免影响发送效率
序列化器: 生产者需要用序列化器(Serializer)把对象转换成字节数组才能通过网络发送给Kafka。而在对侧, 消费者需要用反序列化器(Deserializer)把从Kafka中收到的字节数组转换成相应的对象。
分区器: 如果消息ProducerRecord中指定了 partition字段,那么就不需要走分区器,直接加到对应的partition分区(即队列)。没有指定就通过分区器决定分区(哈希决定分区)
RecordAccumulator: 获取到缓存的消息之后,<Node,List>的形式保存数据,ProducerBatch就是图中的DQueue(双端队列)
batch.size:只有当队列DQueue中的数据达到batch.size之后,sender才会取数据发送(默认大小为16k)
linger.ms:如果队列DQueue中数据迟迟没有到达batch.size,那么sender线程在等待linger.ms设置的实践到达后就会取数据发送。(默认是0,表示没有延迟)
二:Topic分区个数
分区数并不是越多越好,一般分区数不要超过集群机器数量。分区数一般设置为:3-10 个
三:数据存储原理
数据是直接存储在磁盘中,保存在 /export/server/kafka_2.12-2.4.1/data中
消息是保存在以:「主题名-分区ID」的文件夹中的
创建一个主题topic-demo,查看它分区0下的日志结构:
partition中的数据文件: 一个partition文件夹里面有大小相等的segment数据文件(这个文件的具体大小可以在config/server.properties中进行设置)
partition中的segment file的组成: 由2部分组成,分别为index file和data file,这两个文件是一一对应的,后缀”.index”和”.log”分别表示索引文件和数据文件;
segment file 命名规则:partition的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset,ofsset的数值最大为64位(long类型),20位数字字符长度,没有数字用0填充。如下图所示:
segment file中index与data file对应关系图: index是索引文件,log是数据文件。log文件中一个message有一个index对应具体的物理偏移地址(需要根据首地址计算真正的地址)
message中的物理结构为:
partition中文件分段原因:
如果对于Kafka的一个topic而言,如果topic的partition中只有一个数据文件的话。新数据是添加在文件末尾(调用FileMessageSet的append方法),不论文件数据文件有多大,这个操作永远都是O(1)的。如果是要删除某些数据,就需要遍历整个数据文件;文件分段之后可以少遍历很多数据。
四:数据保留机制(基于时间,基于partition文件大小)
server.properity文件中设置保留机制
//topic的分区是以一堆segment文件存储的,这个控制每个segment的大小
log.segment.bytes=1073741824
//启用删除策略,直接删除,删除后的消息不可恢复
log.cleanup.policy=delete
//1、清理超过指定时间清理(一周)
log.retention.hours=168
//2、超过指定大小后,删除旧的消息 (1G)
log.retention.bytes=1073741824
1.基于时间的删除策略:删除修改时间在N天之前的日志(默认是一周)
2.日志数据超过指定的大小时(partition文件大小1G),执行删除操作。
四:与Zookeeper的关系(Zookeeper就是注册中心)
Kafka利用ZooKeeper来进行集群协调和元数据管理。包括Kafka Brokers的信息(Leader选举)、Topics和Partitions的状态、Consumer Groups和Offsets等
Broker在ZooKeeper中注册:一个节点,相当于一个机器,当节点失效时,ZooKeeper就会删除该节点,进行Leader选举
Topic在ZooKeeper中注册:多个Topic,每个Topic又被分为很多个分区。一般情况下,每个分区独立在存在一个Broker上,所有的这些Topic和Broker的对应关系都由ZooKeeper进行维护
Consumer(消费者)在ZooKeeper中注册:记录该消费分组消费的Topic信息,Offset
五:Kafka消息队列的作用
1.消息队列(异步处理)
2.流量削峰(消峰填谷)
3.解耦