1. 概念
- AR、ISR、OSR
- AR 所有副本
- ISR 和leader副本保持一定程度同步的副本(包括leader),参数replica.lag.max.messagets(不好把握,已废弃)和replica.lag.time.max.ms(副本上一次追齐leader LEO的时间过去了多久)
- OSR AR - ISR
- HW、LEO、LW
- HW 所有ISR中最小的LEO
- LEO 下一条写入的offset
- LW AR中最小的logStartOffset
- ISR伸缩
- 缩容 isr-expiration任务定时检测失效副本(功能失效和同步失效),isr-change-propagation通过zk将失效ISR同步给控制器
- 扩容 追上leader的HW的副本就有资格进入ISR,扩容的步骤也依赖zk,类似缩容
- 为什么不支持读写分离
kafka为啥需要读写分离呢?读写分离是为了降低主库的读负载,kafka的设计就是多个主,负载均衡。读写分离没什么实质的好处,还会带来主从同步期间的数据不一致问题。
2. 用途
3. 设计
3.1 主要优点
作为大型公司的统一实时消息系统,需要满足:
- 吞吐量高
- 快
3.2 性能相关的设计
- 磁盘
- 直接写入操作系统页缓存,而不是使用堆内缓存。好处:
- 省了堆缓存的内存容量
- 避免对象开销,java对象的开销大
- gc负担
- os管理,即使kafka挂了,os没挂,依旧可以使用
- 追加写,可访问空间无限,同时避免多次磁盘寻址(对数级别,数据库不行,因为需要增删查改,消息队列只用顺序读写)
- 读写空中接力
如果producer的生产速度和consume的消费速度相差不大,写入和读取都在页缓存中进行,磁盘Io很少,效率很高
- 直接写入操作系统页缓存,而不是使用堆内缓存。好处:
- 网络
- 消息块,减少小型的IO,将多个消息打包
- 零拷贝 sendfile + mmap
linux下零拷贝实现的几种方式:- sendfile
只能用于文件传套接字。只有一次cpu参与的拷贝,内核空间 -> socket 缓冲。借助硬件支持,可以把最后一次cpu拷贝也消除,直接从内核空间到网卡 - mmap
用户直接操作内核空间,跳过用户空间 - 直接IO
跨过内核,用户态直接访问硬件 - splice
描述符至少有一个是管道 - 写时复制
- 等等
- sendfile
- 压缩
3.3 交付语义
- At most once
- At least once
- Exactly once
3.1. 如何实现不丢消息(At least oce)
前提条件:
- 已提交的消息,也就是收到ack的消息,至于是几个broker确认由自己决定,取决于对性能和可靠性的偏好
- 至少一个存储消息的broker存活
producer:
- ack=all
consumer:
- 先消费,后commit
broker:
- unclean.leader.election.enable = false,禁止ISR以外的节点选为leader
- replication.factor >= 3,至少三副本
- min.insync.replicas > 1,写入大于1才认为已提交,acks=all时确认的最小个数,如果ack=all且ISR个数小于min.insync.replicas,写入报错
3.2. 如何实现正好一次(Exactly once)
前提:
版本>=0.11.0.0
kafka 保证的是其stream中的exactly once
- 幂等producer
解决了重复提交时的数据重复,实现了单session、单partition幂等。依靠的是pid+消息sequence - 事务性
幂等没有解决的问题:1)跨partition幂等 2)跨session幂等,即producer挂了,pid会重新生成,也就无法保证幂等了
同时,事务性保证了发送消息和提交commit操作的原子性,这就可以去实现stream操作的exactly once语义了
3.3. 消息有序
before 0.11.0.0
max.in.flight.requests.per.connection = 1
after
使用事务producer就可以
3.3. 日志格式
文件名:第一个offset.kafka
![](https://img.haomeiwen.com/i16586313/ec8329a67afea814.png)
- 写
两个刷盘配置,M条和S秒,保证最多丢失M条数据或者N秒数据 - 读
客户端提供一个offset和最大块大小S来读,返回S位,S需要大于所有单条数据,如果不是会重试,翻倍S
broker根据offset查找相应的文件,在文件中使用二分查找来找到对应的消息
3.4时间轮
一些延时操作的实现机制
https://zhuanlan.zhihu.com/p/121483218
网友评论