<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          7張圖了解kafka基本概念

          共 2599字,需瀏覽 6分鐘

           ·

          2021-09-10 14:42

          作者:xindoo

          來(lái)源:SegmentFault 思否社區(qū)


          kafka是apache基金會(huì)管理的開(kāi)源流處理平臺(tái)(官網(wǎng):Apache Kafka),但國(guó)內(nèi)大多數(shù)人對(duì)其認(rèn)知基本都是消息隊(duì)列,所以我們先來(lái)了解下什么是消息隊(duì)列。

          消息隊(duì)列



          消息隊(duì)列顧名思義就是存儲(chǔ)消息的一個(gè)隊(duì)列,消息生產(chǎn)者(producer) 往消息隊(duì)列中投放消息, 消費(fèi)者(consumer)讀取消息隊(duì)列中的內(nèi)容。在消息隊(duì)列中的每條消息都會(huì)有個(gè)位置,就好比數(shù)組中的下標(biāo)(index),在kafka中我們稱之為offset。對(duì)于生產(chǎn)者而言,有個(gè)特殊的offset——LEO(log end offset) ,指向的是消息隊(duì)列中下一個(gè)將被存放消息的位置。

          這里重點(diǎn)說(shuō)下消費(fèi)者(consumer),一個(gè)消息隊(duì)列當(dāng)然可以被多個(gè)消費(fèi)者(consumer)讀取,每個(gè)消費(fèi)者(consumer)都有唯一一個(gè)group-id將其區(qū)分開(kāi)來(lái)。kafka也會(huì)記錄下來(lái)每個(gè)消費(fèi)者(consumer)已經(jīng)讀到哪個(gè)位置了(offset)。

          問(wèn):為什么消費(fèi)者消費(fèi)的offset是由kafka記錄,而不是由消費(fèi)者自己記錄?

          主題(Topic)



          上文我們以一份數(shù)據(jù)為例,講了什么是消息隊(duì)列。如果有多份數(shù)據(jù)(多個(gè)隊(duì)列)該怎么辦?也很簡(jiǎn)單,kafka中我們可以使用不同的主題(Topic)將不同的數(shù)據(jù)區(qū)分開(kāi)。不同的生產(chǎn)者(producer)可以往不同的Topic中存放數(shù)據(jù),不同的消費(fèi)者(consumer)也可以從不同的Topic中讀取數(shù)據(jù)。

          分區(qū)(Partation)



          當(dāng)一份數(shù)據(jù)非常大的情況下怎么辦?當(dāng)然是考慮拆分了。在kafka中,你可以設(shè)置將一個(gè)主題(Topic)拆分成多個(gè)不同的分區(qū)(Partation),然后以分區(qū)(Partation)的維度來(lái)管理、生產(chǎn)和消費(fèi)數(shù)據(jù)。拆分帶來(lái)最明顯的好處就是提升吞吐性能,多個(gè)分區(qū)(Partation)之間并行,互不干擾。
          至于怎么拆分,kafka有提供幾個(gè)默認(rèn)分區(qū)策略 輪詢、隨機(jī)、hash,當(dāng)然你可以自己實(shí)現(xiàn)自己的分區(qū)策略,這里就不過(guò)多展開(kāi)了。

          消費(fèi)者組(Consumer-group)



          主題(Topic)做完分區(qū)以后,消費(fèi)者如何消費(fèi)?這里就不得不提到消費(fèi)者組(Consumer-group)的概念,在kafka中,為了保證數(shù)據(jù)的一致性,同一個(gè)分區(qū)(Partation)同時(shí)只能被一個(gè)消費(fèi)者(consumer)實(shí)例消費(fèi),為了提升消費(fèi)者(consumer)的吞吐量,一般都會(huì)設(shè)置多個(gè)消費(fèi)者(consumer)實(shí)例來(lái)消費(fèi)不同的分區(qū)(Partation),這些實(shí)例共同組成一個(gè)消費(fèi)者組(Consumer-group) ,他們共用一個(gè)Group-id。

          注意:

          1. 由于同一個(gè)分區(qū)(Partation)同時(shí)只能被一個(gè)消費(fèi)者(consumer)實(shí)例消費(fèi),所以超過(guò)分區(qū)(Partation)數(shù)量的消費(fèi)者(consumer)實(shí)例個(gè)數(shù)沒(méi)有任何意義,多余的消費(fèi)者(consumer)實(shí)例也會(huì)被閑置。

          2. 如果消費(fèi)者組(Consumer-group) 中有實(shí)例發(fā)生變化(上下線),或者分區(qū)(Partation)數(shù)量發(fā)生變化,都會(huì)觸發(fā)消費(fèi)者組rebalence。

          副本(Replication)



          kafka如何解決數(shù)據(jù)高可用的問(wèn)題?在分布式環(huán)境下,要想保證數(shù)據(jù)盡可能不丟失,唯一的方法就是多復(fù)制幾份放到不同的機(jī)器上,復(fù)制出來(lái)的數(shù)據(jù)就叫做副本(Replication)。

          這里有幾個(gè)關(guān)鍵詞。
          HW: high-water,一個(gè)特殊的offset,只有在這個(gè)offset以下的消息才能被消費(fèi)者(consumer)讀到,高水位的具體值取決于主從副本數(shù)據(jù)同步的狀態(tài),這里不再展開(kāi)。

          ISR: in-sync-replica,處于同步狀態(tài)的副本集合,是指副本數(shù)據(jù)和主副本數(shù)據(jù)相差在一定返回(時(shí)間范圍或數(shù)量范圍)之內(nèi)的副本,當(dāng)然主副本肯定是一直在ISR中的。當(dāng)主副本掛了之后,新的主副本將從ISR中被選出來(lái)接替它的工作。

          OSR: 和IRS相對(duì)應(yīng) out-sync-replica,其實(shí)就是指那些不在ISR中的副本。

          副本主從同步



          當(dāng)一份數(shù)據(jù)比復(fù)制出多份副本后,肯定得涉及到主從副本的同步在,從副本會(huì)定期從主副本拉去最新的數(shù)據(jù)。另外需要注意kafka中,只有主副本才會(huì)對(duì)外提供讀和寫(xiě)(高版本kafka從副本提供了有限的讀功能),從副本的唯一作用就是給主副本當(dāng)備胎。


          說(shuō)到主從同步,順帶提一下kafka的ack設(shè)置。
          kafka中生產(chǎn)者(producer),可以通過(guò)request.required.acks參數(shù)來(lái)設(shè)置數(shù)據(jù)可靠性的級(jí)別:

          • 0: 生產(chǎn)者(producer) 不等待來(lái)自主副本的確認(rèn),發(fā)出去即認(rèn)為發(fā)送成功,這種情況效率最高但可能有丟失數(shù)據(jù)的風(fēng)險(xiǎn)。

          • 1: (默認(rèn))生產(chǎn)者(producer) 發(fā)出數(shù)據(jù)后會(huì)等待主副本確認(rèn)收到后,才認(rèn)為消息發(fā)送成功,這種情況下主副本宕機(jī)時(shí)可能會(huì)丟失消息。

          • -1: (或者是all):生產(chǎn)者(producer) 等待ISR中的所有副本都確認(rèn)接收到數(shù)據(jù)后才任務(wù)消息發(fā)送成功,可靠性最高,但因?yàn)樾枰葟母北纠ズ痛_認(rèn),效率最低。

          Broker



          Kafka是以副本(Replica)維度管理數(shù)據(jù)的,管理這些數(shù)據(jù)肯定是需要管理者的,這個(gè)管理者就是Broker。Broker會(huì)將同一份數(shù)據(jù)的不同副本(Replication) 調(diào)度到不同的機(jī)器上,并且在副本(Replication) 數(shù)不足時(shí)生成新的副本,從而保證在部分Broker宕機(jī)后也能保證數(shù)據(jù)不丟失。
          所有的Broker之間也會(huì)做一些元數(shù)據(jù)的相互同步,比如某份主數(shù)據(jù)在誰(shuí)哪,從副本要從誰(shuí)哪去拉取數(shù)據(jù)……

          結(jié)語(yǔ)

          第一次嘗試手繪風(fēng)講解kafka入門(mén)知識(shí),講的很粗淺,確實(shí)很多細(xì)節(jié)都沒(méi)有展開(kāi),見(jiàn)諒。



          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開(kāi)更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號(hào)后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~


          - END -



          瀏覽 38
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本在线色视频 | 国内精品视频在线播放 | av手机在线观看网站 | 福利视频久久久久 | 啪啪网页|