kafka本地存储3-LogSegment

LogSegment是Kafka中存储消息的逻辑分段,它包含FileMessageSet、OffsetIndex和baseOffset等属性。LogSegment在达到特定条件如大小、时间间隔或索引满时会进行回滚操作。Log类管理多个LogSegment,并负责消息的追加、读取和索引重建。LogSegment的recover方法用于重建索引,truncateTo方法用于截断到指定偏移量。Log的append方法处理消息追加,包括检查消息大小、CRC校验和创建LogAppendInfo。read方法则根据偏移量和最大长度读取消息。整个Log结构保证了高效的数据存储和检索。
摘要由CSDN通过智能技术生成

LogSegment
class LogSegment( val log : FileMessageSet,
                 val index : OffsetIndex,
                
val baseOffset : Long, //这个Segment存储的消息的partition起始的消息偏移量
                
val indexIntervalBytes : Int,
                
val rollJitterMs : Long,
                 time: Time)

//LogSegment.rollJitterMs字段说明
 
//如果这个segment即将写满,就开始创建新的segment进行回滚,并返回需要写入的segment
   
//segment.size这个LogSegment已经写入的消息占用的字节大小
   
//1.目前的segment空闲字节不足,segment.size > config.segmentSize - messagesSize
   
//2.按照时间间隔进行回滚
   
//3.segment索引文件满,segment.index.isFull
   
//config.segmentMs是段对象存活的时间@param segmentMs
   
//为避免config.segmentMs后segment同时进行回滚,用@param segmentJitterMs 来错开进行回滚
 
//roll,进行回滚操作
 
//1.取出segments.lastEntry的segment,把索引文件缩小到当前存储的索引个数的长度
 
//2.创建LogSegment
 
//3.添加到成员变量this.segments
 
//key为这个Segment存储的消息的partition起始的消息偏移量
 
//value为LogSegment
 
//4.flush
 
//1).把this.recoveryPoint到newOffset的partition的绝对偏移量的segment列表,来逐个flush
 
//segment.flush就是把index和log文件进行flush
 
//2).用参数newOffset来设置this.recoveryPoint
  //3).this.lastflushedTime设置当前时间time.milliseconds


  //LogSegment.created创建这个LogSegment记录的时间戳
  var created = time.milliseconds
  //this.bytesSinceLastIndexEntry记录写入的字节数,如果字节数超过成员indexIntervalBytes,就开始写入到索引中
  private var bytesSinceLastIndexEntry = 0

  // 把消息集合写入到log中 ,如果bytesSinceLastIndexEntry字节超过indexIntervalBytes,
  //就先把下一条的绝对offset和在这个seg的物理字节偏移写入索引中
  def append(offset: Long, messages: ByteBufferMessageSet)
  //从startingFilePosition查找绝对offset的OffsetPosition信息
 
//先从索引中找一定的范围,之后再从log中具体的字节位置
 
//@参数offset 是在partition的绝对消息偏移量
 
//offset是在partition中的消息绝对位移
 
//position是partition中片段segment的物理的字节偏移量
  //case class OffsetPosition(val offset: Long, val position: Int)
  private[log] def translateOffset(offset: Long, startingFilePosition: Int = 0): OffsetPosition 
  //从startOffset开始读,两个maxOffset和maxSize参数为从段中读取数据的上限
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值