1-Intro
什么是 Controller ?
- 每个
Broker会利用zooKeeper做主从选举,从中选择出来一个Controller
这个 Controller 会负责处理 元数据的管理.
Topic和Partition的分配, 这些MetaInfo同时存储在Zk中Broker监听并缓存在内存中.Controller会 监听Broker的 健康状态,做Rebalance操作
Broker 如何处理 data
- 一个
Parition就是一个物理上的文件夹 ; - 每个文件夹中的文件切分策略是 大小, 默认是
1G, 像所有的日志一样, 到了1G就滚动生成一个新的文件 - 使用 稀疏索引和
MMap虚拟映射来管理 Offset的生成由Primary Partition决定,Replica Partition仅仅作为数据的备份,是一种 经典的单主模型策略, 其原子性是由内核的O_APPEND同时实现追加文件写操作,并返回最新的Offset
Consumer Group
- 每个
Consumer Group都会有自己的Coordinator来管理Consumer Group的元数据 ; - 这个元信息比较大,不会存储在
ZK中,而是用一个专门的topic来管理,__consume_offsets来存储 ; - 消费的并行度由
Parition数量决定的, 一个Parition只能被一个Consume Group中的一个Consumer消费 ; - 在消费者去读取数据的时候,用的
Sendfile系统调用实现零拷贝的顺序读, 从而极大的提高性能
2-KRaft
KRaft 是 Kafka 的新的元数据管理机制, 用来彻底替换掉 Zk, 也就是上面的这些功能被直接取代了:
- 基于
Raft算法来选择Controller - 存储
Topic和Parition的元信息 Consume Group的Coordinator选举
3-Usage
Kafka 权威指南讲的不错.