1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Kafka數(shù)據(jù)可靠性保證三板斧-ACK/ISR/HW

        共 3353字,需瀏覽 7分鐘

         ·

        2020-07-17 02:16

        點擊上方藍色字體,選擇“設為星標

        回復”資源“獲取更多資源

        5b67f3cfdb36b3b804c80965cc6eee4d.webp

        b02958e25b567bf42c55cbb536169617.webp

        大數(shù)據(jù)技術與架構點擊右側關注,大數(shù)據(jù)開發(fā)領域最強公眾號!

        8992a0722606ca5862dce0607e68353a.webp

        暴走大數(shù)據(jù)點擊右側關注,暴走大數(shù)據(jù)!b2f2c21997796d7fc22a18390da7bcea.webp
        為保證producer發(fā)送的數(shù)據(jù),能可靠的發(fā)送到指定的topic,topic的每個partition收到producer發(fā)送的數(shù)據(jù)后,都需要向producer發(fā)送ack(acknowledgement確認收到),如果producer收到ack,就會進行下一輪的發(fā)送,否則重新發(fā)送數(shù)據(jù)。575bed70528436b1290bf342d9660e7a.webp1.副本數(shù)據(jù)同步策略9433d54a4a3654e3d0f3923c7697e685.webpKafka選擇了第二種方案(全部完成同步,才發(fā)送ack),原因如下:
        • 同樣為了容忍n臺節(jié)點的故障,第一種方案需要2n+1個副本,而第二種方案只需要n+1個副本,而Kafka的每個分區(qū)都有大量的數(shù)據(jù),第一種方案會造成大量數(shù)據(jù)的冗余。

        • 雖然第二種方案的網絡延遲會比較高,但網絡延遲對Kafka的影響較小。

        2.ISR,AR采用第二種方案之后,設想以下情景:leader收到數(shù)據(jù),所有follower都開始同步數(shù)據(jù),但有一個follower,因為某種故障,遲遲不能與leader進行同步,那leader就要一直等下去,直到它完成同步,才能發(fā)送ack。這個問題怎么解決呢?
        Leader維護了一個動態(tài)的in-sync replica set (ISR-同步副本列表),意為和leader保持同步的follower集合。當ISR中的follower完成數(shù)據(jù)的同步之后,leader就會給follower發(fā)送ack。如果follower長時間未向leader同步數(shù)據(jù),則該follower將被踢出ISR,該時間閾值由replica.lag.time.max.ms參數(shù)設定。Leader發(fā)生故障之后,就會從ISR中選舉新的leader。
        • ISR(In-Sync Replicas ):與leader保持同步的follower集合

        • AR(Assigned Replicas):分區(qū)的所有副本

        ISR是由leader維護,follower從leader同步數(shù)據(jù)有一些延遲(包括延遲時間replica.lag.time.max.ms和延遲條數(shù)replica.lag.max.messages兩個維度, 當前最新的版本0.10.x中只支持replica.lag.time.max.ms這個維度),任意一個超過閾值都會把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表,新加入的follower也會先存放在OSR中。AR=ISR+OSR。3.ack應答機制對于某些不太重要的數(shù)據(jù),對數(shù)據(jù)的可靠性要求不是很高,能夠容忍數(shù)據(jù)的少量丟失,所以沒必要等ISR中的follower全部接收成功。所以Kafka為用戶提供了三種可靠性級別,用戶根據(jù)對可靠性和延遲的要求進行權衡,選擇以下的配置。acks參數(shù)配置:
        • 0:producer不等待broker的ack,這一操作提供了一個最低的延遲,broker一接收到還沒有寫入磁盤就已經返回,當broker故障時有可能丟失數(shù)據(jù);

        • 1:producer等待broker的ack,partition的leader落盤成功后返回ack,如果在follower同步成功之前l(fā)eader故障,而由于已經返回了ack,系統(tǒng)默認新選舉的leader已經有了數(shù)據(jù),從而不會進行失敗重試,那么將會丟失數(shù)據(jù)

        a3525a179d65210a62ddcfd56006c15d.webp
        • -1(all):producer等待broker的ack,partition的leader和follower全部落盤成功后才返回ack。但是如果在follower同步完成后,broker發(fā)送ack之前,leader發(fā)生故障,導致沒有返回ack給Producer,由于失敗重試機制,又會給新選舉出來的leader發(fā)送數(shù)據(jù),造成數(shù)據(jù)重復。

        65eeafd8d0e9653bb8c862c0415d7d8e.webp4. HW,LEO,LSO,LW名詞解釋
        f286bfdcf2334e8122dd6502d06c9297.webp上圖表示一個日志文件,這個日志文件中只有9條消息,第一條消息的offset(LogStartOffset)為0,最后一條消息的offset為8,offset為9的消息使用虛線表示的,代表下一條待寫入的消息。日志文件的 HW 為6,表示消費者只能拉取offset在 0 到 5 之間的消息,offset為6的消息對消費者而言是不可見的。
        • LEO(log end offset):標識當前日志文件中已寫入消息的最后一條的下一條待寫入的消息的offset。上圖中offset為9的位置即為當前日志文件的 LEO,LEO 的大小相當于當前日志分區(qū)中最后一條消息的offset值加1.分區(qū) ISR 集合中的每個副本都會維護自身的 LEO ,而 ISR 集合中最小的 LEO 即為分區(qū)的 HW,對消費者而言只能消費 HW 之前的消息。

        • HW(High Watermark):所有副本中最小的LEO, 一個分區(qū)中所有副本最小的offset,取一個partition對應的ISR中最小的LEO作為HW,consumer最多只能消費到HW所在的位置上一條信息。

        • 注意:HW/LEO這兩個都是指已寫入消息的最后一條的下一條的位置而不是指最后一條的位置。

        • LSO(Last Stable Offset): 對未完成的事務而言,LSO 的值等于事務中第一條消息的位置(firstUnstableOffset),對已完成的事務而言,它的值同 HW 相同

        • LW(Low Watermark): 低水位, 代表 AR(分區(qū)中的所有副本)集合中最小的 logStartOffset 值

        注意: LogStartOffset不可以縮寫為LSO,因為在Kafka中,LSO特指LogStableOffset

        5.故障處理細節(jié)

        0888531e0295d9d24a32ec849b5e1720.webp1.follower故障follower發(fā)生故障后會被臨時踢出ISR,待該follower恢復后,follower會讀取本地磁盤記錄的上次的HW,并將log文件高于HW的部分截取掉,從HW開始向leader進行同步。等該follower的LEO大于等于該Partition的HW,即follower追上leader之后,就可以重新加入ISR了。
        2.leader故障leader發(fā)生故障之后,會從ISR中選出一個新的leader,之后,為保證多個副本之間的數(shù)據(jù)一致性,其余的follower會先將各自的log文件高于HW的部分截掉,然后從新的leader同步數(shù)據(jù)。
        注意:這只能保證副本之間的數(shù)據(jù)一致性,并不能保證數(shù)據(jù)不丟失或者不重復。
        6.ISR 集合和 HW、LEO的關系下面具體分析一下 ISR 集合和 HW、LEO的關系。
        假設某分區(qū)的 ISR 集合中有 3 個副本,即一個 leader 副本和 2 個 follower 副本,此時分區(qū)的 LEO 和 HW 都分別為 3 。消息3和消息4從生產者出發(fā)之后先被存入leader副本。933816f332a724caa8a8b97adf3e7b41.webp在消息被寫入leader副本之后,follower副本會發(fā)送拉取請求來拉取消息3和消息4進行消息同步。
        在同步過程中不同的副本同步的效率不盡相同,在某一時刻follower1完全跟上了leader副本而follower2只同步了消息3,如此leader副本的LEO為5,follower1的LEO為5,follower2的LEO 為4,那么當前分區(qū)的HW取最小值4,此時消費者可以消費到offset0至3之間的消息。3a57c7c50db8cab0204911e4453ef5c7.webp當所有副本都成功寫入消息3和消息4之后,整個分區(qū)的HW和LEO都變?yōu)?,因此消費者可以消費到offset為4的消息了67d35dfd43596c343a1b838932169401.webp由此可見kafka的復制機制既不是完全的同步復制,也不是單純的異步復制。事實上,同步復制要求所有能工作的follower副本都復制完,這條消息才會被確認已成功提交,這種復制方式極大的影響了性能。而在異步復制的方式下,follower副本異步的從leader副本中復制數(shù)據(jù),數(shù)據(jù)只要被leader副本寫入就會被認為已經成功提交。在這種情況下,如果follower副本都還沒有復制完而落后于leader副本,然后leader副本宕機,則會造成數(shù)據(jù)丟失。kafka使用這種ISR的方式有效的權衡了數(shù)據(jù)可靠性和性能之間的關系。
        歡迎點贊+收藏+轉發(fā)朋友圈素質三連



        文章不錯?點個【在看】吧!??

        瀏覽 34
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            五月天婷亚洲天综合网鲁鲁鲁 | 加勒比无码AV | wwwav 中文字幕第九页 | 精品国产一区二区三区不卡蜜臀 | 日韩性爱视频网站 | 大鸡巴久久久久 | 五月天综合网 | 男下身进女下身视频 | 成人免费观看视频 | 亚洲一二三四视频 |