如何保证kafka生产者发送消息的可靠性

继一年前的kafka介绍的学习总结,生产者Producers按照主题topic把消息发给kafka集群的主分区,其他分区从主分区同步该消息。

具体来看kafka的分布特性性:kafka消息的分区分布在Kafka集群的某些服务器上,每个分区都有一个服务器充当leader,有0个或多个充当follower。leader处理分区的所有读请求和写请求,同时follower被动的从leader同步数据。假如leader异常了,其他follower会自动的选出一个新leader。每个服务器有可能充当某些分区的leader,同时也充当其他分区的follower,因此集群负载得到了很好的平衡和实现容错功能。

Kafka默认的副本因子是3,即每个分区只有1个leader副本和2个follower副本。

kafka的broker服务端:动态的ISR同步副本机制

由于Kafka是一个分布式系统,follower必然会存在与leader不能实时同步的风险,那么follower副本在什么条件下才算与Leader同步?ISR同步副本机制解决这个问题。

In-sync replica(ISR)称之为同步副本,ISR中的副本都是与Leader进行同步的副本。ISR中是什么副本呢?首先可以明确的是:Leader副本总是存在于ISR中,而follower副本是否在ISR中,取决于该follower副本是否与leader副本保持了“同步”。

Kafka的broker服务端有一个参数replica.lag.time.max.ms,该参数表示follower副本滞后与Leader副本的最长时间间隔,默认是10秒。只要follower副本落后于leader副本的时间间隔不超过10秒,就认为该follower副本与leader副本是同步的,即使follower副本落后于Leader副本几条消息,只要在10秒之内赶上Leader副本,就不会被踢出局。如果follower副本被踢出ISR列表,等到该副本追上了leader副本的进度,该副本会被再次加入到ISR列表中,所以ISR是一个动态列表,并不是静态不变的。

producers生产者:acks确认机制

acks参数主要决定了kafka集群leader分区副本接收消息成功就响应成功还是fellower分区从leader同步成功才响应成功,这个参数对于消息是否丢失起着重要作用:

1) acks=0,生产者在成功写入消息之前不会等待任何来自服务器的响应。由于不需要等到服务器的响应,可以以网络支持的最大速度发送消息,从而达到很高的吞吐量。

2) acks=1,只要集群的leader分区副本接收到了消息,就会向生产者响应成功。一旦消息无法写入leader分区副本(比如网络原因、leader节点崩溃),生产者会收到一个错误响应,为了避免数据丢失,生产者会重新发送消息。这种方式的吞吐量取决于使用的是异步发送还是同步发送。

3) acks =all,只要ISR同步副本数大于等于最小同步副本数min.insync.replicas(提醒:ISR是动态的)收到消息时,生产者才会接收到服务器的成功响应。这种模式是最高级别的,也是最安全的,可以确保不止一个Broker接收到了消息,该模式的延迟会很高。

kafka服务端:最小同步副本

当acks=all时,只要ISR同步副本中有主备副本都同步了才会响应成功给生产者。其实这里面存在一个问题:ISR同步副本是动态的,有可能仅仅含有一个leader副本(相当于acks=1),也有可能的全部副本(这个也没必要,拜占庭将军场景只要保证一半以上的副本正常同步)。需要一个参数决定至少有几个副本需要同步成功才能响应成功给生产者。

为了解决这个问题,Kafka的Broker端提供了一个参数**min.insync.replicas**,该参数控制着至少被写入的副本数,该值默认值为1,生产环境中可以根据部署的是单节点还是多节点,多节点要能够满足拜占庭将军场景,我们以3节点场景为例。

3节点场景1:当min.insync.replicas=2且acks=all时,如果ISR列表只有[1,2],3被踢出ISR列表,只要保证2个副本同步了,生产者就会收到成功响应。

3节点场景2:当min.insync.replicas=2时,如果ISR列表只有[1,2],3被踢出ISR列表。当acks=all时,则响应失败(需要生产者重新发消息直到响应成功);当acks=0或者acks=1时成功写入数据。

ps:该场景下acks=all,kafka集群一旦同步失败就直接响应失败嘛?还是有超时时长?生产者已经将消息发送到leader分区,kafka(响应失败)对这个消息如何处理?入集群持久化嘛?后续重试发送的消息如何处理?

3节点场景3:如果min.insync.replicas=2且acks=all,此时ISR列表为[1,2,3],只要2副本同步成功还是等到所有的副本都同步了,才会向生产者发送成功响应?因为min.insync.replicas=2只是一个最低限制,同步副本少于该配置值,则会抛异常,而acks=all,是需要保证所有的ISR列表的副本都同步了才可以发送成功响应。

总结

1) 要想系统的可靠性,从来不是一方能决定的,kafka生产者发送消息的可靠性主要由kafka服务端的动态同步副本列表ISR和最小同步副本数min.insync.replicas以及生产者参数ack=all。

2) kafka服务端的最小同步副本数min.insync.replicas由部署的集群和节点个数来决定,满足拜占庭将军场景(节点个数一半以上即可)。

3) 生产者的副本个数由部署的集群和节点个数来决定,满足拜占庭将军场景(节点个数一半以上即可)。如果是单副本的话,本文讨论的就没意义了。

4) kafka单节点场景,kafka服务端的动态同步副本列表ISR和最小同步副本数min.insync.replicas均为1,生产者的副本数为1(如果大于1估计会失败),ack=all和ack=1的效果一样。

5) kafka 3节点场景,kafka服务端的动态同步副本列表ISR为3个,最小同步副本数min.insync.replicas均为2,生产者的副本数为2和ack=all。

6) kafka 奇数n节点场景,kafka服务端的动态同步副本列表ISR为n个,最小同步副本数min.insync.replicas均为(n+1)/2,生产者的副本数为(n+1)/2和ack=all。

参考

Kafka生产者ack机制剖析

kafka官网给出的kafka生产者配置参数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容