关于kafka:关于kafka数据丢失场景的一次激烈讨论

43次阅读

共计 2036 个字符,预计需要花费 6 分钟才能阅读完成。

<center> 大家好, 我是彦祖~</center>

问题形容

最近彦祖发现, 有不少同学 对 <font size=2 color=red>acks</font> 和 <font size=2 color=red>min.insync.replicas</font> 的配置存在不少误会.

刚好拿一个同学的问题, 来好好阐明一下

依据下面提的几个问题, 整顿一下几个知识点

  1. acks = all 的概念是什么?
  2. min.insync.replicas 是怎么用的?
  3. 什么状况下会产生数据失落的危险

<font color=blue>为更好的浏览体验, 和及时的勘误 </font>
请拜访原文链接:acks 和 min.insync.replicas 配置详解和数据失落场景的一次探讨

问题解答

acks = all

<font size=3 color=red>acks=0</font>: 生产者不会期待服务器的任何确认, 该记录将立刻增加到 Socket Buffer Pool 并被视为已发送,这种状况, 不保障发送胜利,可能会失落数据

<font size=3 color=red>acks=1</font>: 这个保障了至多 Leader 正本会将数据写入到本地日志中, 不论其余正本是否写入。所以当 Leader 同步胜利之后, 还没有来得及同步给 Follower 正本就宕机了。那么就会失落数据

<font size=3 color=red>acks=-1/all</font>: 这个确保 <font color=blue>ISR 中的所有同步正本列表 </font> 中都确认写入了数据之后, 才会视为发送胜利, 所以这个配置能够提供最高级的数据可靠性的保障, 不会失落数据。

然而, 就算咱们设置了 <font size=3 color=red>acks=-1/all</font> , 并且也有 3 个正本, 然而这个时候 Follower 正本都没有退出到 ISR 的汇合中, ISR 只剩下了一个 Leader 正本。如果这个 Leader 宕机了, 是不是可能会造成分区不可用或者数据失落的状况了!

那么这种状况是不是就跟 ack= 1 的状况一样了, 相当于只保障了 Leader 写入了数据。还是达不到高可靠性。

那么,怎么解决这个问题呢?

是不是只须要让 ISR 外面的同步正本 >1 就行了, 只有一个挂掉了, 还有 1 个作为备份。

最小同步正本数 min.insync.replicas

最小同步正本数, 示意的是 ISR 列表外面最小的个数。这个是跟 <font size=3 color=red>acks=-1/all</font> 配套应用的, 默认是 =1。

这个配置再加上下面的 <font size=3 color=red>acks=-1/all</font> 是不是就能够设置高可靠性了

特地须要留神:这个配置是用来设置同步正本个数的上限的, 并不是只有 min.insync.replicas 个正本同步胜利就返回 ack。
只有你 <font size=3 color=red>acks=-1/all</font> 就意味着你 ISR 外面的正本必须都要同步胜利。

读者问题解答

了解分明了下面的知识点, 那么这位敌人的问题应该就能够答复了吧。

问题:Kafka 正本数设置为 3,min.insync.replicas=2,此时 AR={1,2,3} ISR={3,2,1} 0 分区的 leader 为 3,假如以后写入 3 胜利,1 和 3 同步胜利,满足 ack=all 返回客户端写入胜利,而后 leader3 宕机,选举 2 为 leader,假如此时 2 刚好没同步,是不是会呈现数据失落危险呢?

<center><font size=4 color=red >还没完结, 来看下上面的问题, 说说你的认识。</font></center>

问题扩大

当 Broker 单正本, acks=all 的状况下

  1. Broker 失常关机, 会不会导致音讯失落
  2. Broker 异样 crash, 会不会导致音讯失落
  3. 物理机失常关机, 会不会导致音讯失落
  4. 物理机异样掉电关机, 会不会导致音讯失落

群友见解 :

彦祖高见:

  1. 不会丢
  2. 不会丢 / 反复数据
    ①. 要么他没有胜利写入数据,然而这个时候不会返回 ack,那么 producer 没有收到 ack,则会尝试重发,所以这不属于丢书数据。
    ②. 它胜利写入了数据, 然而还没有来得及返回 ack, producer 会尝试重发, 等重启之后 可能会收到反复音讯
    ③. 它胜利写入数据, ack 也返回了,不会失落数据。
    留神:这里说的写入胜利,是写入内存中 pagecache 中
  3. 不会丢
  4. 会丢

思考下面问题的一个很重要的知识点:

kafka 在写数据的时候 默认是依赖操作系统来刷盘的。
kafka 认为写入胜利不是写入磁盘胜利,而是写到到 PageCache 中。所以,只有不是 服务器掉电,PageCache 中的内存数据就还在,就不会丢数据


欢送大家, 一起在评论区参加探讨, 想要进群的小伙伴能够加我微信哈!
我也会把我的见解写在评论区!


<center>
进由滴滴工程师们创立的 kafka 中文社区
</center>


获取全套 kafka 技术大全请跳转: 全网最全 kafka 技术大全(蕴含运维与实战) 公布

正文完
 0