为什么kafka不能像mysql一样使用主从模式
- ka已经在分区层面做了负载均衡,规避了单机瓶颈
- 消息的实时性更高,避免了主从延迟
- 存储读取和流消息消费的区别,消费者位移维护麻烦
为什么要分区
- 提供负载均衡能力
- 业务级别的消息顺序
消息写入分区策略
- 自定义
- round-robin(轮询)
- randomness(随机)
- 按消息键分配(可以保证同一个消息键的消息有序的流入同一个分区)
- ip或者地理位置(分地区推送)
压缩
- broker也可定制压缩算法,当broker的压缩算法和producer不一致时,将在broker发生再压缩
- 为了兼容老版本的消息,broker可能会发生再压缩
- broker都会对消息集合进行解压缩,为了进行各种校验(先做对事情)
如何做到消息不丢失
- 对committed message做有限度的持久化
- committed message 是值有N个broker成功接收到消息并写入日志(N >= 1,可配置)
不丢消息对应配置
- send with callback
- acks = all
- retries较大值
- unclean.leader.election.enable = false (避免非ISR副本成为leader)
- replication.factor >= 3
- min.insync.replicas > 1 (isr num)
- replication.factor > min.insync.replicas
- enable.auto.commit = false (关闭自动提交offset)
consumer group
- 共享groupid
- 一个consumer实例对应一个或多个分区
rebalance
- consumer或topic或partition变更触发
- 所有consumer实例停止消费,等待rebalance完成
- 全consumer参与,全部重新分配所有分区,频繁断开tcp,重连其他broker
- 实在太慢了
_consumer_offsets
- key => <group id, topic, partition>,value => offset
- auto commit (定时推,默认5s)或 manually commit
- compaction策略 主题过期消息清理 (log cleaner 线程)
coordinator
- 管理consumer group,管理offset
如何找到coordinator
- abs(hash(groupId) % offsetsTopicPartitionCount) 寻找offset主题的分区
- 寻找分区的leader副本所在broker
rebalance的坏处
- 影响consumer端tps(rebalance期间,consumer需要暂停消费)
- rebalance太慢了
- 全员参与,效率低,未考虑局部合理性
如何避免rebalance
(consumer需要定期的想coordinator发送心跳包,来证明自己来活着,避免被剔出group,导致consumer数量减少,引发rebalance)
-
未能及时发送心跳,导致被剔出,引发rebalance
session.timeout.ms = 6ms
heartbeat.interval.ms = 2ms
保证在6ms的超时时间内,consumer能至少发3轮心跳请求
(心跳评率设置低点,consumer能更快的知道是否发生rebalance,因为coordinator是通过响应心跳包来通知的) -
消费时间过长导致,consumer自动发起离开group请求
max.poll.interval.ms设置长点
位移那些事
- 自动提交,提交间隔,(重复消费)
- 手动提交,同步提交(影响tps),异步提交(无法重试),组合更好
- 精细化提交,也可通过seek指定初始位移
副本机制
- 副本不提供任何服务,仅仅提供数据冗余,对抗broker宕机的风险
- 读写leader副本,实现read-your-writes,实现单调读
- replica.lag.time.max.ms follow落后leader的最长时间间隔
- ISR是动态调整的集合,剔出后可能再次加进来
rebalance细节
- consumer group 5种状态 empty dead preparingRebalance(准备开启重平衡,所有consumer重新加入group) completingRebalance(consumer都已加入,等待分配方案) stable
- compaction自动清除过期位移的条件是 group为empty
- 重平衡 还有小段缓冲时间让consumer快速提交offset
controller
- 在zookeeper协助下管理整个集群
- 所有broker中,有且仅有一台能成为controller
- 第一个在zookeeper中成功创建/controller znode的broker为controller
- 控制器故障转移,zookeeper监听并通知其他broker,重新竞选controller
网友评论