kafka和mysql內存機制_一文五分鐘讓你徹底理解Kafka架構原理

對于kafka的架構原理我們先提出幾個問題?

1.Kafka的topic和分區內部是如何存儲的,有什么特點?

2.與傳統的消息系統相比,Kafka的消費模型有什么優點?

3.Kafka如何實現分布式的數據存儲與數據讀取?

一、Kafka架構圖

8eb2a5b55dd7

1.kafka名詞解釋

在一套kafka架構中有多個Producer,多個Broker,多個Consumer,每個Producer可以對應多個Topic,每個Consumer只能對應一個ConsumerGroup。

整個Kafka架構對應一個ZK集群,通過ZK管理集群配置,選舉Leader,以及在consumer group發生變化時進行rebalance。

名稱

解釋

Broker

消息中間件處理節點,一個Kafka節點就是一個broker,一個或者多個Broker可以組成一個Kafka集群

Topic

主題,Kafka根據topic對消息進行歸類,發布到Kafka集群的每條消息都需要指定一個topic

Producer

消息生產者,向Broker發送消息的客戶端

Consumer

消息消費者,從Broker讀取消息的客戶端

ConsumerGroup

每個Consumer屬于一個特定的Consumer Group,一條消息可以發送到多個不同的Consumer Group,但是一個Consumer Group中只能有一個Consumer能夠消費該消息

Partition

物理上的概念,一個topic可以分為多個partition,每個partition內部是有序的

2.Topic和Partition

在Kafka中的每一條消息都有一個topic。一般來說在我們應用中產生不同類型的數據,都可以設置不同的主題。一個主題一般會有多個消息的訂閱者,當生產者發布消息到某個主題時,訂閱了這個主題的消費者都可以接收到生產者寫入的新消息。

kafka為每個主題維護了分布式的分區(partition)日志文件,每個partition在kafka存儲層面是append log。任何發布到此partition的消息都會被追加到log文件的尾部,在分區中的每條消息都會按照時間順序分配到一個單調遞增的順序編號,也就是我們的offset,offset是一個long型的數字,我們通過這個offset可以確定一條在該partition下的唯一消息。在partition下面是保證了有序性,但是在topic下面沒有保證有序性。

8eb2a5b55dd7

在上圖中在我們的生產者會決定發送到哪個Partition。

1.如果沒有Key值則進行輪詢發送。

2.如果有Key值,對Key值進行Hash,然后對分區數量取余,保證了同一個Key值的會被路由到同一個分區,如果想隊列的強順序一致性,可以讓所有的消息都設置為同一個Key。

3.消費模型

消息由生產者發送到kafka集群后,會被消費者消費。一般來說我們的消費模型有兩種:推送模型(psuh)和拉取模型(pull)

基于推送模型的消息系統,由消息代理記錄消費狀態。消息代理將消息推送到消費者后,標記這條消息為已經被消費,但是這種方式無法很好地保證消費的處理語義。比如當我們把已經把消息發送給消費者之后,由于消費進程掛掉或者由于網絡原因沒有收到這條消息,如果我們在消費代理將其標記為已消費,這個消息就永久丟失了。如果我們利用生產者收到消息后回復這種方法,消息代理需要記錄消費狀態,這種不可取。如果采用push,消息消費的速率就完全由消費代理控制,一旦消費者發生阻塞,就會出現問題。

Kafka采取拉取模型(poll),由自己控制消費速度,以及消費的進度,消費者可以按照任意的偏移量進行消費。比如消費者可以消費已經消費過的消息進行重新處理,或者消費最近的消息等等。

4.網絡模型

4.1 KafkaClient --單線程Selector

8eb2a5b55dd7

單線程模式適用于并發鏈接數小,邏輯簡單,數據量小。

在kafka中,consumer和producer都是使用的上面的單線程模式。這種模式不適合kafka的服務端,在服務端中請求處理過程比較復雜,會造成線程阻塞,一旦出現后續請求就會無法處理,會造成大量請求超時,引起雪崩。而在服務器中應該充分利用多線程來處理執行邏輯。

4.2 Kafka--server -- 多線程Selector

8eb2a5b55dd7

在kafka服務端采用的是多線程的Selector模型,Acceptor運行在一個單獨的線程中,對于讀取操作的線程池中的線程都會在selector注冊read事件,負責服務端讀取請求的邏輯。成功讀取后,將請求放入message queue共享隊列中。然后在寫線程池中,取出這個請求,對其進行邏輯處理,即使某個請求線程阻塞了,還有后續的縣城從消息隊列中獲取請求并進行處理,在寫線程中處理完邏輯處理,由于注冊了OP_WIRTE事件,所以還需要對其發送響應。

5.高可靠分布式存儲模型

在Kafka中保證高可靠模型的依靠的是副本機制,有了副本機制之后,就算機器宕機也不會發生數據丟失。

5.1高性能的日志存儲

kafka一個topic下面的所有消息都是以partition的方式分布式的存儲在多個節點上。同時在kafka的機器上,每個Partition其實都會對應一個日志目錄,在目錄下面會對應多個日志分段(LogSegment)。LogSegment文件由兩部分組成,分別為“.index”文件和“.log”文件,分別表示為segment索引文件和數據文件。這兩個文件的命令規則為:partition全局的第一個segment從0開始,后續每個segment文件名為上一個segment文件最后一條消息的offset值,數值大小為64位,20位數字字符長度,沒有數字用0填充,如下,假設有1000條消息,每個LogSegment大小為100,下面展現了900-1000的索引和Log:

8eb2a5b55dd7

由于kafka消息數據太大,如果全部建立索引,即占了空間又增加了耗時,所以kafka選擇了稀疏索引的方式,這樣的話索引可以直接進入內存,加快偏查詢速度。

簡單介紹一下如何讀取數據,如果我們要讀取第911條數據首先第一步,找到他是屬于哪一段的,根據二分法查找到他屬于的文件,找到0000900.index和00000900.log之后,然后去index中去查找 (911-900) =11這個索引或者小于11最近的索引,在這里通過二分法我們找到了索引是[10,1367]然后我們通過這條索引的物理位置1367,開始往后找,直到找到911條數據。

上面講的是如果要找某個offset的流程,但是我們大多數時候并不需要查找某個offset,只需要按照順序讀即可,而在順序讀中,操作系統會對內存和磁盤之間添加page cahe,也就是我們平常見到的預讀操作,所以我們的順序讀操作時速度很快。但是kafka有個問題,如果分區過多,那么日志分段也會很多,寫的時候由于是批量寫,其實就會變成隨機寫了,隨機I/O這個時候對性能影響很大。所以一般來說Kafka不能有太多的partition。針對這一點,RocketMQ把所有的日志都寫在一個文件里面,就能變成順序寫,通過一定優化,讀也能接近于順序讀。

可以思考一下:1.為什么需要分區,也就是說主題只有一個分區,難道不行嗎?2.日志為什么需要分段

5.2副本機制

Kafka的副本機制是多個服務端節點對其他節點的主題分區的日志進行復制。當集群中的某個節點出現故障,訪問故障節點的請求會被轉移到其他正常節點(這一過程通常叫Reblance),kafka每個主題的每個分區都有一個主副本以及0個或者多個副本,副本保持和主副本的數據同步,當主副本出故障時就會被替代。

8eb2a5b55dd7

在Kafka中并不是所有的副本都能被拿來替代主副本,所以在kafka的leader節點中維護著一個ISR(In sync Replicas)集合,翻譯過來也叫正在同步中集合,在這個集合中的需要滿足兩個條件:

節點必須和ZK保持連接

在同步的過程中這個副本不能落后主副本太多

另外還有個AR(Assigned Replicas)用來標識副本的全集,OSR用來表示由于落后被剔除的副本集合,所以公式如下:ISR = leader + 沒有落后太多的副本; AR = OSR+ ISR;

這里先要說下兩個名詞:HW(高水位)是consumer能夠看到的此partition的位置,LEO是每個partition的log最后一條Message的位置。HW能保證leader所在的broker失效,該消息仍然可以從新選舉的leader中獲取,不會造成消息丟失。

當producer向leader發送數據時,可以通過request.required.acks參數來設置數據可靠性的級別:

1(默認):這意味著producer在ISR中的leader已成功收到的數據并得到確認后發送下一條message。如果leader宕機了,則會丟失數據。

0:這意味著producer無需等待來自broker的確認而繼續發送下一批消息。這種情況下數據傳輸效率最高,但是數據可靠性確是最低的。

-1:producer需要等待ISR中的所有follower都確認接收到數據后才算一次發送完成,可靠性最高。但是這樣也不能保證數據不丟失,比如當ISR中只有leader時(其他節點都和zk斷開連接,或者都沒追上),這樣就變成了acks=1的情況。

以上就是我的分享,看完的朋友記得點贊噢!想學習更多的Java技術方面的知識的朋友們,可以進我的Java高級架構師交流群,里面有高可用、高并發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料,群號:680075317,也可以進群一起交流,比如遇到技術瓶頸、面試不過的,大家一些交流學習!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532911.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532911.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532911.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos mysql 互為主從_centos7 mysql互為主從+keepalived

一、互為主從配置1.1、資源情況192.168.11.177 server1192.168.11.180 server2192.168.11.210 VIP1.2、server1配置# vi /etc/my.cnf[mysqld]server-id1log-binmysql-binrelay_logmysql-realy-binrelay_log_indexslave-mysql-realy-bin.indexexpire_logs_days15binlog_formatmi…

手機apk簽名工具安卓版_小飛魚APK簽名工具使用方法

小飛魚APK簽名工具是小飛魚旗下的一款APK簽名軟件。是移動開發者必備的一款軟件。使用方法1、雙擊運行小飛魚APK簽名工具.exe文件,出現如下界面:2、點擊“功能”,沒有簽名證書的選擇證書制作,制作完證書再選擇APK簽名,有證書的直接…

React 路由傳參

引言 在上一篇中&#xff0c;我們學習了 React 中使用路由技術&#xff0c;以及如何使用 MyNavLink 去優化使用路由時的代碼冗余的情況。 這一節我們繼續上一篇 React 路由進行一些補充 1. Switch 解決相同路徑問題 首先我們看一段這樣的代碼 <Route path"/home&q…

mysql 5.5 client 字符集_rhel4 mysql5.5 字符集_character set

和oracle字符集一樣,有些暈,太細了小結:1,字符集分為:服務器,數據庫,表,連接,列等對應參數為:mysql> show variables like chara%;------------------------------------------------------| Variable_name | Value |---------------------…

mysql heartbeat lvs_mysql+heartbeat+DRBD+LVS實現mysql高可用二

上一節&#xff0c;講述了DRBD的安裝&#xff0c;因為要利用heartbeatDRBDmysql實現mysql的高可用&#xff0c;所以這一節講述安裝mysql和heartbeat的安裝分別在各個節點安裝mysql&#xff0c;文本使用的是二進制的安裝包mysql-5.5.33-linux2.6-x86_64.tar.gz[rootdrbd1 usr]# …

mysql 嵌入式 性能_database – 在mySQL中優化嵌入式SELECT查詢

好的,這是我現在正在運行的一個查詢,它有45,000條記錄,大小為65MB ……并且即將變得越來越大(所以我也要考慮未來的性能)&#xff1a;SELECT count(payment_id) as signup_count,sum(amount) as signup_amountFROM payments pWHERE tm_completed BETWEEN 2009-05-01 AND 2009-0…

mysql執行語句后回退_MySQL命令學習筆記(八)

1 安全管理1.1 訪問控制MySQL服務器的安全基礎是&#xff1a; 用戶應該對他們需要的數據具有適當的訪問權&#xff0c;既不能多也不能少1.2 管理用戶MySQL用戶賬號和信息存儲在名為mysql的MySQL數據庫中。獲得所有用戶賬號列表時&#xff0c;可使用以下代碼&#xff1a;USE mys…

mysql怎樣dao出數據庫_mysql怎么導出數據庫?

mysql怎么導出數據庫&#xff1f;下面本篇文章就來給大家介紹3種mysql導出數據庫的方法&#xff0c;希望對你們有所幫助。mysql導出數據庫的方法&#xff1a;方法一cmd 到mysql bin目錄下用如下命令&#xff1a;mysqldump --opt -h192.168.0.156 -uusername -ppassword --skip-…

mac 安裝mysql怎么卸載不干凈_CleanMyMac卸載不干凈怎么辦?如何徹底刪除Mac上的CleanMyMac?...

CleanMyMac for mac是非常受歡迎的系統清理、軟件卸載軟件&#xff0c;但是想要卸載CleanMyMac的有些用戶發現不能完全卸載&#xff0c;那么CleanMyMac卸載不干凈怎么辦&#xff1f;如何徹底刪除CleanMyMac&#xff1f;這里帶來兩種可以徹底刪除CleanMyMac的方法&#xff0c;有…

mysql判斷是否為null_MySQL如何判斷字段是否為null

相信很多用了MySQL很久的人,對這兩個字段屬性的概念還不是很清楚,一般會有以下疑問: 我字段類型是not null,為什么我可以插入空值 為什么not null的效率比null高 判斷字段不為空的時候,到底要 select * from table where column <> 還是要用 select * from table w…

mysql修改表的字段_mysql修改表字段學習筆記

--修改表字段CREATE TABLE register (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR (10) DEFAULT NULL UNIQUE KEY,age tinyint UNSIGNED DEFAULT 18,regisTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP (),fund DOUBLE (9, 2) DEFAULT 1000000.00,tel CHAR (11) NOT NULL);--…

python 條件概率_使用Pymc3的條件概率

我的問題是如何使用PYMC3包來實現條件概率模型。在我有一組數據a_觀察到&#xff0c;b棼u觀察到&#xff0c;并且我想找出它們之間的關系。我懷疑a&#xff0c;b&#xff0c;c都是正態分布&#xff0c;b依賴于a&#xff0c;c依賴于a&#xff0c;b。我需要找到參數。在到目前為止…

python如何導入自定義模塊_【python】導入自定義模塊

一、直接import1.當執行文件與要導入的py文件在同一目錄下時假設要在wangyi.py中導入weibo.py文件import weibo2.當執行文件與要導入的py文件所在文件夾在同一目錄下時假設要在wangyi.py中導入post packaging中的method.py(1)from post_packaging import method(2)from post_pa…

python給視頻加背景音樂_python中加背景音樂如何操作

在python中加背景音樂的方法&#xff1a;1、導入pygame資源包&#xff1b;2、修改音樂的file路徑&#xff1b;3、使用init()方法進行初始化&#xff1b;4、使用load()方法添加音樂文件&#xff1b;5、使用play()方法播放音樂流即可。下面的代碼直接復制粘貼到自己的代碼即可實現…

python能和wincc一起用_搬家第二天-41.Wincc V7.3 利用Inputbox和Msgbox做權限管理和二次確認設計...

有時候我們希望做某個操作時&#xff0c;有密碼管理或者二次確認。密碼管理可以通過用戶管理方式設置權限&#xff0c;也可以通過彈窗輸入密碼的方式&#xff1b;二次確認主要是使用彈窗然后捕獲用戶點擊的按鈕編號來進行。下面通過一個簡單的日子記錄一下如何實現。一 準備工作…

mysql中的函數編程_MySQL

12.2. 控制流程函數CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END在第一個方案的返回結果中&#xff0c; valuecompare-v…

python畫窗口_pyqt中圖案如何畫在子窗口上

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓基本思路是從QWidget派生出一個類重寫paintEvent&#xff0c;在里面畫圖。UI部分代碼是這樣的class Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(1008, 693)self.widget QtWidgets…

twisted mysql_Twisted MySQL adbapi返回字典

有沒有辦法把adbapi查詢的字典結果返回到MySQL&#xff1f;在[name: Bob, phone_number: 9123 4567]默認返回元組。在^{pr2}$對于簡單的Python&MySQL&#xff0c;我們可以使用MySQLdb.cursors.dictcursors。但是如何與扭曲的adbapi一起使用呢UPD:我解決了&#xff0c;但我認…

win 10 java 安裝_win10---Java安裝及環境變量配置

一、Java安裝給出的下載地址已經是1.8.0及以上的版本&#xff0c;只需要進去根據操作系統位數選擇所對應的包即可&#xff0c;我的是Windows x64&#xff0c;所以我選擇的是第二個。注意??&#xff1a;下載jdk時&#xff0c;需要登錄Oracle賬戶&#xff0c;如果沒有&#xff…

java 生成bat_java實現生成windows可執行的批處理文件(.bat)

/*** 下載壓縮包**paramid 商戶id*paramrequest*paramresponse*returnvoid*authorchen.bing* Date 2019/11/4 17:35*/RequestMapping(value "downloadzip")public voiddownloadzip(String id, HttpServletRequest request, HttpServletResponse response) {if(String…