- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈Kafka中acks参数对消息长久化的影响
2021-05-07
在说到Kafka的参数优化时就给大家说过acks参数的意义,这个acks参数在kafka的使用中,是格外核心以及关键的一个参数,打算了很多东西。尤其时数据丢失这方面,能很好处理这类问题。
为了保证producer发送的数据能牢靠的发送到指定的topic,topic的每个partition收到producer发送的数据后都需要向producer发送确认消息,即acknowledgement确认收到消息,假如producer收到ack就会进行下一轮的发送,否则重新发送数据。
那么所在的broker什么时候发送ack给producer?
leader落盘后直接前往ack,假如producer收到ack后leader挂了,follower还未同步成功,形成消息丢失。
follower全部同步成功后前往ack,leader选举时容忍n台节点毛病,需要n+1个副本,任凭选一个follower即可。不过是高延迟,需要等待follower都同步成功。
半数以上follower同步成功后前往ack,选举新leader时,容忍n台节点毛病,需要2n+1个副本。
kafka选择全部follower同步成功后再前往ack的方案,缘由如下:
同样为了容忍n台节点毛病,第一种方案需要2n+1个副本,而其次种方案只需要n+1个副本,而kafka每个分区都有大量的数据,第一种方案会形成大量的数据冗余。
其次种方案的网络延迟虽然比较高,但都是一个局域网中,网络延时的影响也比较小。
多副本冗余机制
比如Partition0有一个副本是Leader,另外一个副本是Follower,Leader和Follower两个副本是分布在不同机器上的。这样的多副本冗余机制,可以保证任何一台机器挂掉,都不会导致数据彻底丢失,由于最少还是有副本在别的机器上的。
多副本数据同步
接着我们就来看看多个副本之间数据是如何同步的?其实任何一个Partition,只要Leader是对外供应读写服务的。
也就是说,假如有一个客户端往一个Partition写入数据,此时一般就是写入这个Partition的Leader副本。
然后Leader副本接收到数据之后,Follower副本会不停的给他发送恳求尝试去拉取最新的数据,拉取到本人本地后,写入磁盘中。
ISR含义和作用
ISR(In-Sync Replica):是Replicas的一个子集,表示目前Alive且与Leader能够“Catch-up”的Replicas集合。也就是保持同步的副本,他的含义就是,跟Leader一直保持同步的Follower有哪些。
读写都是首先落到Leader上,所以一般来说通过同步机制从Leader上拉取数据的Replica都会和Leader有一些延迟(包括了延迟时间和延迟条数两个维度),任意一个超过阈值都会把该Replica踢出ISR。每个Partition都有它本人独立的ISR。
大家可以想一下 ,假如说某个Follower所在的Broker由于JVM FullGC之类的问题,导致本人卡顿了,无法准时从Leader拉取同步数据,那么是不是会导致Follower的数据比Leader要落后很多?
所以这个时候,就意味着Follower已经跟Leader不再处于同步的关系了。但是只需Follower一直准时从Leader同步数据,就可以保证他们是处于同步的关系的。
所以每个Partition都有一个ISR,这个ISR里肯定会有Leader本人,由于Leader确定数据是最新的,然后就是那些跟Leader保持同步的Follower,也会在ISR里。
leader维护了一个动态的in-sync-replica (与leader保持同步的副本集合,该集合中的副本和leader数据是全都的),当ISR中的follower和leader数据同步完成之后,leader就会向follower发送ack,假如ISR中的follower长时间未向leader发送同步完成消息,leader会将其从ISR中剔除,等待的时长由replica.time.max.ms参数设定。leader毛病之后,就会从ISR中选举出新的leader。
acks参数的含义
假如大家没看明白前面的那些副本机制、同步机制、ISR机制,那么就无法充分的理解acks参数的含义,这个参数实际上打算了很多重要的东西。
首先这个acks参数,是在KafkaProducer,也就是生产者客户端里设置的;
也就是说,你往kafka写数据的时候,就可以来设置这个acks参数。然后这个参数实际上有三种常见的值可以设置,分别是:0、1 、-1和 all。
第一种选择是把acks参数设置为0
acks=
原创力文档


文档评论(0)