kafka
2020-10-25 17:07:15 0 举报
AI智能生成
kafka总结
作者其他创作
大纲/内容
两种模式
点对点模式
点对点 消费者主动拉取消息,消息被消费后自动删除
发布订阅模式
一对多 将消息发布到topic中,同时消费者消费自己订阅的topic中的消息,而且消息被消费后不会删除,会通过offset偏移量定位消息
基本架构
数据存储定位
当数据量较大时,kafka会将数据切分成多个log,以文件大小偏移量命名(可以在server.property中配置阈值),并生成对应的.index索引文件,索引文件中存储的为map结构,key为ofset,value为当前消息,在log文件中起始的偏移量
生产者发送消息
两种模式
过半通过
延迟低,对分区数有限制,当容忍n台机器挂掉,那么必须有2n+1台机器
全部通过
延迟高,但是对机器数量无限制
ISR机制
Leader维护者一个ISR集合,当Leader做数据同步时如果某台机器超时那么Leader将从ISR中移除该机器(超时时间阈值可以通过replica.lag.time.max.ms),当ISR中所有机器备份完毕就返回ack,Leader节点挂掉后选取新的Leader也是在ISR中选取。
ack应答机制
设置为0
生产者只负责发出消息,不等待brocker返回ack,延迟最低,对于不追求数据不丢失的可以设置为0,当leader还没写入成功是挂掉,就会丢失数据
设置为1
生产者发送消息后,等待返回ack,当leader数据写入磁盘后返回ack,当leader写入成功后,follower没有同步数据时,leader挂掉会丢失数据
设置为-1
生产者发送消息后,等待leader和所有ISR中的follwer同步消息完成后返回的ack,极端情况下ISR中只有Leader也会丢失数据,当所有follower同步完消息,但是ack还未发出时,leader挂掉,选举完新的leader之后,生产者会重新发送消息,会造成数据重复
消费者数据一致性
HW高水位
代表leader和follower中所有数据对消费者暴露的最高水位,
当leader故障选举新的leader后,会对所有的follwer进行数据同步,将少于当前leader的follower补齐。
当follower故障重启后,会读取磁盘中记录的最后一次的HW,然后向leader开始同步数据,当follower的数据大于等于leader中的数据时,从新加入ISR
exactlyOnce
表示可以保证消息单次会话单个分区的不重复不丢失
AtLeastOnce
通过设置ack为-1来保证数据不丢失
幂等性
通过<pid,partition,seqnumber>数据结构来保证数据不会重复,注意pid为会话的唯一标识,当重启会话后pid将不再相同,所以不能保证多次会话的不重复
分区分配策略
RoundRobin
将consumer组订阅的所有topic平均分配到当前consumer组中各个consumer中
缺点是,当同一个consumer组中不同的consumer订阅了不同的topic时会分配错误
Range
以topic为中心,将所有分区分发到所有订阅者中
默认策略
当有消费者加入或者消费者挂掉会出发从新分配
offset
表示某个分区的某个topic被消费的位置偏移量
保存在Zookeeper中
保存在本地_consumer_offsets topic中
高效读写策略
消息数据顺序追加减少磁盘寻址时间
使用零拷贝去将数据拷贝直接在内核中完成
事务
producer事务
当生产者对多个分区进行写数据时,事务未完成生产者挂掉后,重启需要完成事务
kafka通过维护一个transaction coordinator来保存事务的pid:transaction Id 以及事务的状态,当生产者重启后可以通过transactionId继续完成事务
consumer事务
并不能完全保证事务,因为分区的过期时间可能不同,当消息被消费过程中,可能遇到事务未完成,消息又过期了,就无法读取到当前事务所需要的的消息
offset提交
自动提交
缺点是消息未消费完时系统挂掉,会存在消息漏消费
手动提交
缺点是当消息消费完,还未提交offset时,系统挂掉会导致消息重复消费
0 条评论
下一页