Kafka學(xué)習(xí)——Kafka介紹和搭建Kafka集群

Kakfa介紹

Kafka是什么

Kafka最初是LinkedIn的內(nèi)部內(nèi)部基礎(chǔ)設(shè)施系統(tǒng)膝迎。它被認(rèn)為是一個(gè)流平臺队丝,在Kafka上可以發(fā)布和訂閱流數(shù)據(jù)工育,并把它們保存起來攀圈、進(jìn)行處理昭娩。但是我們在使用Kafka中凛篙,最多的就是將它作為一個(gè)消息系統(tǒng)使用,類似于ActiveMQ栏渺、RabbitMQ等呛梆。但是Kafka與這些傳統(tǒng)的消息系統(tǒng)又有著許多的不同點(diǎn),這些差異使它又不同于消息系統(tǒng)磕诊。

  • Kafka是一個(gè)分布式系統(tǒng)填物,以集群(支持自由伸縮)的方式運(yùn)行。(所以我們總稱為分布式消息隊(duì)列)
  • Kafka可以用來存儲數(shù)據(jù)霎终,數(shù)據(jù)存儲的時(shí)間長短由你自己定義(以容錯(cuò)持久化的方式存儲)滞磺。并且只要數(shù)據(jù)還存儲在Kafka中,你可以重復(fù)讀取莱褒。
  • 流式處理將數(shù)據(jù)處理的層次提升到了新高度击困。

而傳統(tǒng)的消息系統(tǒng),只會用來傳遞消息广凸。
Kafka也可以看成是實(shí)時(shí)版的Hadoop(這也是設(shè)計(jì)Kafka的初衷之一)阅茶。Hadoop可以存儲和定期處理大量的數(shù)據(jù)文件,而Kafka而可以存儲和持續(xù)型的處理大型的數(shù)據(jù)流谅海。Hadoop主要應(yīng)用于數(shù)據(jù)分析上脸哀,而Kafka因其低延遲的特點(diǎn)更合適應(yīng)用于核心業(yè)務(wù)上,業(yè)務(wù)事件發(fā)生時(shí)扭吁,Kafka能夠針對這些事件及時(shí)做出相應(yīng)企蹭。同時(shí)kafka也可以和ETL進(jìn)行比較,因?yàn)樗鼈兩瞄L移動數(shù)據(jù)智末。

Kafka屬于消息系統(tǒng)中的發(fā)布-訂閱模式消息系統(tǒng)谅摄。消息發(fā)送者不會將消息直接發(fā)送到消息接受者里,而是將消息首先進(jìn)行分類(topic)系馆,然后將消息發(fā)布到消息系統(tǒng)中送漠。消息接受者選擇需要訂閱的消息類型(topic),然后就能夠從消息系統(tǒng)中接收所訂閱的消息了由蘑。

Kafka中的消息和批次

Kafka中的數(shù)據(jù)單元稱為消息闽寡,消息可以看成關(guān)系型數(shù)據(jù)庫中的“數(shù)據(jù)行”或“記錄”。消息是由鍵值對組成尼酿,其中鍵稱之為元數(shù)據(jù)爷狈,是可選的。消息中的鍵值對是由字節(jié)數(shù)組組成裳擎,所以消息里的數(shù)據(jù)沒有特別格式或含義(schema)涎永。鍵主要用來分區(qū)寫,比如通過鍵生成一個(gè)一致性散列值,然后使用散列值對分區(qū)取模羡微,為消息選取分區(qū)谷饿,保證了相同類型鍵的消息都寫入到了相同分區(qū)內(nèi)。

為了提高消息寫入效率妈倔,消息被分批次寫入Kafka中博投。批次就是一組消息,這些消息屬于同一topic下的同一分區(qū)盯蝴。這樣減少了網(wǎng)絡(luò)開銷毅哗,但是這需要在時(shí)間延遲和吞吐量之間作出平衡。批次的數(shù)據(jù)會被壓縮捧挺,這樣提升了數(shù)據(jù)的傳輸和存儲能力黎做,但同樣做了更多的計(jì)算(這也是Kafka對CPU性能的要求點(diǎn))。

Kafka中的主題和分區(qū)

Kafka的消息通過主題(topic)進(jìn)行分類松忍,主題類似關(guān)系型數(shù)據(jù)庫中的表谷暮,或者文件系統(tǒng)中的文件夾椅野。一個(gè)主題可以被分為若干個(gè)分區(qū)(partition)驼修,一個(gè)分區(qū)就是一個(gè)提交日志肚邢。消息以追加的方式寫入分區(qū),然后以先進(jìn)先出的順序讀取摊溶。因?yàn)橐粋€(gè)topic一般由多個(gè)partition組成爬骤,所以Kafka不能保證主題范圍內(nèi)的消息順序,但是能夠保證單個(gè)分區(qū)的消息順序莫换。如果要保證整個(gè)主題的有序性霞玄,就只能一個(gè)主題只有一個(gè)分區(qū)。Kafka通過分區(qū)來完成消息的冗余和伸縮性拉岁,分區(qū)可以分布在不同的服務(wù)器上坷剧,這樣比單個(gè)服務(wù)器具有更高的性能。


topic

每個(gè)分區(qū)都是一個(gè)有序喊暖、不可變的記錄序列惫企,新提交的記錄會不斷的追加到分區(qū)中。分區(qū)中的每條記錄都會被分配一個(gè)連續(xù)的序列號叫做offset(偏移)陵叽,用于唯一標(biāo)識分區(qū)中的每個(gè)記錄狞尔。
在一個(gè)可配置的保留周期內(nèi)(保存時(shí)間或保存大小),Kafka集群會持久化所有發(fā)布的記錄巩掺,無論這個(gè)記錄是否被消費(fèi)過偏序。比如,我們將保存周期設(shè)置為2天胖替,則記錄在發(fā)布的兩天內(nèi)都可以重復(fù)被使用研儒,當(dāng)過了兩天后豫缨,這條記錄就會被丟棄以釋放空間。Kafka的性能是與數(shù)據(jù)大小無關(guān)的常量殉摔,所以數(shù)據(jù)存儲多長時(shí)間都沒有問題。


partition

為什么要進(jìn)行日志分區(qū)

  • 使得每個(gè)topic日志不會太大记焊,以便單個(gè)服務(wù)能夠保存逸月。
  • 每個(gè)分區(qū)能夠單獨(dú)發(fā)布和消費(fèi),為并發(fā)消費(fèi)topic提供一種可能遍膜。(也是最重要的)

Kafka客戶端

Kafka的客戶端就是Kafka的系統(tǒng)用戶碗硬,它們被分為兩種基本類型:生產(chǎn)者和消費(fèi)者。除了這些基礎(chǔ)API之外瓢颅,Kafka還提供了一些高級API恩尾,比如用于數(shù)據(jù)集成的Kafka Connect API,用于流式處理的Kafka Streams和用于管理Kafka的AdminClient挽懦。

client

Kafka生產(chǎn)者

Kafka中的生產(chǎn)者是用于寫入消息的形病,一般一個(gè)消息會被寫入到一個(gè)指定的主題內(nèi)客年。生產(chǎn)者默認(rèn)會將消息均衡地分布到主題的所有分區(qū)上。但是我們可以通過消息鍵或者分區(qū)器來將消息分類漠吻,將同類數(shù)據(jù)寫入到同一個(gè)分區(qū)內(nèi)量瓜。

Kafka消費(fèi)者

Kafka中的消費(fèi)者是用于讀取消息的,消費(fèi)者會訂閱一個(gè)或多個(gè)主題途乃,并且按照消息的生成順序讀取它們榔至。消費(fèi)者會通過消息的“偏移量”來記錄已經(jīng)讀取的位置,偏移量是一種元數(shù)據(jù)欺劳,它是一個(gè)不斷自增的整數(shù)值唧取。在消息寫入到分區(qū)內(nèi)時(shí),Kafka會為該條消息生成所在分區(qū)內(nèi)的唯一數(shù)值划提。消費(fèi)者會把最后讀取消息所在的偏移量保存到Zookeeper或Kafka中枫弟,如果消費(fèi)者關(guān)閉或重啟,則會重新讀取該偏移量鹏往。
在Kafka中消費(fèi)者是消費(fèi)者群組的一部分淡诗,即一個(gè)群組可能有多個(gè)消費(fèi)者共同讀取一個(gè)主題骇塘。但是群組能夠保證每個(gè)分區(qū)內(nèi)的消息只能被消費(fèi)者群組中的一個(gè)消費(fèi)者消費(fèi)。
消費(fèi)者與分區(qū)之間的關(guān)系稱為消費(fèi)者對分區(qū)的所有權(quán)韩容。當(dāng)一個(gè)消費(fèi)者掛掉后款违,同一群組的消費(fèi)者可以接管失效消費(fèi)者的工作。

consumer group

消息的有序性

相比傳統(tǒng)的消息系統(tǒng)群凶,Kafka可以很好的保證有序性插爹。
傳統(tǒng)消息隊(duì)列在服務(wù)器上保存有序消息,但是當(dāng)多個(gè)Consumer消費(fèi)隊(duì)列中的數(shù)據(jù)時(shí)请梢,由于消息被異步發(fā)送到不同的Consumer上赠尾,所以消息到達(dá)時(shí)可能已經(jīng)失去了原來的順序。通常這種情況如果需要強(qiáng)順序讀取毅弧,則只能有一個(gè)Consumer消費(fèi)消息气嫁。這樣也就失去了并發(fā)性。
Kafka由于使用了分區(qū)概念够坐,可以在多個(gè)Consumer組并發(fā)的情況下提供較好的有序性和負(fù)載均衡寸宵。將每個(gè)分區(qū)只發(fā)給一個(gè)Consumer,這樣一個(gè)分區(qū)就只被一個(gè)Consumer消費(fèi)了元咙,就可以順序消費(fèi)這個(gè)分區(qū)的消息了邓馒,由于一個(gè)topic有多個(gè)partition,所以可以使用多個(gè)Consumer消費(fèi)蛾坯,來實(shí)現(xiàn)負(fù)載均衡光酣。但是Kafka只能保證一個(gè)分區(qū)的消息是有序的,如果需要topic所有消息都有序脉课,那只能一個(gè)topic只有一個(gè)分區(qū)救军,也就只能有一個(gè)Consumer消費(fèi)。

Kafka集群

在多臺機(jī)器上分別部署Kafka倘零,就會組成一個(gè)Kafka集群唱遭。每臺機(jī)器運(yùn)行的Kafka服務(wù)稱為broker,broker用于接收生產(chǎn)者消息呈驶,為消息設(shè)置偏移量拷泽,并且將消息保存到磁盤中。broker還為消費(fèi)者提供讀取消息服務(wù)袖瞻,向消費(fèi)者返回已經(jīng)提交到磁盤中的消息司致。單個(gè)broker可以輕松處理數(shù)千分區(qū)以及每秒百萬級消息量(依賴于具體機(jī)器性能)。

在broker集群中聋迎,會選舉出一個(gè)leader脂矫,作為集群控制器的角色。leader控制器負(fù)責(zé)管理工作霉晕,比如將分區(qū)分配給broker和監(jiān)控broker庭再。在broker集群中捞奕,一個(gè)分區(qū)隸屬于一個(gè)broker,這個(gè)broker稱為分區(qū)的leader拄轻。一個(gè)分區(qū)可以分配到多個(gè)broker上颅围,而這些其它broker上的分區(qū)數(shù)據(jù)是分區(qū)leader的復(fù)制數(shù)據(jù),當(dāng)分區(qū)leader掛掉后恨搓,其它broker可以接管領(lǐng)導(dǎo)權(quán)院促,但是這時(shí)候相關(guān)的消費(fèi)者和生產(chǎn)者會連接到新的分區(qū)leader上。這種分區(qū)復(fù)制的機(jī)制為kafka提供消息冗余奶卓,保證了kafka的容錯(cuò)性和負(fù)載均衡一疯。


cluster

broker集群中的消息會持久化到磁盤上撼玄,這是kafka的一個(gè)重要特性夺姑。Kafka broker默認(rèn)的消息保留策略有兩種:保留到指定的時(shí)間和保留到消息到達(dá)一定的字節(jié)數(shù)。當(dāng)達(dá)到上限時(shí)掌猛,就消息就會被刪除盏浙。

Kafka集群搭建

對于Kafka集群來說,單個(gè)節(jié)點(diǎn)broker和多個(gè)節(jié)點(diǎn)的broker并沒有任何區(qū)別荔茬。多broker節(jié)點(diǎn)只是在集群啟動過程中废膘,每個(gè)broker節(jié)點(diǎn)都需要啟動。

Kafka安裝包下載(2.0.0版本)

下載路徑:
https://www.apache.org/dyn/closer.cgi?path=/kafka/2.0.0/kafka_2.11-2.0.0.tgz

tar -zxvf kafka_2.11-2.0.0.tgz
cd kafka_2.11-2.0.0

安裝Zookeeper

Kafka是使用Zookeeper來保存集群元數(shù)據(jù)信息和消費(fèi)者信息慕蔚。雖然Kafka發(fā)行版已經(jīng)自帶了Zookeeper丐黄,可以通過腳本直接啟動,但仍然建議安裝一個(gè)完整版的Zookeeper孔飒。

zk使用

Zookeeper部署:http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html
注意:
1)灌闺、在部署Zookeeper時(shí),應(yīng)該使用Linux監(jiān)督(supervision)坏瞄。因?yàn)閆ookeeper遇到任何失敗情況桂对,都會快速失敗并且退出線程,查看:http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html#sc_supervision鸠匀。
2)蕉斜、部署完Zookeeper應(yīng)該配置一個(gè)cron來定時(shí)壓縮zk的數(shù)據(jù)和日志,因?yàn)閦k并不會做這些事缀棍。如果我們不設(shè)置cron宅此,系統(tǒng)磁盤有可能會被zk打滿。
https://www.cnblogs.com/fesh/p/3900253.htmlhttps://blog.csdn.net/qq_37716485/article/details/71786894

Kafka配置

Kafka的配置文件在${KAFKA_HOME}/config/server.properties目錄爬范,我們只需要簡單進(jìn)行配置下:

broker.id=1 #當(dāng)前broker在集群中的唯一標(biāo)識诽凌,類似zk中的myid
log.dir=/opt/yangjianzhang/kafka/log #消息日志輸出目錄
zookeeper.connect=192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2281 #使用的zk集群

分發(fā)安裝并啟動

將Kafka安裝包分發(fā)到其它機(jī)器上:

scp -r kafka_2.11-2.0.0 root@192.168.0.1:/opt/yangjianzhang/kafka/
#啟動集群中每臺機(jī)器的Kafka服務(wù)
bin/kafka-server-start.sh -daemon config/server.properties #需要指定啟動配置文件

創(chuàng)建topic

#創(chuàng)建test topic,只有一個(gè)分區(qū)坦敌、三個(gè)副本
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic test

#查看topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
test

查看創(chuàng)建的topic信息

[root@yjz01 kafka_2.11-2.0.0]# bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic demo
Topic:demo    PartitionCount:1    ReplicationFactor:3    Configs:
    Topic: demo    Partition: 0    Leader: 3    Replicas: 3,1,2    Isr: 3,1,2

第一行輸出是對所有分區(qū)的一個(gè)描述侣诵,然后每個(gè)分區(qū)會有一行輸出痢法。
leader:當(dāng)前分區(qū)所在的leader節(jié)點(diǎn),負(fù)責(zé)處理消息的讀和寫杜顺,leader是從所有分區(qū)所在broker中隨機(jī)選擇出來的财搁。
replicas:列出了所有副本節(jié)點(diǎn)(包含了leader節(jié)點(diǎn)),無論該節(jié)點(diǎn)當(dāng)前是否存活躬络。
isr:分區(qū)副本所在節(jié)點(diǎn)尖奔,并且該節(jié)點(diǎn)正常運(yùn)行服務(wù)。
當(dāng)前分區(qū)leader是broker 3穷当,我們kill 掉broker 3中的kafka服務(wù)提茁,然后再看分區(qū)信息:

[root@yjz01 kafka_2.11-2.0.0]# bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic demo
Topic:demo    PartitionCount:1    ReplicationFactor:3    Configs:
    Topic: demo    Partition: 0    Leader: 1    Replicas: 3,1,2    Isr: 1,2

leader重新進(jìn)行了選舉,并且當(dāng)前服務(wù)節(jié)點(diǎn)isr中已經(jīng)把3剔除馁菜。

使用kafka命令行發(fā)送和消費(fèi)消息

Kafka附帶了一個(gè)命令行客戶端茴扁,允許讀取文件或標(biāo)準(zhǔn)輸入發(fā)送到Kafka集群中,默認(rèn)情況下每行作為一條消息發(fā)送汪疮。

[root@yjz01 kafka_2.11-2.0.0]# bin/kafka-console-producer.sh -broker-list localhost:2181 --topic demo
>hello world
hello kafka

使用命令行consumer讀數(shù)據(jù):

bin/kafka-console-consumer.sh --bootstrap-server localhost:2181 --topic demo --from-beginning
>hello world
hello kafka

關(guān)注我

歡迎關(guān)注我的公眾號峭火,會定期推送優(yōu)質(zhì)技術(shù)文章,讓我們一起進(jìn)步智嚷、一起成長卖丸!
公眾號搜索:data_tc
或直接掃碼:??


歡迎關(guān)注我
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盏道,隨后出現(xiàn)的幾起案子稍浆,更是在濱河造成了極大的恐慌,老刑警劉巖猜嘱,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衅枫,死亡現(xiàn)場離奇詭異,居然都是意外死亡泉坐,警方通過查閱死者的電腦和手機(jī)为鳄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腕让,“玉大人孤钦,你說我怎么就攤上這事〈客瑁” “怎么了偏形?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長觉鼻。 經(jīng)常有香客問我俊扭,道長,這世上最難降的妖魔是什么坠陈? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任萨惑,我火速辦了婚禮捐康,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庸蔼。我一直安慰自己解总,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布姐仅。 她就那樣靜靜地躺著花枫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掏膏。 梳的紋絲不亂的頭發(fā)上劳翰,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音馒疹,去河邊找鬼佳簸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛行冰,可吹牛的內(nèi)容都是我干的溺蕉。 我是一名探鬼主播伶丐,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼悼做,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哗魂?” 一聲冷哼從身側(cè)響起肛走,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎录别,沒想到半個(gè)月后朽色,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡组题,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年葫男,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崔列。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梢褐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赵讯,到底是詐尸還是另有隱情盈咳,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布边翼,位于F島的核電站鱼响,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏组底。R本人自食惡果不足惜丈积,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一筐骇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧江滨,春花似錦拥褂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至间雀,卻和暖如春悔详,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惹挟。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工茄螃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人连锯。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓归苍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親运怖。 傳聞我的和親對象是個(gè)殘疾皇子拼弃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 姓名:周小蓬 16019110037 轉(zhuǎn)載自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw閱讀 34,708評論 13 425
  • Kafka簡介 Kafka是一種分布式的,基于發(fā)布/訂閱的消息系統(tǒng)摇展。主要設(shè)計(jì)目標(biāo)如下: 以時(shí)間復(fù)雜度為O(1)的方...
    Alukar閱讀 3,074評論 0 43
  • Kafka入門經(jīng)典教程-Kafka-about云開發(fā) http://www.aboutyun.com/threa...
    葡萄喃喃囈語閱讀 10,812評論 4 54
  • kafka的定義:是一個(gè)分布式消息系統(tǒng)吻氧,由LinkedIn使用Scala編寫,用作LinkedIn的活動流(Act...
    時(shí)待吾閱讀 5,302評論 1 15
  • 我期待咏连,歲月靜好盯孙,年華長駐。 我期待祟滴,山棱有角振惰,你我相伴。 我期待垄懂,富足平和骑晶,歡顏永存。 我期待埠偿,貪念盡無透罢,心門常...
    為善之人閱讀 350評論 0 2