Kafka的概念以及如何搭建Kafka集羣

Kakfa介紹

Kafka是什麼

Kafka最初是LinkedIn的內部內部基礎設施系統。它被認爲是一個流平臺,在Kafka上能夠發佈和訂閱流數據,並把它們保存起來、進行處理。可是咱們在使用Kafka中,最多的就是將它做爲一個消息系統使用,相似於ActiveMQ、RabbitMQ等。可是Kafka與這些傳統的消息系統又有着許多的不一樣點,這些差別使它又不一樣於消息系統。html

  • Kafka是一個分佈式系統,以集羣(支持自由伸縮)的方式運行。(因此咱們總稱爲分佈式消息隊列)
  • Kafka能夠用來存儲數據,數據存儲的時間長短由你本身定義(以容錯持久化的方式存儲)。而且只要數據還存儲在Kafka中,你能夠重複讀取。
  • 流式處理將數據處理的層次提高到了新高度。

而傳統的消息系統,只會用來傳遞消息。
Kafka也能夠當作是實時版的Hadoop(這也是設計Kafka的初衷之一)。Hadoop能夠存儲和按期處理大量的數據文件,而Kafka而能夠存儲和持續型的處理大型的數據流。Hadoop主要應用於數據分析上,而Kafka因其低延遲的特色更合適應用於核心業務上,業務事件發生時,Kafka可以針對這些事件及時作出相應。同時kafka也能夠和ETL進行比較,由於它們擅長移動數據。數據庫

Kafka屬於消息系統中的發佈-訂閱模式消息系統。消息發送者不會將消息直接發送到消息接受者裏,而是將消息首先進行分類(topic),而後將消息發佈到消息系統中。消息接受者選擇須要訂閱的消息類型(topic),而後就可以從消息系統中接收所訂閱的消息了。apache

Kafka中的消息和批次

Kafka中的數據單元稱爲消息,消息能夠當作關係型數據庫中的「數據行」或「記錄」。消息是由鍵值對組成,其中鍵稱之爲元數據,是可選的。消息中的鍵值對是由字節數組組成,因此消息裏的數據沒有特別格式或含義(schema)。鍵主要用來分區寫,好比經過鍵生成一個一致性散列值,而後使用散列值對分區取模,爲消息選取分區,保證了相同類型鍵的消息都寫入到了相同分區內。bootstrap

爲了提升消息寫入效率,消息被分批次寫入Kafka中。批次就是一組消息,這些消息屬於同一topic下的同一分區。這樣減小了網絡開銷,可是這須要在時間延遲和吞吐量之間做出平衡。批次的數據會被壓縮,這樣提高了數據的傳輸和存儲能力,但一樣作了更多的計算(這也是Kafka對CPU性能的要求點)。api

Kafka中的主題和分區

Kafka的消息經過主題(topic)進行分類,主題相似關係型數據庫中的表,或者文件系統中的文件夾。一個主題能夠被分爲若干個分區(partition),一個分區就是一個提交日誌。消息以追加的方式寫入分區,而後以先進先出的順序讀取。由於一個topic通常由多個partition組成,因此Kafka不能保證主題範圍內的消息順序,可是可以保證單個分區的消息順序。若是要保證整個主題的有序性,就只能一個主題只有一個分區。Kafka經過分區來完成消息的冗餘和伸縮性,分區能夠分佈在不一樣的服務器上,這樣比單個服務器具備更高的性能。數組

 

topic服務器

 

每一個分區都是一個有序、不可變的記錄序列,新提交的記錄會不斷的追加到分區中。分區中的每條記錄都會被分配一個連續的序列號叫作offset(偏移),用於惟一標識分區中的每一個記錄。
在一個可配置的保留週期內(保存時間或保存大小),Kafka集羣會持久化全部發布的記錄,不管這個記錄是否被消費過。好比,咱們將保存週期設置爲2天,則記錄在發佈的兩天內均可以重複被使用,當過了兩天後,這條記錄就會被丟棄以釋放空間。Kafka的性能是與數據大小無關的常量,因此數據存儲多長時間都沒有問題。網絡

 

partition併發

爲何要進行日誌分區

  • 使得每一個topic日誌不會太大,以便單個服務可以保存。
  • 每一個分區可以單獨發佈和消費,爲併發消費topic提供一種可能。(也是最重要的)

Kafka客戶端

Kafka的客戶端就是Kafka的系統用戶,它們被分爲兩種基本類型:生產者和消費者。除了這些基礎API以外,Kafka還提供了一些高級API,好比用於數據集成的Kafka Connect API,用於流式處理的Kafka Streams和用於管理Kafka的AdminClient。負載均衡

client

Kafka生產者

Kafka中的生產者是用於寫入消息的,通常一個消息會被寫入到一個指定的主題內。生產者默認會將消息均衡地分佈到主題的全部分區上。可是咱們能夠經過消息鍵或者分區器來將消息分類,將同類數據寫入到同一個分區內。

Kafka消費者

Kafka中的消費者是用於讀取消息的,消費者會訂閱一個或多個主題,而且按照消息的生成順序讀取它們。消費者會經過消息的「偏移量」來記錄已經讀取的位置,偏移量是一種元數據,它是一個不斷自增的整數值。在消息寫入到分區內時,Kafka會爲該條消息生成所在分區內的惟一數值。消費者會把最後讀取消息所在的偏移量保存到Zookeeper或Kafka中,若是消費者關閉或重啓,則會從新讀取該偏移量。
在Kafka中消費者是消費者羣組的一部分,即一個羣組可能有多個消費者共同讀取一個主題。可是羣組可以保證每一個分區內的消息只能被消費者羣組中的一個消費者消費。
消費者與分區之間的關係稱爲消費者對分區的全部權。當一個消費者掛掉後,同一羣組的消費者能夠接管失效消費者的工做。

consumer group

消息的有序性

相比傳統的消息系統,Kafka能夠很好的保證有序性。
傳統消息隊列在服務器上保存有序消息,可是當多個Consumer消費隊列中的數據時,因爲消息被異步發送到不一樣的Consumer上,因此消息到達時可能已經失去了原來的順序。一般這種狀況若是須要強順序讀取,則只能有一個Consumer消費消息。這樣也就失去了併發性。
Kafka因爲使用了分區概念,能夠在多個Consumer組併發的狀況下提供較好的有序性和負載均衡。將每一個分區只發給一個Consumer,這樣一個分區就只被一個Consumer消費了,就能夠順序消費這個分區的消息了,因爲一個topic有多個partition,因此可使用多個Consumer消費,來實現負載均衡。可是Kafka只能保證一個分區的消息是有序的,若是須要topic全部消息都有序,那隻能一個topic只有一個分區,也就只能有一個Consumer消費。

Kafka集羣

在多臺機器上分別部署Kafka,就會組成一個Kafka集羣。每臺機器運行的Kafka服務稱爲broker,broker用於接收生產者消息,爲消息設置偏移量,而且將消息保存到磁盤中。broker還爲消費者提供讀取消息服務,向消費者返回已經提交到磁盤中的消息。單個broker能夠輕鬆處理數千分區以及每秒百萬級消息量(依賴於具體機器性能)。

在broker集羣中,會選舉出一個leader,做爲集羣控制器的角色。leader控制器負責管理工做,好比將分區分配給broker和監控broker。在broker集羣中,一個分區隸屬於一個broker,這個broker稱爲分區的leader。一個分區能夠分配到多個broker上,而這些其它broker上的分區數據是分區leader的複製數據,當分區leader掛掉後,其它broker能夠接管領導權,可是這時候相關的消費者和生產者會鏈接到新的分區leader上。這種分區複製的機制爲kafka提供消息冗餘,保證了kafka的容錯性和負載均衡。

 

cluster

 

broker集羣中的消息會持久化到磁盤上,這是kafka的一個重要特性。Kafka broker默認的消息保留策略有兩種:保留到指定的時間和保留到消息到達必定的字節數。當達到上限時,就消息就會被刪除。

Kafka集羣搭建

對於Kafka集羣來講,單個節點broker和多個節點的broker並無任何區別。多broker節點只是在集羣啓動過程當中,每一個broker節點都須要啓動。

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來保存集羣元數據信息和消費者信息。雖然Kafka發行版已經自帶了Zookeeper,能夠經過腳本直接啓動,但仍然建議安裝一個完整版的Zookeeper。

zk使用

Zookeeper部署:http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html
注意:
1)、在部署Zookeeper時,應該使用Linux監督(supervision)。由於Zookeeper遇到任何失敗狀況,都會快速失敗而且退出線程,查看:http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html#sc_supervision
2)、部署完Zookeeper應該配置一個cron來定時壓縮zk的數據和日誌,由於zk並不會作這些事。若是咱們不設置cron,系統磁盤有可能會被zk打滿。
https://www.cnblogs.com/fesh/p/3900253.htmlhttps://blog.csdn.net/qq_37716485/article/details/71786894

Kafka配置

Kafka的配置文件在${KAFKA_HOME}/config/server.properties目錄,咱們只須要簡單進行配置下:

 

broker.id=1 #當前broker在集羣中的惟一標識,相似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集羣

分發安裝並啓動

將Kafka安裝包分發到其它機器上:

 

scp -r kafka_2.11-2.0.0 root@192.168.0.1:/opt/yangjianzhang/kafka/
#啓動集羣中每臺機器的Kafka服務
bin/kafka-server-start.sh -daemon config/server.properties #須要指定啓動配置文件

建立topic

 

#建立test topic,只有一個分區、三個副本
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

查看建立的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

第一行輸出是對全部分區的一個描述,而後每一個分區會有一行輸出。
leader:當前分區所在的leader節點,負責處理消息的讀和寫,leader是從全部分區所在broker中隨機選擇出來的。
replicas:列出了全部副本節點(包含了leader節點),不管該節點當前是否存活。
isr:分區副本所在節點,而且該節點正常運行服務。
當前分區leader是broker 3,咱們kill 掉broker 3中的kafka服務,而後再看分區信息:

 

[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從新進行了選舉,而且當前服務節點isr中已經把3剔除。

使用kafka命令行發送和消費消息

Kafka附帶了一個命令行客戶端,容許讀取文件或標準輸入發送到Kafka集羣中,默認狀況下每行做爲一條消息發送。

 

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

使用命令行consumer讀數據:

 

bin/kafka-console-consumer.sh --bootstrap-server localhost:2181 --topic demo --from-beginning
>hello world
hello kafka
相關文章
相關標籤/搜索