首先,从kafka 2.4版本开始,支持follower对外提供读服务,可以设定哪些follower副本可以对外提供服务,主要是为了避免跨机房的数据消费。带来的额外问题是主副本数据同步的问题,isr中副本的最大延迟时间replica.fetch.max.wait.ms。
目前kafka的方向是做存算分离。
kafka从设计理念上来讲并不支持读写分离,原因是:
1. 场景不适用
- 主写从读无非就是为了减轻leader节点的压力,而kafka中数据分布相对比较均匀,所说的Follower从节点,实际上也是其他topic partition的Leader节点,所以在Follower可以读数据,那么会影响Follower节点上的做为Leader的partition的读性能,所以整体性能并没有提升。
- 读写分离适用于那种读负载很大,而写操作相对不频繁的场景,可 Kafka 不属于这样的场景。
2. 同步机制
- Kafka 采用 PULL 方式实现 Follower 的同步,因此,Follower 与 Leader 存在不一致性窗口。如果允许读 Follower 副本,就势必要处理消息滞后(Lagging)的问题。
拓展阅读:
kafka2.4新特性:
consumer fetch from closest replica
sticky partitioner
zhuanlan.zhihu.com/p/324497008