0%

kafka log

Kafka log manager

梳理顺序:

大纲:

  • 以组件为单位,看组件之间的联系、接口,主要想展示数据大概的流动方向
  • 然后落在logmanager、replicamanager两个视角上
    • 看replica manager会有哪些动作
    • 每个组件结合kafka可用性和可靠性?
    • 每个组件内部看组件结构,有哪些主要的类
    • logmanager主要关注和磁盘的交互,看log怎么管理->segment
    • replicamanager主要关注kafka内部怎么管理partition,如何时分段、何时删除、分区状态管理
  • 看看kafka的test,从这里为切入点看看会关注什么内容

Log Manger

log manager的职责(注释):

The log manager is responsible for log creation, retrieval, and cleaning. All read and write operations are delegated to the individual log instances. The log manager maintains logs in one or more directories. New logs are created in the data directory with the fewest logs. No attempt is made to move partitions after the fact or balance based on size or I/O rate. A background thread handles log retention by periodically truncating excess log segments.

TODO:

  • 梳理log manager内部的类图、各个部分的接口
  • log manager怎么维护log信息,有哪些,都有什么用

log也不会直接去和disk交互,交给segment

接口

log manager

1
2
3
4
5
6
7
8
9
10
11
+ startup - 启动后台进程来flush日志和清理日志
+ shutdown - 关闭所有打开的logs
+ truncateTo - 把指定分区的offset设置为指定值,抛弃所有offset后所有的日志;同时需要进行一次checkpoint备份
+ truncateFullyAndStartAt - 把一个分区所有的日志都删除,并将开始的offset设置为指定值
+ checkpointRecoveryPointOffsets - 把当前所有log的恢复点写回磁盘
+ getLog - 获取指定分区的日志结构,(非entry记录)
+ createLog - 创建一个指定topic分区的日志文件,如果存在则返回对应的文件
+ asyncDelete - 异步删除指定分区,只是将其标记为删除
+ cleanupLogs - 删除所有可删除的分区
+ allLogs - 返回所有的分区log
+ logsByTopicPartition - 返回所有的分区log,以tp为key,log为value的键值对

log

1
2
3
4
5
6
7
8
9
+ numberOfSegments
+ close - 关闭一个日志文件,将这个日志下面的所有段文件关闭
+ append - 往一个日志追加一条记录(往活跃的segment写入)。可能会触发创建新的segment
+ read - 读取一批记录,从指定startoffset开始。
+ fetchOffsetsByTimestamp - 获取第一个时间戳大于等于指定时间戳记录的offset
+ convertToOffsetMetadata - 将一个消息的offset转换为关联的offset metadata数据
+ deleteOldSegments - 删除旧的segment
+ roll - 新建一个新的活跃segment
+ flush

segment

1
2
3
4
5
6
7
8
+ this(7args) - 创建segment对象,初始化filerecord对象
+ append - 从指定的offset开始,写入一批records,可能会产生一个新的索引记录。这个方法假定调用者已经加锁
+ read - 从一个segment中,读取指定范围的一批records,可能通过大小限制
+ recover - 在指定segment上执行recover,重建索引
+ truncateTo - 丢弃从指定offset之后所有的日志
+ flush
+ close
+ delete

FileRecords

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- isSlice
- start
- end
- shallowEntries
- size
- channel
- file
+ File
+ FileChannel
+ readInto - 将一批日志读取到指定的buffer
+ read - 读一批日志
+ append - 将一批日志追加到buffer
+ flush
+ close
+ delete
+ trim
+ truncateTo
+ writeTo

在kafka,有两种打开文件的方式:RandomAccessFile和FileInputStream,RandomAccessFile的特点:

  • 可以读取文件内容,也可以向文件输出数据
  • 支持随机访问,可以跳到文件的任意位置读写。与OutputStream、Writer等输出流不同的是,RandomAccessFile允许自由定义文件记录指针,RandomAccessFile可以不从开始的地方开始输出,因此RandomAccessFile可以向己存在的文件后追加内容。如果程序需要向已存在的文件后追加内容,则应该使用RandomAccessFile。
  • 只能读写文件,不能读写其他IO节点。

FileInputStream的特点:

  • 只读;从文件中读取数据
  • 以字节为单位进行读取 > FileInputStream is meant for reading streams of raw bytes such as image data
  • 是否会一次性把文件读取到内存中?

Replica Manager

Replica manager的职责:(有点混乱

  • 管理分区副本的状态:包括创建一个副本、删除一个副本以及副本状态的变化
  • 控制日志的写入
  • fetch日志
  • ISR的维护