成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Kafka Partition詳解

IT那活兒 / 3524人閱讀
Kafka Partition詳解
點(diǎn)擊上方“IT那活兒”公眾號(hào),關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了!??!

Kafka Partition


Partition(分區(qū))是 Kafka 的核心角色,對于 Kafka 的存儲(chǔ)結(jié)構(gòu)、消息的生產(chǎn)消費(fèi)方式都至關(guān)重要。

掌握好 Partition 就可以更快的理解 Kafka。本文會(huì)講解 Partition 的概念、結(jié)構(gòu),以及行為方式。

Events, Streams, Topics

在深入 Partition 之前,我們先看幾個(gè)更高層次的概念,以及它們與 Partition 的聯(lián)系。

  • Event(事件)代表過去發(fā)生的一個(gè)事實(shí)。簡單理解就是一條消息、一條記錄。
    Event 是不可變的,但是很活躍,經(jīng)常從一個(gè)地方流向另一個(gè)地方。
  • Stream 事件流表示運(yùn)動(dòng)中的相關(guān)事件。
  • 當(dāng)一個(gè)事件流進(jìn)入 Kafka 之后,它就成為了一個(gè) Topic 主題。
所以,Topic 就是具體的事件流,也可以理解為一個(gè) Topic 就是一個(gè)靜止的 Stream。

Topic 把相關(guān)的 Event 組織在一起,并且保存。一個(gè) Topic 就像數(shù)據(jù)庫中的一張表。

Partition 分區(qū)



Kafka 中 Topic 被分成多個(gè) Partition 分區(qū)。
Topic 是一個(gè)邏輯概念,Partition 是最小的存儲(chǔ)單元,掌握著一個(gè) Topic 的部分?jǐn)?shù)據(jù)。
每個(gè) Partition 都是一個(gè)多帶帶的 log 文件,每條記錄都以追加的形式寫入。

Offsets(偏移量)和消息的順序

Partition 中的每條記錄都會(huì)被分配一個(gè)唯一的序號(hào),稱為 Offset(偏移量)。
Offset 是一個(gè)遞增的、不可變的數(shù)字,由 Kafka 自動(dòng)維護(hù)。
當(dāng)一條記錄寫入 Partition 的時(shí)候,它就被追加到 log 文件的末尾,并被分配一個(gè)序號(hào),作為 Offset。
如上圖,這個(gè) Topic 有 3 個(gè) Partition 分區(qū),向 Topic 發(fā)送消息的時(shí)候,實(shí)際上是被寫入某一個(gè) Partition,并賦予 Offset。
消息的順序性需要注意,一個(gè) Topic 如果有多個(gè) Partition 的話,那么從 Topic 這個(gè)層面來看,消息是無序的。
但多帶帶看 Partition 的話,Partition 內(nèi)部消息是有序的。
所以,一個(gè) Partition 內(nèi)部消息有序,一個(gè) Topic 跨 Partition 是無序的。

如果強(qiáng)制要求 Topic 整體有序,就只能讓 Topic 只有一個(gè) Partition。

Partition 為 Kafka 提供了擴(kuò)展能力

一個(gè) Kafka 集群由多個(gè) Broker(就是 Server) 構(gòu)成,每個(gè) Broker 中含有集群的部分?jǐn)?shù)據(jù)。
Kafka 把 Topic 的多個(gè) Partition 分布在多個(gè) Broker 中。

這樣會(huì)有多種好處:

  • 如果把 Topic 的所有 Partition 都放在一個(gè) Broker 上,那么這個(gè) Topic 的可擴(kuò)展性就大大降低了,會(huì)受限于這個(gè) Broker 的 IO 能力。把 Partition 分散開之后,Topic 就可以水平擴(kuò)展 。
  • 一個(gè) Topic 可以被多個(gè) Consumer 并行消費(fèi)。如果 Topic 的所有 Partition 都在一個(gè) Broker,那么支持的 Consumer 數(shù)量就有限,而分散之后,可以支持更多的 Consumer。
  • 一個(gè) Consumer 可以有多個(gè)實(shí)例,Partition 分布在多個(gè) Broker 的話,Consumer 的多個(gè)實(shí)例就可以連接不同的 Broker,大大提升了消息處理能力??梢宰屢粋€(gè) Consumer 實(shí)例負(fù)責(zé)一個(gè) Partition,這樣消息處理既清晰又高效。

Partition 為 Kafka 提供了數(shù)據(jù)冗余

Kafka 為一個(gè) Partition 生成多個(gè)副本,并且把它們分散在不同的 Broker。

如果一個(gè) Broker 故障了,Consumer 可以在其他 Broker 上找到 Partition 的副本,繼續(xù)獲取消息。

寫入 Partition

一個(gè) Topic 有多個(gè) Partition,那么,向一個(gè) Topic 中發(fā)送消息的時(shí)候,具體是寫入哪個(gè) Partition 呢?有3種寫入方式。

方式一:使用 Partition Key 寫入特定 Partition

Producer 發(fā)送消息的時(shí)候,可以指定一個(gè) Partition Key,這樣就可以寫入特定 Partition 了。
Partition Key 可以使用任意值,例如設(shè)備ID、User ID。
Partition Key 會(huì)傳遞給一個(gè) Hash 函數(shù),由計(jì)算結(jié)果決定寫入哪個(gè) Partition。
所以,有相同 Partition Key 的消息,會(huì)被放到相同的 Partition。
例如使用 User ID 作為 Partition Key,那么此 ID 的消息就都在同一個(gè) Partition,這樣可以保證此類消息的有序性。
這種方式需要注意 Partition 熱點(diǎn)問題。
例如使用 User ID 作為 Partition Key,如果某一個(gè) User 產(chǎn)生的消息特別多,是一個(gè)頭部活躍用戶,那么此用戶的消息都進(jìn)入同一個(gè) Partition 就會(huì)產(chǎn)生熱點(diǎn)問題,導(dǎo)致某個(gè) Partition 極其繁忙。

方式二:kafka決定

如果沒有使用 Partition Key,Kafka 就會(huì)使用輪詢的方式來決定寫入哪個(gè) Partition。
這樣,消息會(huì)均衡的寫入各個(gè) Partition。
但這樣無法確保消息的有序性。

方式三:自定義規(guī)則

Kafka 支持自定義規(guī)則,一個(gè) Producer 可以使用自己的分區(qū)指定規(guī)則。

讀取 Partition

Kafka 不像普通消息隊(duì)列具有發(fā)布/訂閱功能,Kafka 不會(huì)向 Consumer 推送消息。
Consumer 必須自己從 Topic 的 Partition 拉取消息。
一個(gè) Consumer 連接到一個(gè) Broker 的 Partition,從中依次讀取消息。
消息的 Offset 就是 Consumer 的游標(biāo),根據(jù) Offset 來記錄消息的消費(fèi)情況。
讀完一條消息之后,Consumer 會(huì)推進(jìn)到 Partition 中的下一個(gè) Offset,繼續(xù)讀取消息。
Offset 的推進(jìn)和記錄都是 Consumer 的責(zé)任,Kafka 是不管的。
例如一個(gè) Topic 有 3 個(gè) Partition,你有 4 個(gè) Consumer 負(fù)責(zé)這個(gè) Topic,也只會(huì)有3個(gè) Consumer 工作,另一個(gè)作為后補(bǔ)隊(duì)員,當(dāng)某個(gè) Consumer 故障了,它再補(bǔ)上去,是一種很好的容錯(cuò)機(jī)制。


本文作者劉玉翀(上海新炬中北團(tuán)隊(duì))

本文來源:“IT那活兒”公眾號(hào)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/129135.html

相關(guān)文章

  • Kafka圖文詳解

    摘要:每一次寫操作都分發(fā)到所有副本只有大部分節(jié)點(diǎn)應(yīng)答才能提交寫缺點(diǎn)隨著副本數(shù)的增加集群中需要的節(jié)點(diǎn)數(shù)量比較多存儲(chǔ)元數(shù)據(jù)數(shù)據(jù)量不是很大使用比較合適對于一次寫的提交要求當(dāng)前中的所有成員都才算提交寫成功的大小是可配置的和副本數(shù)量沒有關(guān)系比如個(gè)副本可以 Every write operation goes to all replicas, but only responsesfrom a majority...

    FrancisSoung 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<