Docker快速搭建Kafka 1.x叢集

阿狸不歌發表於2018-02-11

Kafka已經發布了1.0版,為了緊跟時代的步伐,最近學習了《Kafka權威指南》。書如其名,這本 Definitive Guide 內容很全面,從Kafka的設計原理和架構細節到開發的程式碼例項進行了全方位的覆蓋。正如本書的前言所述,不管你作為開發工程師圍繞Kafka API來寫應用還是作為運維工程師(SRE)來安裝、配置、調優、監控,本書都提供了足夠的細節。

kafka權威指南


為何用Docker

我讀本書主要還是從開發的角度來看的,所以對我而言,以最快的速度搭建起一個可以執行的環境最為重要。這個時候首先想到的當然是Docker(不熟悉Docker的可以參見拙作 離不開的工具之《Docker開發指南》)了。

本書第2章的安裝環境是Linux,在附錄中介紹了在Windows和Mac OS上的安裝過程。我之所以選擇用Docker進行安裝,主要是出於以下的考慮:

(1)實現開發環境和生產環境的一致性,這點本書附錄中也提到了:

在桌面作業系統上進行 Kafka 開發或測試時,最好能夠讓它執行在虛擬機器裡,這個虛擬機器最好能與生產環境的配置相匹配。

(2)使用Docker便於模擬多節點叢集,使用docker-compose 工具,我們可以輕鬆的在單臺開發機上啟動多個Kafka容器、zookeeper容器,非常方便的實現了對分散式環境的模擬。

(3)安裝、啟動非常迅速。從安裝上講,在國內如果使用國內的Docker Registry Mirror,下載一個配置好的Kafka映象可能要比直接下載安裝Kafka還要快得多。熟悉Docker的都比較清楚,容器的快速啟動本身就是Docker的一大特色。


Docker映象選型

對比起RabbitMQ有不斷更新的官方Docker映象,Kafka是沒有官方 Docker映象的,所以要麼自己寫一個Dockerfile,要麼用第三方已經構建好的。首先,自己寫一個Dockerfile不是不可以,但不符合我要“最快”的目標,所以用第三方已經構建好的映象那是最快的。其次,映象最好是1.x的最新版本,有新版本就要用上嘛。最後,由於是第三方映象,希望已經用過的人越多越好,這樣坑相對會比較少一些。

帶著上面三個要求,開始尋找合適的第三方映象,比較出名的有以下幾個:

  1. wurstmeister/kafka 特點:star數最多,版本更新到 Kafka 1.0 ,zookeeper與kafka分開於不同映象。
  2. spotify/kafka 特點:star數較多,有很多文章或教程推薦,zookeeper與kafka置於同一映象中;但kafka版本較老(還停留在0.10.1.0)。
  3. confluent/kafka 背景:Confluent是書中提到的那位開發Kafka的Jay Kreps 從LinkedIn離職後創立的新公司,Confluent Platform 是一個流資料平臺,圍繞著Kafka打造了一系列產品。特點:大咖操刀,文件詳盡,但是也和Confluent Platform進行了捆綁。

上述三個專案中,最簡單的是spotify/kafka,但是版本較老。confluent/kafka 資料最為詳盡,但是因為與Confluent Platform做了捆綁,所以略顯麻煩。最終選定使用wurstmeister/kafka,star最多,版本一直保持更新,用起來應該比較放心。


安裝過程

此處假定讀者已經熟練使用docker、docker-compose等工具,所以關於docker的知識就不再贅述。

  1. 下載zookeeper映象:

    docker pull wurstmeister/zookeeper

  2. 下載kafka映象:

    docker pull wurstmeister/kafka

  3. 在自己選的目錄下建立一個docker-compose.yml檔案, 內容如下: docker-compose.yml

    ⚠️ 注意上述內容與 https://github.com/wurstmeister/kafka-docker/blob/master/docker-compose.yml 中有一處區別,即倒數第4行中的 KAFKA_ADVERTISED_HOST_NAME 改為 KAFKA_ADVERTISED_LISTENERS ,其後的ip地址使用宿主機上的 docker-machine ip 地址。

  4. 啟動docker-compose

    docker-compose up -d

  5. 啟動多個kafka 節點,比如3個

    docker-compose scale kafka=3


可用性測試

自此,如果沒有出現什麼錯誤,通過docker ps 應該可以看到已經成功啟動了一個zookeeper容器,三個Kafka容器。

  1. 通過指定容器名(假設容器名為 wurkafka_kafka_1)進入一個Kafka容器:

    docker exec -it wurkafka_kafka_1 /bin/bash

  2. 建立一個topic(其中假設zookeeper容器名為 wurkafka_zookeeper_1,topic名為test),輸入:

    $KAFKA_HOME/bin/kafka-topics.sh --create --topic test \

    --zookeeper wurkafka_zookeeper_1:2181 --replication-factor 1 --partitions 1

  3. 檢視新建立的topic:

    $KAFKA_HOME/bin/kafka-topics.sh --zookeeper wurkafka_zookeeper_1:2181 \

    --describe --topic test

  4. 釋出訊息: (輸入若干條訊息後 按^C 退出釋出)

    $KAFKA_HOME/bin/kafka-console-producer.sh --topic=test \

    --broker-list wurkafka_kafka_1:9092

  5. 接收訊息:

    $KAFKA_HOME/bin/kafka-console-consumer.sh \

    --bootstrap-server wurkafka_kafka_1:9092 \

    --from-beginning --topic test

如果接收到了釋出的訊息,證明整個部署正常,就可以正式開始開發工作了。

相關文章