First: Kafka 是什麼?java
Kafka 是一個發佈訂閱系統 最初是是LinkedIn 開發 最後交給Apache 開源組織 github地址:https://github.com/apache/kafka 是用java 和Scala 去開發的~mysql
Kafka 如今主要用於 消息隊列使用git
Kafka 是一個快速 可擴展 內在就是分佈式的系統 github
分佈式: Kafka 提供集羣服務 Kafka cluster 能夠由一個或者多個Broker 組成 每一個Broker 提供對客戶端的服務 redis
分區: 每一類消息 或者叫訂閱主體 topic 能夠有不少分區 Partition sql
複製:一個topic 的分區有多個副本,按照必定的規則分佈在broker集羣中,副本可分爲leader和follow,leader所在broker負責響應客戶端的讀寫請求,follow週期性地同步leader數據,已防止leader故障後消息丟失apache
常見的術語有哪些服務器
Broker :架構
Kafka集羣包含一個或多個服務器,這種服務器被稱爲broker。broker端不維護數據的消費狀態,提高了性能。直接使用磁盤進行存儲,線性讀寫,速度快:避免了數據在JVM內存和系統內存之間的複製,減小耗性能的建立對象和垃圾回收分佈式
Topic && Partition :
Topic 是指消息發送的服務器的類別 消費着用此類別去訂閱消息 好比我訂閱的是蘇州日報 仍是人民日報等此意思,topic 可存在於一個或者多個broker 中 消費者 不用關心 存儲在那個broker 中 就像 咱們網上買東西 咱們不關心 這個東西存在那個物流倉庫裏面 反正會有快遞員 給我送過來~
每一個topic 會有存一個或者多個Partition 中 每一個Partition 都能保證有序 Partition 物理地址中 對應的是一個文件夾 文件夾中 這個目錄下有兩類文件,一類是以log爲後綴的文件,另外一類是以index爲後綴的文件 每個log文件和一個index文件相對應,這一對文件就是一個Segment File,其中的log文件就是數據文件,裏面存放的就是Message,而index文件是索引文件。Index文件記錄了元數據信息,指向對應的數據文件中Message的物理偏移量。
Partition 的存在 線性的提升的kafka的吞吐效率
Topic 是一個邏輯概念 最終真正的物理實現是partition 當建立topic 的時候會指定partition的數量 數量越大 其吞吐能力越強 可是也越消耗資源
Producer:
發佈消息到Kafka Broke
Consumer && Consumer Group:
Consumer:消息的消費者,從Kafka Broker中拉取消息的客戶端
每一個Consumer屬於一個特定的Consumer Group(可爲每一個Consumer指定group name,若不指定group name則屬於默認的group)
每一個Partition 只會被Consumer Group中的一個Consumer 順序消費 每一個Consumer Group 中的一個Consumer 會消費一個或者多個Partition
因此設置topic 中的Pattition 的數量要根據 Consumer Group 中的consumer 作參考 通常是相等 若是Consumer group 的數量大於訂閱的topic 中的partition 數量多致使 其中一個consumer 無法消費數據
保存位置: 在老版本中offset保存在zk中,而在新版本中offset保存在kafka本身的一個名爲consumer_offsets的topic中.
爲了防止consumer在處理消息過程當中,出現消息丟失的狀況,也能夠由consumer將offset保存到第三方庫中,由consumer本身維護,好比redis,mysql中.
惟一標識 :offset以groupid,topic,partition組成的三元組來惟一區分不一樣的partition分區的偏移量.
Replica
副本,Kafka中同一條消息拷貝到多個地方作數據冗餘,這些地方就是副本,副本分爲Leader和Follower,角色不一樣做用不一樣,副本是對Partition而言的,每一個分區可配置多個副原本實現高可用
Record
消息,Kafka處理的對象
Second:Kafka 有什麼特色
1:持久化 消息存儲在磁盤中 爲何存在磁盤中還能這麼快 後面進階慢慢去分析 得益於他的文件存儲結構
2:高吞吐 因爲每一個topic 能夠分別存儲於每一個partition 中 能夠橫向擴展 線性的提升了Kafka 的吞吐量
3:分佈式 kafka 能夠有一個或者多個Broker 原本就是一個分佈式的架構系統 可快速的去平滑擴展
4:實時性 因爲消息持久化,使kafka能夠支持離線; 實時性使kafka又能夠支持在線,可用於一些流計算
End: Kafka 用於哪些場景
正是因爲具備實時性的特色
常見的架構組合:Flume+Kafka+Storm/Spark streaming +Hbase/Hive
Flume+Kafka+Hdfs 搭建實時日誌收集系統
Flume+Kafka+Storm/Spark streaming :搭建流數據處理系統
下篇:
1: 消費位置offset 怎麼去維護存儲的
2:Kafka 文件存儲機制 怎麼去存儲 怎麼去查詢
3:kafka 中zk 是怎麼工做的?
問題分析:
1:Kafka全局消費的有序性
2:kafka的數據重複消費怎麼處理
3:如何保證kafka中數據不丟失?
4:Kafka 爲何這麼快
參考:https://juejin.im/post/5cd2db8951882530b11ee976
參考文獻以下: