kafka可靠性

分布式系统

组成分布式系统的所有计算机都有可能发生任何形式的故障。一个被大量工程实践检验过的“黄金定理”:任何在设计阶段考虑到的异常情况,一定会在系统实际运行中发生,并且在系统实际运行过程中还会遇到很多在设计时未能考虑到的异常故障。所以,除非需求指标允许,否则在系统设计时不能放过任何异常情况。

副本

从生产者发出的一条消息首先会被写入分区的leader副本,不过还需要等待ISR集合中的所有follower副本都同步完之后才能被认为都已经提交,之后才会更新分区的HW,进而消费者可以消费到这条消息。
整个过程概括如下:
1)生产者客户端发送消息至leader副本,
2)消息被追加到leader副本的本地日志,并且会更新日志偏移量
3)follower副本向leader副本请求同步数据
4)leader副本读取本地日志,并更新对应拉取的follow副本的信息,然后将拉取结果返回给follower副本
5)follower副本收到leader副本返回的拉取结果,将信息追加到本地日志,并更新日志的偏移量信息

LEO和HW的变更

leader副本的HW是一个很重要的东西,因为它直接影响了分区数据对消费者的可见性。ISR集合发生增减或者ISR集合中任一副本的LEO发生变化时,都可能会影响整个分区的HW。

副本LEO变化

follower副本向leader副本拉消息时,更新leader副本的HW:
leader副本的HW,简称 leader_HW = min(leader_LEO,follower_LEO)
leader副本向follower副本返回消息时,更新follower副本的LEO和HW:
follower_HW = min(leader_HW,follower_LEO)
follower_LEO = follower_LEO + msg_num (leader返回的消息条数)
在这里插入图片描述
在这里插入图片描述

ISR集合变化

如图82所示,leader副本的LEO为9,follower1副本的LEO为7,而follower2副本的LEO为6,如果判定这3个副本都处于ISR集合中,那么这个分区的HW为6;如果follower3已经被判定为失效副本被剥离出ISR集合,那么此时分区的HW为leader副本和follower1副本中LEO的最小值,即为7。
在这里插入图片描述

副本失效判定

具有失效副本的分区从侧面反映出kafka集群存在的问题;毫不夸张的说,如果只用一个指标衡量kafka的可靠性,具有失效副本分区的个数是首选;
在这里插入图片描述

可靠性分析

就可靠性而言,并不能用简单的是或否来衡量,一般采用几个9来衡量。那在使用kafka时,如果最大程度的提高可靠性呢?
1、副本越多,可靠性越有保证;不过副本数多会引起磁盘、网络带宽的浪费,包括性能的下降;另外如果引入机架信息(broker.rack)还可以应对机架整体宕机的风险;
2、生产者acks=-1,保证所有ISR的副本都成功写入本地日志后,才告诉生产者消息成功接收;但如果ISR集合中只有leader副本,则和acks=1是一样的,所以Kafka支持设置min.insync.replicas参数。
3、消费者enable.auto.commit=false,消息没有被成功消费,就不能提交所对应的消费位移,如果部分消息一直不能成功消费,为了不影响整体消费的进度,可以将这类消息暂存到死信队列,以便后续的故障排除。(kafka本身没有提供死信队列,消费者可以指定具体的topic当作自己应用的死信队列)
以下内容来自于《朱忠华. 深入理解Kafka:核心设计与实践原理》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值