KAFKA集羣搭建

一、簡介  

Kafka是Apache下的一個子項目,是一個高性能跨語言分佈式發佈/訂閱消息隊列系統,使用Scala編寫,它以可水平擴展和高吞吐率而被廣泛使用。目前越來越多的開源分佈式處理系統如Cloudera、Apache Storm、Spark都支持與Kafka集成。

  Kafka適合做什麼? 官方文檔介紹,它通常被使用在兩大類應用中:

  1. 搭建實時數據流管道,在系統或應用之間可靠的獲取數據

  2. 搭建對數據流進行轉換或相應的實時流應用程序、

  爲了瞭解Kafka具體如何實現這些功能, 首先理解幾個概念:

  1. Kafka是作爲集羣,運行在一臺或多臺服務器上的.

  2. Kafka集羣用主題(topics)來分類別儲存數據流(records).

  3. 每個記錄(record)由一個鍵(key),一個值(value)和一個時間戳(timestamp)組成

  Kafka有4個核心APIs:

  1. Producer API負責生產數據流,允許應用程序將記錄流發佈到一個或多個Kafka主題(topics).

  2. Consumer API負責使用數據流,允許應用程序訂閱一個或多個主題並處理爲其生成的數據流.

  3. Streams API負責處理或轉化數據流,允許應用程序充當數據流處理器的角色, 處理來自一個或多個主題的輸入數據流,併產生輸出數據流到一個或多個輸出主題,一次來有效地將輸入流轉換成輸出流.

  4. Connector API負責將數據流與其他應用或系統結合,允許搭建建和運行可重複使用的生產者或消費者,將Kafka數據主題與現有應用程序或數據系統相連接的。 例如,關係數據庫的連接器可能會將表的每個更改的事件,都捕獲爲一個數據流.

二、環境準備

  kafka集羣的搭建是建立在jdk和zookeeper集羣環境之上的;文中環境在Ubuntu1404系統上搭建;

1)安裝JAVA

# add-apt-repository ppa:webupd8team/java 
# apt-get update
# apt-get install oracle-java8-installer 
# java -version //檢驗Java版本
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

2)安裝ZOOKEEPER集羣

  zookeeper集羣搭建可以參考前一篇博文:zookeeper集羣搭建,也可以使用單機版的zookeeper,實際生產環境最好使用集羣保證高可用性。

3)機器列表,/etc/hosts文件內容如下:

172.30.100.1 kafka-001
172.30.100.2 kafka-002
172.30.100.3 kafka-003
172.30.100.4 kafka-004
172.30.100.5 kafka-005

172.30.100.21 zookeeper-001
172.30.100.22 zookeeper-002
172.30.100.23 zookeeper-003
172.30.100.24 zookeeper-004
172.30.100.25 zookeeper-005

三、Kafka集羣搭建

1)下載相應版本kafka軟件包:

  官方0.10.2.0版本下載鏈接如下:

http://mirrors.hust.edu.cn/apache/kafka/0.10.2.0/kafka_2.11-0.10.2.0.tgz

這裏需要注意kafka的版本,下載之前一定要確保你的client端是否支持當前kafka server的版本,否則就得重新安裝。

這裏給出官方提供的其他幾個下載鏈接,包括其他版本的都在下面的地址裏能夠找到。

https://www.apache.org/dyn/closer.cgi#verify

2)配置kafka集羣

  下載完之後解壓,並配置:

> tar -xzf kafka_2.11-0.10.2.0.tgz
> cd kafka_2.11-0.10.2.0
> vim config/server.properties

kafka的配置文件示例:

#唯一標識在集羣中的ID,要求是正數。
broker.id=1
delete.topic.enable=true
# 監聽地址和端口號
listeners=PLAINTEXT://172.30.100.1:9092
# 處理網絡請求的最大線程數
num.network.threads=9
# 處理磁盤I/O的線程數
num.io.threads=16
# # leader中進行復制的線程數,增大這個數值會增加relipca的IO
num.replica.fetchers=3
#配置log的文件目錄,前提確保目錄存在
log.dirs=/data/kafka-logs
# 每個topic的分區個數,更多的partition會產生更多的segment file
num.partitions=2
# 配置zookeeper服務的地址
zookeeper.connect=zookeeper-001:2181,zookeeper-002:2181,zookeeper-003:2181,zookeeper-004:2181,zookeeper-005:2181

這裏注意的地方:listeners一定要配置成爲IP地址;如果配置爲localhost或服務器的hostname,在使用java發送數據時就會拋出異 常:org.apache.kafka.common.errors.TimeoutException: Batch Expired 。因爲在沒有配置advertised.host.name 的情況下,Kafka並沒有像官方文檔宣稱的那樣改爲廣播我們配置的host.name,而是廣播了主機配置的hostname。遠端的客戶端並沒有配置 hosts,所以自然是連接不上kafka。

  複製server.properties到其他kafka節點的機器上,並修改broker.id,listeners。

3)服務的啓動和停止

  啓動服務:

bin/kafka-server-start.sh -daemon config/server.properties

注意一定要加-daemon選項,不然終端退出,服務會隨之退出。  

  停止服務:

 bin/kafka-server-stop.sh

四、Kafka集羣測試

1)創建topic:

> bin/kafka-topics.sh --create --zookeeper zookeeper-001:2181 --replication-factor 3 --partitions 2 --topic test

這裏的--zookeeper可以隨機指定一個zookeeper的地址。

檢測topic是否創建成功:

> bin/kafka-topics.sh --list --zookeeper zookeeper-001:2181
test

查看topic描述信息:

 bin/kafka-topics.sh --describe --zookeeper zookeeper-001:2181 --topic test
Topic:CloudMonitor	PartitionCount:5	ReplicationFactor:3	Configs:
	Topic: test	Partition: 0	Leader: 2	Replicas: 2,3,4	Isr: 2,3,4
	Topic: test	Partition: 1	Leader: 3	Replicas: 3,4,5	Isr: 3,4,5
	Topic: test	Partition: 2	Leader: 4	Replicas: 4,1,2	Isr: 4,1,2
	Topic: test	Partition: 3	Leader: 5	Replicas: 5,2,3	Isr: 5,3,2
	Topic: test	Partition: 4	Leader: 1	Replicas: 1,3,4	Isr: 1,3,4

2)生產消息:

> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
This is a message
This is another message

3)消費消息:

> bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
This is a message
This is another message

會看到剛纔生產的兩條messsage。

結尾:

  結尾附上幾個常用Message Queue的對比,摘自網絡:

RabbitMQ

  RabbitMQ是使用Erlang編寫的一個開源的消息隊列,本身支持很多的協議:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量級,更適合於企業級的開發。同時實現了Broker構架,這意味着消息在發送給客戶端時先在中心隊列排隊。對路由,負載均衡或者數據持久化都有很好的支持。

Redis

  Redis是一個基於Key-Value對的NoSQL數據庫,開發維護很活躍。雖然它是一個Key-Value數據庫存儲系統,但它本身支持MQ功能,所以完全可以當做一個輕量級的隊列服務來使用。對於RabbitMQ和Redis的入隊和出隊操作,各執行100萬次,每10萬次記錄一次執行時間。測試數據分爲128Bytes、512Bytes、1K和10K四個不同大小的數據。實驗表明:入隊時,當數據比較小時Redis的性能要高於RabbitMQ,而如果數據大小超過了10K,Redis則慢的無法忍受;出隊時,無論數據大小,Redis都表現出非常好的性能,而RabbitMQ的出隊性能則遠低於Redis。

ZeroMQ

  ZeroMQ號稱最快的消息隊列系統,尤其針對大吞吐量的需求場景。ZeroMQ能夠實現RabbitMQ不擅長的高級/複雜的隊列,但是開發人員需要自己組合多種技術框架,技術上的複雜度是對這MQ能夠應用成功的挑戰。ZeroMQ具有一個獨特的非中間件的模式,你不需要安裝和運行一個消息服務器或中間件,因爲你的應用程序將扮演這個服務器角色。你只需要簡單的引用ZeroMQ程序庫,可以使用NuGet安裝,然後你就可以愉快的在應用程序之間發送消息了。但是ZeroMQ僅提供非持久性的隊列,也就是說如果宕機,數據將會丟失。其中,Twitter的Storm 0.9.0以前的版本中默認使用ZeroMQ作爲數據流的傳輸(Storm從0.9版本開始同時支持ZeroMQ和Netty作爲傳輸模塊)。

ActiveMQ

  ActiveMQ是Apache下的一個子項目。 類似於ZeroMQ,它能夠以代理人和點對點的技術實現隊列。同時類似於RabbitMQ,它少量代碼就可以高效地實現高級應用場景。

Kafka/Jafka

  Kafka是Apache下的一個子項目,是一個高性能跨語言分佈式發佈/訂閱消息隊列系統,而Jafka是在Kafka之上孵化而來的,即Kafka的一個升級版。具有以下特性:快速持久化,可以在O(1)的系統開銷下進行消息持久化;高吞吐,在一臺普通的服務器上既可以達到10W/s的吞吐速率;完全的分佈式系統,Broker、Producer、Consumer都原生自動支持分佈式,自動實現負載均衡;支持Hadoop數據並行加載,對於像Hadoop的一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka通過Hadoop的並行加載機制統一了在線和離線的消息處理。Apache Kafka相對於ActiveMQ是一個非常輕量級的消息系統,除了性能非常好之外,還是一個工作良好的分佈式系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章