一、磁盘的认识

kafka 删除策略没生效 kafka消息删除策略_kafka 删除策略没生效


1、但需要从磁盘读取数据时候,要确定读取的数据在哪个磁道,哪个扇区

–首先必须找到柱面,即磁头需要移动对准响应的磁道,这个过程叫做寻道,所以耗费的时间叫做寻道时间
–然后目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间,一次访问磁盘请求(读/写)完成的过程有三个动作组成
(1)寻道时间:磁头移动定位到指定磁道的时间
(2)旋转延迟:等待指定扇区从磁头下旋转经过的时间
(3)数据传输:数据从磁盘、内容、网络之间的实际传输时间
由于存储介质的特性,磁盘本身存取就比主存慢,再加上机械运动耗费,磁盘的存取速度往往是主存的百分之一甚至千分之一。

2、如何提高磁盘的存储效率
kafka建立在低廉的普通服务器上是必须考虑的问题
根据数据的局部性原理,有如下方法:
(1)预读或者提前读
(2)合并写–多个逻辑上的写操作合并成一个大的物理写操作

即采用磁盘顺序读写(就在当前磁道,不需要寻道时间,只需要很少的旋转时间)。实验测试结果:在一个6 * 7200rpm sata raid-5的磁盘阵列上线性写的速度大概是300M/S,但是随机写的速度只有50K/s,两者相差近1000倍。

二、kafka消息的写入原理

一般的数据从文件传到套接字的路径如下
(1)操作系统将数据从磁盘读到内核空间的也缓存中
(2)应用将数据从内和空间读到用户空间的缓存中
(3)应用将数据写回内存空间的套接字缓存中
(4)操作系统将数据从套接字缓存写到网卡缓存中,以便将数据经网络发出去

特点:
这样做效率明显较低,这里涉及到4次拷贝,两次系统调用!(磁盘到内核空间调用以及套接字的网卡缓存调用)
优化:
如果使用sendfile(Java中对应FileChannel.transferTo的API接口),两次拷贝可以避免:允许操作系统将数据直接从页面缓存发送到网络上。优化后,两次拷贝,一次是磁盘到内核空间,一次是从内核空间到网卡拷贝,即(2)和(3)步骤不在需要。

之所以速度块,原因如下:
(1)afka基于磁盘的顺序写比随机写快很多
(2)数据写入和读取的零字节拷贝(不是不需要拷贝而是不需要到用户空间)
kafka生产和消费的时候都不需要用户空间,所以速度块
如下为生产消费的数据流
生产的时候
网络----> 页缓存(pagecache)---->磁盘
中间多了一层pagecache是因为kafka的原理是生产一次可以消费多次,供消费者读取!

消费的时候
磁盘---->网络

数据在生产和消费的过程中,不需要拷贝到用户空间中(不是不需要拷贝而是不需要到用户空间)

三、kafka的topic信息

进入kafka安装目录bin

cd /usr/local/kafka/bin

列举所有的topic信息

./kafka-topics.sh --list --zookeeper kafka1:2181

kafka 删除策略没生效 kafka消息删除策略_kafka 删除策略没生效_02


查看某topic信息

./kafka-topics.sh --describe --zookeeper kafka1:2181 --topic test-topic

kafka 删除策略没生效 kafka消息删除策略_缓存_03


可以看到test-topic有一个分区,3个备份(副本-包括自己),分区0(编号)的leader为broker2,副本有1,2,3机器,isr:处于同步中的列表有2,1,3

这里我们配置的集群的机器的日志存储目录为

broker.id=1    #当前机器在集群中的唯一标识,和zookeeper的myid性质一样
listeners=PLAINTEXT://192.168.12.60:9092
log.dirs=/usr/local/kafka/data
zookeeper.connect=192.168.12.60:2181,192.168.12.61:2181,192.168.12.62:2181

如上所示,broker1的日志目录在/usr/local/kafka/data,所以我们进入改文件目录

cd /usr/local/kafka/data 然后查看对应的日志目录信息

kafka 删除策略没生效 kafka消息删除策略_kafka_04


可以看到test-topic-0也就是test-topic主题的0分区目录(按分区目录存储该分区的日志信息)

cd /usr/local/kafka/data/test-topic-0
ls

kafka 删除策略没生效 kafka消息删除策略_数据_05


可以看到index和log文件

kafka 删除策略没生效 kafka消息删除策略_数据_06

四、kafka消息的删除原理

kafka在删除日志的时候,从最久的日志段(一整个文件为一个日志段,包含n条消息)开始删除(按日志段为单位进行删除),然后逐步向前推进,直到某个日志段不满足条件位置,删除条件为:
(1)满足给定条件predicate(驻留时间:配置项log.retention.{ms,minutes,hours}和最大字节数:log.retention.bytesz指定);
(2)不能是当前激活日志段(超过指定时间但是正在使用中–比如只有一个分区,正在操作中)
(3)大小不能小于日志段的最小大小(指正在激活的日志,且小于配置项:log.segment.bytes)
(4)要删除的是否是所有日志段,如果是的话直接调用roll方法进行切分,因为至少保留一个日志段。

kafka删除日志的流程图

kafka 删除策略没生效 kafka消息删除策略_数据_07


log.retention.check.interval.ms时间在启动scheduler检查程序是否有哪些删除,log.flush.scheduler.interval.ms这么久时间检查是否需要刷盘,有则刷入磁盘。启动后一直检测是否压缩,是否压缩log.cleaner.enable控制。