2018-08-26

2018-08-26  本文已影响0人  frmark

Kafka的基本概念

Kafka的数据存储

主要接收topic中partition数据的存储,partition是以文件夹的形式存在具体的borker本机上(为了效率,并不依赖hdfs,自己维护多份数据)

  1. segment文件的组成

    对于一个partition(在Broker中以文件夹的形式存在),里面又有很多大小相等的segment数据文件(这个文件具体大小可以在config/server.properties中进行设置),这种特性可以方便old segment file的快速删除。

    • segment file 组成:由2部分组成,分别为index file和data file,这两个文件是一一对应的,后缀”.index”和”.log”分别表示索引文件和数据文件;其中index文件结构很简单,每一行都是一个key,value对
      key 是消息的序号offset,value 是消息的物理位置偏移量.
    • segment file 命名规则:partition的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset,ofsset的数值最大为64位(long类型),20位数字字符长度,没有数字用0填充。如下图所示:
  2. 查找:给定一个offset,查找message。过程如下:根据segment文件的命名,进行二分查找,找到对应的index和log文件,然后进入index 顺序查找到小于或等于offset的key(为了保证快速查找使用稀疏索引),拿到该index文件中offset对应的index,在log文件中顺序查找到需要查找的offset的message。

kafka日志清理

有两种策略:

日志压缩保证了:

  1. 任何消费者如果能够赶上Log的Head部分,它就会看到写入的每条消息,这些消息都是顺序递增(中间不会间断)的offset
  2. 总是维持消息的有序性,压缩并不会对消息进行重新排序,而是移除一些消息
  3. 每条消息的offset永远不会被改变,它是日志文件标识位置的永久编号
  4. 读取/消费时如果从最开始的offset=0开始,那么至少可以看到所有记录按照它们写入的顺序得到的最终状态(状态指的是value,相同key不同value,最终的状态以最新的value为准):因为这种场景下写入顺序和读取顺序是一致的,写入时和读取时offset都是不断递增。举例写入key1的value在offset=1和offst=5的值分别是v1和v2,那么读取到offset=1时,最终的状态(value值)是v1,读取到offset=5时,最终状态是v2(不能指望说读取到offset=1时就要求状态是v2)
上一篇 下一篇

猜你喜欢

热点阅读