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 | + startup - 启动后台进程来flush日志和清理日志 |
log
1 | + numberOfSegments |
segment
1 | + this(7args) - 创建segment对象,初始化filerecord对象 |
FileRecords
1 | - isSlice |
在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的维护