精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Kafka源碼分析及圖解原理之Broker端

開源 Kafka
一個topic可以有多個分區,每個分區的消息都是不同的。 雖然分區可以提供更高的吞吐量,但是分區不是越多越好。

 [[277321]]

首先從kafka如何創建一個topic來開始:

  1. kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test 

其中有這么幾個參數:

  • --zookeeper:zookeeper的地址
  • --replication-factor:副本因子
  • --partitions:分區個數(默認是1)
  • --topic:topic名稱

二.什么是分區

一個topic可以有多個分區,每個分區的消息都是不同的。 雖然分區可以提供更高的吞吐量,但是分區不是越多越好。一般分區數不要超過kafka集群的機器數量。分區越多占用的內存和文件句柄。 一般分區設置為3-10個。比如現在集群有3個機器,要創建一個名為test的topic,分區數為2,那么如圖:

Kafka源碼分析及圖解原理之Broker端

partiton都是有序切順序不可變的記錄集,并且不斷追加到log文件,partition中的每一個消息都回分配一個id,也就是offset(偏移量),offset用來標記分區的一條記錄 ,這里就用官網的圖了,我畫的不好:

Kafka源碼分析及圖解原理之Broker端

2.1 producer端和分區關系

就圖上的情況,producer端會把mq給哪個分區呢?這也是上一節我們提到的一個參數partitioner.class。 默認分區器的處理是:有key則用murmur2算法計算key的哈希值,對總分區取模算出分區號,無key則輪詢。(org.apache.kafka.clients.producer.internals.DefaultPartitioner#partition)。當然了我們也可以自定義分區策略,只要實現org.apache.kafka.clients.producer.Partitioner接口即可:

  1. /** 
  2.  * Compute the partition for the given record. 
  3.  * 
  4.  * @param topic The topic name 
  5.  * @param key The key to partition on (or null if no key
  6.  * @param keyBytes serialized key to partition on (or null if no key
  7.  * @param value The value to partition on or null 
  8.  * @param valueBytes serialized value to partition on or null 
  9.  * @param cluster The current cluster metadata 
  10.  */ 
  11.  public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) { 
  12.  List<PartitionInfo> partitions = cluster.partitionsForTopic(topic); 
  13.  int numPartitions = partitions.size(); 
  14.  if (keyBytes == null) { 
  15.  int nextValue = nextValue(topic); 
  16.  List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic); 
  17.  if (availablePartitions.size() > 0) { 
  18.  int part = Utils.toPositive(nextValue) % availablePartitions.size(); 
  19.  return availablePartitions.get(part).partition(); 
  20.  } else { 
  21.  // no partitions are available, give a non-available partition 
  22.  return Utils.toPositive(nextValue) % numPartitions; 
  23.  } 
  24.  } else { 
  25.  // hash the keyBytes to choose a partition 
  26.  return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions; 
  27.  } 
  28.  } 

2.2 consumer端和分區關系

先來看下官網對于消費組的定義:Consumers label themselves with a consumer group name, and each record published to a topic is delivered to one consumer instance within each subscribing consumer group.

翻譯:消費者使用一個消費者組名來標記自己,一個topic的消息會被發送到訂閱它的消費者組的 一個 消費者實例上。

consumer group是用于實現高伸縮性,高容錯性的consumer機制。如果有consumer掛了或者新增一個consumer,consumer group會進行重平衡(rebalance),重平衡機制會在consumer篇具體講解,本節不講。那么按照上面的圖繼續畫消費者端:

Kafka源碼分析及圖解原理之Broker端

這里是最好的情況,2個partition對應1個group中的2個consumer。那么思考,如果一個消費組的消費者大于分區數呢?或者小于分區數呢?

如果一個消費組的消費者大于分區數,那么相當于多余的消費者是一種浪費,多余的消費者將無法消費消息。

如果一個消費組的消費者小于分區數,會有對應的消費者分區分配策略。一種是Range(默認),一種是RoundRobin(輪詢),當然也可以自定義策略。 其實思想換湯不換藥的啊,每個消費者能負載均衡的工作。 具體會在消費者篇講解,這里不講。

建議:配置分區數是消費者數的整數倍

三.副本與ISR設計

3.1 什么是副本

在創建topic的時候有個參數是--replication-factor來設定副本數。Kafka利用多份相同的備份保持系統的高可用性,這些備份在Kafka中被稱為副本(replica)。副本分為3類:

  • leader副本:響應producer端的讀寫請求
  • follower副本:備份leader副本的數據, 不響應producer端的讀寫請求!
  • ISR副本集合:包含1個leader副本和所有follower副本(也可能沒有follower副本)

Kafka會把所有的副本均勻分配到kafka-cluster中的所有broker上,并從這些副本中挑選一個作為leader副本,其他成為follow副本。如果leader副本所在的broker宕機了,那么其中的一個follow副本就會成為leader副本。leader副本接收producer端的讀寫請求,而follow副本只是向leader副本請求數據不會接收讀寫請求!

Kafka源碼分析及圖解原理之Broker端

3.2 副本同步機制

上面說了ISR就是動態維護一組同步副本集合,leader副本總是包含在ISR集合中。只有ISR中的副本才有資格被選舉為leader副本。當producer端的ack參數配置為all(-1)時,producer寫入的mq需要ISR所有副本都接收到,才被視為已提交。當然了,上一節就提到了,使用ack參數必須配合broker端的min.insync.replicas(默認是1)參數一起用才能達到效果,該參數控制寫入isr中的多少副本才算成功。 如果ISR中的副本數少于min.insync.replicas時,客戶端會返回異常org.apache.kafka.common.errors.NotEnoughReplicasExceptoin: Messages are rejected since there are fewer in-sync replicas than required。

要了解副本同步機制需要先學習幾個術語:

  • High Watermark:副本高水位值,簡稱HW, 小于HW或者說在HW以下的消息都被認為是“已備份的”,HW指向的也是下一條消息! leader副本的HW值決定consumer能poll的消息數量!consumer只能消費小于HW值的消息!
  • LEO:log end offset,下一條消息的位移。 也就是說LEO指向的位置是沒有消息的!
  • remote LEO:嚴格來說這是一個集合。leader副本所在broker的內存中維護了一個Partition對象來保存對應的分區信息,這個Partition中維護了一個Replica列表,保存了該分區所有的副本對象。除了leader Replica副本之外,該列表中其他Replica對象的LEO就被稱為remote LEO。
Kafka源碼分析及圖解原理之Broker端

下面舉個一個實際的例子(本例子參考胡夕博客),該例子中的topic是單分區,副本因子是2。也就是說一個leader副本,一個follower副本,ISR中包含這2個副本集合。我們首先看下當producer發送一條消息時,leader/follower端broker的副本對象到底會發生什么事情以及分區HW是如何被更新的。首先是初始狀態:

Kafka源碼分析及圖解原理之Broker端

此時producer給該topic分區發送了一條消息。此時的狀態如下圖所示:

Kafka源碼分析及圖解原理之Broker端

如上圖所見,producer發送消息成功后(假設acks=1, leader成功寫入即返回),follower發來了新的FECTH請求,依然請求fetchOffset = 0的數據。和上次不同的是,這次是有數據可以讀取的,因此整個處理流程如下圖:

Kafka源碼分析及圖解原理之Broker端

顯然,現在leader和follower都保存了位移是0的這條消息,但兩邊的HW值都沒有被更新,它們需要在下一輪FETCH請求處理中被更新,如下圖所示:

Kafka源碼分析及圖解原理之Broker端

簡單解釋一下, 第二輪FETCH請求中,follower發送fetchOffset = 1的FETCH請求——因為fetchOffset = 0的消息已經成功寫入follower本地日志了,所以這次請求fetchOffset = 1的數據了。Leader端broker接收到FETCH請求后首先會更新other replicas中的LEO值,即將remote LEO更新成1,然后更新分區HW值為1——具體的更新規則參見上面的解釋。做完這些之后將當前分區HW值(1)封裝進FETCH response發送給follower。Follower端broker接收到FETCH response之后從中提取出當前分區HW值1,然后與自己的LEO值比較,從而將自己的HW值更新成1,至此完整的HW、LEO更新周期結束。

3.3 ISR維護

在0.9.0.0版本之后,只有一個參數:replica.lag.time.max.ms來判定該副本是否應該在ISR集合中,這個參數默認值為10s。意思是如果一個follower副本響應leader副本的時間超過10s,kafka會認為這個副本走遠了從同步副本列表移除。

四.日志設計

Kafka的每個主題相互隔離,每個主題可以有一個或者多個分區,每個分區都有記錄消息數據的日志文件:

Kafka源碼分析及圖解原理之Broker端

圖中有個demo-topic的主題,這個topic有8個分區,每一個分區都存在[topic-partition]命名的消息日志文件 。在分區日志文件中,可以看到前綴一樣,但是文件類型不一樣的幾個文件。比如圖中的3個文件,(00000000000000000000.index、00000000000000000000.timestamp、00000000000000000000.log)。這稱之為一個LogSegment(日志分段)。

4.1 LogSegment

以一個測試環境的具體例子來講,一個名為ALC.ASSET.EQUITY.SUBJECT.CHANGE的topic,我們看partition0的日志文件:

Kafka源碼分析及圖解原理之Broker端

每一個LogSegment都包含一些文件名一致的文件集合。文件名的固定是20位數字,如果文件名是00000000000000000000代表當前LogSegment的第一條消息的offset(偏移量)為0,如果文件名是00000000000000000097代表當前LogSegment的第一條消息的offset(偏移量)為97。日志文件有多種后綴的文件,重點關注.index、.timestamp、.log三種類型文件即可。

  • .index:偏移量索引文件
  • .timeindex:時間索引文件
  • .log:日志文件
  • .snapshot:快照文件
  • .swap:Log Compaction之后的臨時文件

4.2 索引與日志文件

kafka有2種索引文件,第一種是offset(偏移量)索引文件,也就是.index結尾的文件。第二種是時間戳索引文件,也就是.timeindex結尾的文件。

我們可以用kafka-run-class.sh來查看offset(偏移量)索引文件的內容:

Kafka源碼分析及圖解原理之Broker端

可以看到每一行都是offset:xxx position:xxxx。 這兩者沒有直接關系。

  • offset:相對偏移量
  • position:物理地址

那么第一行的offset:12 position:4423是什么意思呢?它代表偏移量從0-12的消息的物理地址在0-4423。

同理第二行的offset:24 position:8773的意思也能猜得出來:它代表偏移量從13-24的消息的物理地址在4424-8773。

我們可以再用kafka-run-class.sh來看下.log文件的文件內容,關注里面的baseOffset和postion的值。你看看和上面說的對應的上嗎。

[[277322]]

4.3 如何用offset查找

按上面的例子,如何查詢偏移量為60的消息

根據offset首先找到對應的LogSegment,這里找到00000000000000000000.index

通過二分法找到不大于offset的最大索引項,這里找到offset:24 position:8773

打開00000000000000000000.log文件,從position為8773的那個地方開始順序掃描直到找到offset=60的消息

Kafka源碼分析及圖解原理之Broker端

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-08-14 08:17:13

Kafka服務端

2022-09-23 08:02:42

Kafka消息緩存

2023-12-26 08:16:56

Kafka緩存架構客戶端

2021-08-09 11:15:28

MybatisJavaSpring

2023-02-22 08:12:30

KafkaSender 線程

2024-10-30 10:06:51

2021-12-07 07:32:09

kafka架構原理

2021-04-09 08:54:14

Kafka源碼架構開發技術

2021-06-09 10:29:23

Kafka架構組件

2021-09-05 07:35:58

lifecycleAndroid組件原理

2019-10-16 16:33:41

Docker架構語言

2023-03-15 08:17:27

Kafka網絡通信組件

2022-08-22 08:45:57

Kafka網絡層源碼實現

2014-12-11 13:37:13

WPF架構

2022-08-30 09:01:11

瀏覽器渲染前端

2021-12-15 15:03:51

Linux內核調度

2021-11-26 17:17:43

Android廣播運行原理源碼分析

2011-05-26 10:05:48

MongoDB

2024-08-23 16:04:45

2021-07-06 09:29:38

Cobar源碼AST
點贊
收藏

51CTO技術棧公眾號

国产一级在线免费观看| 天天久久综合网| 国产黄色片在线观看| 美国av一区二区| 欧美成人精品在线播放| 最近中文字幕无免费| 亚洲精品一区三区三区在线观看| 1024国产精品| 久久久久久久久久码影片| 日本黄色中文字幕| 欧美韩国一区| 亚洲人永久免费| 91插插插影院| 亚洲www.| 性久久久久久久久| 自拍偷拍亚洲色图欧美| 婷婷久久久久久| 国产综合久久久久影院| 欧美有码在线视频| 中文字幕另类日韩欧美亚洲嫩草| 精品中文字幕一区二区三区av| 91精品国产免费| 91av俱乐部| av手机在线观看| 亚洲日本在线天堂| 日本午夜精品一区二区| 亚洲老妇色熟女老太| 另类调教123区| 欧洲日韩成人av| 欧美三级在线免费观看| 久久国产成人午夜av影院宅| 日韩精品免费看| 中文字幕在线观看91| 香蕉成人在线| 欧美三级一区二区| 免费裸体美女网站| av最新在线| 亚洲最色的网站| japanese在线播放| 婷婷成人激情| 中文字幕中文乱码欧美一区二区| 日本一区免费看| 猫咪在线永久网站| 91亚洲精品久久久蜜桃| 国产精品麻豆免费版| 国产成人精品一区二三区四区五区| 蜜臀91精品一区二区三区| 欧美亚洲国产日本| 久久黄色精品视频| 亚洲激情网址| 1769国内精品视频在线播放| 粉嫩aⅴ一区二区三区| 国色天香一区二区| 午夜精品福利视频| 日产电影一区二区三区| 一区二区视频欧美| 高清视频欧美一级| 日韩精品成人一区| 亚洲少妇一区| 国产成人97精品免费看片| 日本视频网站在线观看| 久久午夜电影| 国产精品久久久久久久久免费| 啪啪小视频网站| 人人超碰91尤物精品国产| 国产精品毛片a∨一区二区三区|国| 亚洲精品成人在线视频| 石原莉奈在线亚洲三区| 国产日韩欧美夫妻视频在线观看| 国产精品伦一区二区三区| 蜜桃一区二区三区在线| 成人性生交大片免费看小说| 国产aⅴ一区二区三区| 国产精品一区专区| 黄色国产精品一区二区三区| 欧洲天堂在线观看| 中文字幕日本不卡| 久无码久无码av无码| 久草免费在线视频| 色噜噜夜夜夜综合网| 亚洲综合色在线观看| 精品午夜av| 亚洲精品国产精品国自产观看浪潮| 扒开jk护士狂揉免费| 水蜜桃精品av一区二区| 欧美日本高清一区| 免费黄色网址在线| 久久精品国产免费| 国产高清自拍一区| av免费在线一区二区三区| 亚洲激情图片一区| 三级4级全黄60分钟| 99精品国产九九国产精品| 精品国产三级电影在线观看| 欧美做受喷浆在线观看| 日韩久久视频| 欧美精品第一页在线播放| 探花视频在线观看| 国产综合色产在线精品| 久久国产欧美精品| 国产黄色在线观看| 欧美视频一区二区三区…| 亚洲精品成人在线播放| 日韩美女国产精品| 久久视频中文字幕| 4438国产精品一区二区| 国产成人午夜高潮毛片| 日本电影一区二区三区| 黄色羞羞视频在线观看| 欧美性色黄大片| 中文字幕乱码在线| 亚洲区综合中文字幕日日| 日本久久精品视频| 成人免费公开视频| 亚洲图片你懂的| 日韩免费高清在线| 日韩有码av| 欧美精品videos另类日本| 一区二区国产欧美| 久久久久久久一区| 欧美大片拔萝卜| 美女日批在线观看| 色偷偷综合网| 欧美最近摘花xxxx摘花| www.五月婷婷| **欧美大码日韩| xxxx一级片| 性人久久久久| 久久久久久久久国产| 在线免费观看日韩视频| 久久久91精品国产一区二区三区| 18黄暴禁片在线观看| 欧美三级一区| 久久精品国产成人精品| 中文字幕无线码一区| 久久久久国色av免费看影院| 国产女人水真多18毛片18精品视频 | 亚洲一区二区日本| 都市激情一区| 欧美在线观看禁18| www亚洲色图| 日韩国产一区二| 美女三级99| а√天堂中文在线资源8| 欧美成人国产一区二区| 青青草手机视频在线观看| 国内外成人在线视频| 五月天色婷婷综合| 国产精品久久久久久久久久辛辛 | 高清一区二区中文字幕| 日韩在线免费观看视频| 国产又色又爽又黄又免费| 国产精品久久久久久久久快鸭| 日本激情综合网| 欧美激情黄色片| 91精品免费久久久久久久久| 超碰超碰在线| 日韩精品一区二区三区老鸭窝 | 欧美日韩综合| 国产成人一区二区三区免费看| 国内小视频在线看| 亚洲黄色片网站| 日本韩国欧美中文字幕| 国产日本欧美一区二区| 手机看片一级片| 你懂的亚洲视频| 成人黄动漫网站免费| av免费不卡| 永久555www成人免费| 一区不卡在线观看| 亚洲一区在线观看视频| 毛茸茸多毛bbb毛多视频| 久久在线精品| 在线观看免费91| 成人在线视频中文字幕| 欧洲亚洲妇女av| 思思99re6国产在线播放| 欧美一区二区三区喷汁尤物| 亚洲精品午夜久久久久久久| 久久久欧美精品sm网站| 天天干天天操天天做| 欧美色图首页| 欧美一区国产一区| 精品乱码一区二区三区四区| 久操成人在线视频| 你懂的免费在线观看视频网站| 欧美日韩亚洲丝袜制服| 久久影院一区二区| 欧美激情一区二区三区全黄| 性一交一黄一片| 久久一本综合频道| 久久这里只有精品8| 嫩草一区二区三区| 亚洲精品免费网站| 台湾佬成人网| 欧美精品在线观看| 成人综合影院| 亚洲第一天堂av| 国产美女三级无套内谢| 欧美午夜丰满在线18影院| 精品国产视频在线观看| wwwwxxxxx欧美| 香蕉视频xxxx| 国产模特精品视频久久久久| 美国av在线播放| 国产成人短视频在线观看| 成人av男人的天堂| 91成人福利社区| 日韩女优在线播放| av免费在线视| 欧美巨乳美女视频| 日本中文在线| 亚洲色图欧美制服丝袜另类第一页| 亚洲黄色一级大片| 欧美精品v国产精品v日韩精品 | 精品一区二区三区在线视频| 自慰无码一区二区三区| 91精品国产乱码久久久久久| 欧美一区二区三区四区在线观看地址| 99re8这里有精品热视频免费| 国产精品揄拍一区二区| 午夜精品成人av| 午夜剧场成人观在线视频免费观看| 国产精品刘玥久久一区| 国产一区二区三区在线视频 | 高潮无码精品色欲av午夜福利| 亚洲国产精品嫩草影院| 欧美 日韩 国产 一区二区三区| 中文av字幕一区| 精品欧美一区二区久久久| 91片在线免费观看| 欧美久久久久久久久久久| 国产一区二区电影| 17c国产在线| 久久99精品久久久久久动态图| 丁香啪啪综合成人亚洲| 亚洲专区免费| 国产91xxx| 在线亚洲一区| 国产精品免费入口| 国产日韩欧美一区| 久久久999视频| 国产精品婷婷| 女人天堂av手机在线| 国产视频一区欧美| koreanbj精品视频一区| 夜夜精品视频| 亚洲色成人一区二区三区小说| 香蕉视频成人在线观看| 精品国产成人av在线免| 久久久久久穴| 午夜欧美福利视频| 日本免费在线视频不卡一不卡二| 我要看一级黄色大片| 麻豆91在线播放免费| 中文av字幕在线观看| 国产一区三区三区| 午夜影院福利社| 91欧美一区二区| 欧美激情视频二区| 亚洲日本青草视频在线怡红院| 午夜精品一区二区三区视频| 亚洲在线成人精品| 在线观看 中文字幕| 色狠狠色噜噜噜综合网| 在线播放成人av| 日韩一区二区三区免费观看| 亚洲精品第五页| 亚洲精品视频在线观看视频| 国产一二在线观看| 日韩亚洲精品视频| 日韩另类在线| 欧美在线视频播放| 欧美系列精品| 99久久伊人精品影院| 亚洲精品蜜桃乱晃| 亚洲一区二区免费视频软件合集 | 国产精品无码人妻一区二区在线| 久久精品女人| 欧美又黄又嫩大片a级| 99re这里只有精品视频首页| 天天舔天天操天天干| 一区二区视频免费在线观看| 4438国产精品一区二区| 91精品福利在线一区二区三区 | 波多野结衣家庭教师视频 | 欧美高清精品一区二区| 99精品久久99久久久久| 国产wwwwxxxx| 午夜欧美大尺度福利影院在线看| 日韩欧美国产另类| 日韩精品一区二区三区三区免费| 久草福利在线| 久久免费福利视频| 久久免费资源| 国产日韩精品一区观看| 日韩成人免费| 日韩a∨精品日韩在线观看| 蜜桃视频一区二区三区在线观看| 在线看黄色的网站| 中文字幕在线视频一区| 五月天婷婷久久| 欧美一级二级三级蜜桃| 国产大片在线免费观看| 欧美精品制服第一页| 亚洲电影有码| 精品欧美一区二区精品久久| 欧美韩国一区| 亚洲一二三av| 国产欧美日韩另类一区| 少妇一级淫片免费放中国| 日韩欧美精品三级| 毛片网站在线免费观看| 日韩女优人人人人射在线视频| 哺乳一区二区三区中文视频| 欧美精品一区二区性色a+v| 日韩黄色小视频| 欧美 变态 另类 人妖| 亚洲香肠在线观看| 国产黄色大片网站| 菠萝蜜影院一区二区免费| 日本在线精品| 欧美性bbwbbwbbwhd| 夜夜嗨网站十八久久| 野战少妇38p| 亚洲一区二区免费视频| av av片在线看| 久久精品中文字幕| 四虎影视精品永久在线观看| 视频一区三区| 日韩电影在线观看网站| 男人天堂av电影| 日韩欧美有码在线| 深夜福利视频在线免费观看| 性欧美暴力猛交69hd| jazzjazz国产精品麻豆| 国产激情片在线观看| 国产激情一区二区三区| 欧美成人手机视频| 日韩免费在线观看| 欧美人与动牲性行为| 91沈先生播放一区二区| 红桃视频亚洲| 女同性恋一区二区三区| 午夜免费久久看| 青青草视频免费在线观看| 日韩免费精品视频| 国产一区二区三区四区五区| 青青草av网站| 中文久久乱码一区二区| 91欧美日韩麻豆精品| 久久综合88中文色鬼| 麻豆国产一区| 91免费黄视频| 91伊人久久大香线蕉| 成人免费视频国产免费| 在线观看免费高清视频97| 亚洲最大的免费视频网站| 一本二本三本亚洲码| 成人午夜电影久久影院| 国偷自拍第113页| 亚洲天堂男人的天堂| 久久国内精品| 国产日韩欧美大片| 成人精品鲁一区一区二区| 国产性猛交╳xxx乱大交| 在线国产精品视频| 韩国三级成人在线| 日韩精品 欧美| 国产日韩欧美精品在线| 国产精品久久久午夜夜伦鲁鲁 | 免费在线观看一区| 黄色网址在线免费看| 成人丝袜高跟foot| 国产情侣小视频| 欧美成人精品影院| 一本久久青青| 国产探花在线观看视频| 第一福利永久视频精品| 日本在线免费| 国产精品永久入口久久久| 日韩精品色哟哟| 国产大学生自拍| 亚洲视频一区二区| 日韩区一区二| 亚洲色图38p| 亚洲一区二区三区影院| 精华区一区二区三区| 99国产视频| 蜜臀av国产精品久久久久| www.天天色| xvideos亚洲| 啪啪国产精品| 九九热视频免费| 日韩欧美国产激情| av观看在线| 视频一区二区在线观看| av成人免费在线| 999久久久久久| 国产精品精品久久久久久|