KAFKA介紹:
https://www.cnblogs.com/seaspring/p/6138080.html
KAFKA:Controller
http://blog.csdn.net/zhanglh046/article/details/72821995
http://blog.csdn.net/jewes/article/details/42970799
https://www.cnblogs.com/huxi2b/p/6050778.html
KAFKA
KAFKA簡(jiǎn)介
- Kafka由Linkedin開發(fā)的消息隊(duì)列德谅,使用Scala語言編寫
- 分布式玄帕、多分區(qū)遥倦、多副本、基于發(fā)布/訂閱的消息系統(tǒng)
- Kafka設(shè)計(jì)的初衷是希望作為一個(gè)統(tǒng)一的信息收集平臺(tái),能夠?qū)崟r(shí)的收集反饋信息毯炮,并能夠支撐較大的數(shù)據(jù)量分瘾,且具備良好的容錯(cuò)能力
KAFKA特性
- 消息持久化:采用時(shí)間復(fù)雜度O(1)的磁盤結(jié)構(gòu)順序存儲(chǔ)
- 高吞吐量:支持每秒百萬級(jí)別的消息
- 易擴(kuò)展:新增機(jī)器适揉,集群無需停機(jī)窖剑,自動(dòng)感知
- 高容錯(cuò):通過多分區(qū),多副本提供高容錯(cuò)性
- 多客戶端支持:Java捌斧、PHP笛质、Python等
- 實(shí)時(shí)性:進(jìn)入到Kafka的消息能夠立即被消費(fèi)者消費(fèi)
Kafka消息隊(duì)列的作用
- 應(yīng)用程序解耦并行處理
- 順序保證
- 高吞吐率
- 高容錯(cuò)、高可用
- 可擴(kuò)展
- 峰值處理
Kafka的原理
- 在Kafka中捞蚂,發(fā)送消息者稱為Producer妇押,而消息拉取者稱為Consumer ,通常consumer是被定義在Consumer Group里
-
Kafka通過Zookeeper管理集群
- Kafka集群由多個(gè)實(shí)例組成姓迅,每個(gè)節(jié)點(diǎn)稱為Broker,對(duì)消息保存時(shí)根 據(jù)Topic進(jìn)行歸類
- 一個(gè)Topic可以被劃分為多個(gè)Partition
-
每個(gè)Partition可以有多個(gè)副本
- Partition內(nèi)順序存儲(chǔ)肩杈,寫入新消息采用追加的方式解寝,消費(fèi)消息采用 FIFO的方式順序拉取消息
-
一個(gè)Topic可以有多個(gè)分區(qū),Kafka只保證同一個(gè)分區(qū)內(nèi)有序与学,不保 證Topic整體(多個(gè)分區(qū)之間)有序
- Consumer Group(CG)索守,為了加快讀取速度抑片,多個(gè)consumer可以劃 分為一個(gè)組,并行消費(fèi)一個(gè)Topic
-
一個(gè)Topic可以由多個(gè)CG訂閱截汪,多個(gè)CG之間是平等的植捎,同一個(gè)CG 內(nèi)可以有一個(gè)或多個(gè)consumer焰枢,同一個(gè)CG內(nèi)的consumer之間是競(jìng)爭(zhēng) 關(guān)系,一個(gè)消息在一個(gè)CG內(nèi)的只能被一個(gè)consumer消費(fèi)
Kafka核心概念
- Broker:啟動(dòng)kafka的一個(gè)實(shí)例就是一個(gè)broker暑椰,一個(gè)kafka集 群可以啟動(dòng)多個(gè)broker
- Topic:kafka中同一種類型數(shù)據(jù)集的名稱荐绝,相當(dāng)于數(shù)據(jù)庫中 的表,productor將同一類型的數(shù)據(jù)寫入的同一個(gè)topic下召夹, consumer從一個(gè)topic消費(fèi)同一類型的數(shù)據(jù)
- Partition:一個(gè)topic可以設(shè)置多個(gè)分區(qū)委造,相當(dāng)于把一個(gè)數(shù)據(jù) 集分成多份分別放到不同的分區(qū)中存儲(chǔ)昏兆,一個(gè)topic可以有一 個(gè)或者多個(gè)分區(qū),分區(qū)內(nèi)消息有序
- Replication:副本爬虱,一個(gè)partition可以設(shè)置一個(gè)或者多個(gè)副本 跑筝,副本主要保證系統(tǒng)能夠持續(xù)不丟失的對(duì)外提供服務(wù),提高 系統(tǒng)的容錯(cuò)能力
- Producer:消息生產(chǎn)者赞警,負(fù)責(zé)向kafka中發(fā)布消息
- Consumer Group:消費(fèi)者所屬組,一個(gè)Consumer Group可以包含一個(gè)或者多個(gè)consumer世剖,當(dāng)一個(gè)topic被一個(gè)Consumer Group消費(fèi)的時(shí)候笤虫,Consumer Group內(nèi)只能有一個(gè)consumer消費(fèi)同一條消息,不會(huì)出現(xiàn)同一個(gè)Consumer Group多個(gè)consumer同時(shí)消費(fèi)一條消息造成一個(gè)消息被一個(gè)Consumer Group消費(fèi)多次的情況
- Consumer:消息消費(fèi)者酬凳,consumer從kafka指定的主題中拉取消息
- Zookeeper:Zookeeper在kafka集群中主要用于協(xié)調(diào)管理遭庶,Kafka將
元數(shù)據(jù)信息保存在Zookeeper中峦睡,通過Zookeeper管理維護(hù)整個(gè)Kafka 集群的動(dòng)態(tài)擴(kuò)展、各個(gè)Broker負(fù)載均衡拉队、Partition leader選舉等
Kafka的存儲(chǔ)
- 每個(gè)partition的副本是一個(gè)目錄
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:07 topicnewtest1-0
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:07 topicnewtest1-2
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:08 topicnewtest1-3
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:08 topicnewtest1-4
[hadoop@hadoop4 kafka-logs]$ tree topicnewtest1-0
topicnewtest1-0
├── 00000000000000000000.index
├── 00000000000000000000.log
└── 00000000000000000000.timeindex
- Segment:段文件阻逮,kafka中最小數(shù)據(jù)存儲(chǔ)單位叔扼,一個(gè)partition包含多 個(gè)segment文件,每個(gè)segment以message在partition中的起始偏移量 命名以log結(jié)尾的文件
-
Offset:消息在分區(qū)中的偏移量鳍咱,用來在分區(qū)中唯一的標(biāo)識(shí)這個(gè)消 息
圖中的文件名是偏移量第一個(gè)文件記錄了0--368768的數(shù)據(jù),第二個(gè)記錄了368769-737337的數(shù)據(jù)
查看topic的信息可以發(fā)現(xiàn):
[hadoop@hadoop4 kafka_2.11-0.10.2.1]$ bin/kafka-topics.sh --describe --zookeeper hadoop0:2181 --topic topicnewtest1
Topic:topicnewtest1 PartitionCount:5 ReplicationFactor:2 Configs:
Topic: topicnewtest1 Partition: 0 Leader: 2 Replicas: 2,0 Isr: 2,0
Topic: topicnewtest1 Partition: 1 Leader: 0 Replicas: 0,1 Isr: 1,0
Topic: topicnewtest1 Partition: 2 Leader: 1 Replicas: 1,2 Isr: 2,1
Topic: topicnewtest1 Partition: 3 Leader: 2 Replicas: 2,1 Isr: 2,1
Topic: topicnewtest1 Partition: 4 Leader: 0 Replicas: 0,2 Isr: 2,0
topicnewtest1這個(gè)主題中,有五個(gè)partition,每個(gè)partition有2個(gè)replication,第0個(gè)partition的Leader是broker為2的節(jié)點(diǎn),replication是在2,0,這兩個(gè)節(jié)點(diǎn) ISR 是2,和 0 節(jié)點(diǎn).查看broker0 的節(jié)點(diǎn)log目錄中,存在partition0 的副本:
[hadoop@hadoop2 kafka-logs]$ ll
total 28
-rw-rw-r--. 1 hadoop hadoop 4 Jan 31 10:07 cleaner-offset-checkpoint
-rw-rw-r--. 1 hadoop hadoop 54 Jan 31 09:32 meta.properties
-rw-rw-r--. 1 hadoop hadoop 58 Jan 31 11:44 recovery-point-offset-checkpoint
-rw-rw-r--. 1 hadoop hadoop 58 Jan 31 11:45 replication-offset-checkpoint
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:27 topicnewtest1-0
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:27 topicnewtest1-1
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:27 topicnewtest1-4
[hadoop@hadoop2 kafka-logs]$ pwd
/home/hadoop/apps/kafka_2.11-0.10.2.1/kafka-logs
[hadoop@hadoop2 kafka-logs]$
Kafka存儲(chǔ)-索引文件
-
Kafka為了提高寫入谤辜、查詢速度在partition文件夾下每一個(gè)segment log文件都有同名的索引文件丑念,在kafka0.10以后的版本中會(huì)存在兩個(gè) 索引文件结蟋,一個(gè)用offset做名字以index結(jié)尾的索引文件,我們稱為 偏移量索引文件推正。一個(gè)是以消息寫入的時(shí)間戳為做名字以timeinde 結(jié)尾的索引文件,我們稱為時(shí)間戳索引文件乳丰。
偏移量索引文件
- 以偏移量作為名稱,index為后綴
- 索引內(nèi)容格式:offset,position
- 采用稀疏存儲(chǔ)方式
-
通過log.index.interval.bytes設(shè)置索引跨度
kafka高可用實(shí)現(xiàn)
多分區(qū)副本
一個(gè)topic可以有多個(gè)分區(qū)夜郁,每個(gè)分區(qū)可以有多個(gè)副本
一個(gè)分區(qū)的多個(gè)副本選舉一個(gè)leader粘勒,由leader負(fù)責(zé)讀寫,其他副
本作為follower從leader同步消息
同一個(gè)partition的不同副本分布到不同的brokerkafka controller 選舉
從集群中的broker選舉出一個(gè)Broker作為Controller控制節(jié)點(diǎn)
負(fù)責(zé)整個(gè)集群的管理事富,如Broker管理乘陪、Topic管理啡邑、Partition
Leader選舉等
選舉過程通過向Zookeeper創(chuàng)建臨時(shí)znode實(shí)現(xiàn),為被選中的
Broker監(jiān)聽Controller的znode贵扰,等待下次選舉-
kafka partition Leader選舉
- Controller負(fù)責(zé)分區(qū)Leader選舉
- ISR列表
- Follower批量從Leader拖取數(shù)據(jù)
- Leader跟蹤其 保持同步flower列表ISR( In Sync Replica)流部,ISR作為下次選主的候選列表
- Follower心跳超時(shí)或者消息落后太多枝冀,將被移除出ISR
Leader失敗后,從ISR列表中選擇一個(gè)Follower作為新的Leader
總結(jié):
一個(gè)broker對(duì)應(yīng)多個(gè)topic,一個(gè)topic對(duì)應(yīng)多個(gè)分區(qū),一個(gè)topic可以被多個(gè)consumer group消費(fèi),但只能被同一個(gè)consumer group 中的一個(gè)consumer消費(fèi).
每個(gè)partition有多個(gè)replication,每個(gè)partition有一個(gè)Leader.
分區(qū)內(nèi)有序,整體無序.