Like Share Discussion Bookmark Smile

J.J. Huang   2020-11-16   Docker   瀏覽次數:

Docker - 第十七章 | 安裝Kafka

在工作過程中,還有後面的Kafka系列的研究文章,首先是要建立一個Kafka環境,所以才產生了此篇。
這邊是使用Dockerdocker-compose建立的環境,網路上和官方都是直接下載實際安裝檔在實體機器上做建置;詳細安裝過程可以上網搜尋即可。

Apache Kafka 概述

在大數據中,使用了大量的數據。關於數據,我們有兩個主要挑戰。第一個挑戰是如何收集大量的數據,第二個挑戰是分析收集的數據。為了克服這些挑戰,你必須需要一個消息系統。

Kafka專為分佈式高吞吐量系統而設計。Kafka往往工作得很好,作為一個更傳統的消息代理的替代品。與其他消息傳遞系統相比,Kafka具有更好的吞吐量,內置分區,複製和固有的容錯能力,這使得它非常適合大規模消息處理應用程序。

Apache Kafka 集群架構

ZooKeeper作為給分佈式系統提供協調服務的工具被kafka所依賴。在分佈式系統中,消費者需要知道有哪些生產者是可用的,而如果每次消費者都需要和生產者建立連接並測試是否成功連接,那效率也太低了,顯然是不可取的。而通過使用ZooKeeper協調服務,Kafka就能將ProducerConsumerBroker等結合在一起,同時藉助ZooKeeperKafka就能夠將所有組件在無狀態的條件下建立起生產者和消費者的訂閱關係,實現負載均衡。

S.No 組件和說明
1 Broker(代理)Kafka集群通常由多個代理組成以保持負載平衡。 Kafka代理是無狀態的,所以他們使用ZooKeeper來維護它們的集群狀態。一個Kafka代理實例可以每秒處理數十萬次讀取和寫入,每個Broker可以處理TB的消息,而沒有性能影響。 Kafka經紀人領導選舉可以由ZooKeeper完成。
2 ZooKeeper ZooKeeper用於管理和協調Kafka代理。 ZooKeeper服務主要用於通知生產者和消費者Kafka系統中存在任何新代理或Kafka系統中代理失敗。根據Zookeeper接收到關於代理的存在或失敗的通知,然後生產者和消費者採取決定並開始與某些其他代理協調他們的任務。
3 Producers(生產者)生產者將數據推送給經紀人。當新代理啟動時,所有生產者搜索它並自動向該新代理髮送消息。 Kafka生產者不等待來自代理的確認,並且發送消息的速度與代理可以處理的一樣快。
4 Consumers(消費者)因為Kafka代理是無狀態的,這意味著消費者必須通過使用分區偏移來維護已經消耗了多少消息。如果消費者確認特定的消息偏移,則意味著消費者已經消費了所有先前的消息。消費者向代理髮出異步拉取請求,以具有準備好消耗的字節緩衝區。消費者可以簡單地通過提供偏移值來快退或跳到分區中的任何點。消費者偏移值由ZooKeeper通知。

取得 Kafka

這個docker-compose文件將通過Docker為你運行所有內容。
將其複製貼上到本地文件系統上名為docker-compose.yml的文件中。

注:這邊所使用的Kafka service ports = 9091, listeners = localhost,可自行修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:5.3.1
hostname: zookeeper
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000

broker:
image: confluentinc/cp-kafka:5.3.1
hostname: broker
container_name: broker
depends_on:
- zookeeper
ports:
- "9091:9091"
environment:
KAFKA_BROKER_ID: 1
KAFKA_BOOTSTRAP.SERVERS: 'broker:29091'
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29091,PLAINTEXT_HOST://localhost:9091
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0

control-center:
image: confluentinc/cp-enterprise-control-center:5.3.1
hostname: control-center
container_name: control-center
depends_on:
- zookeeper
- broker
ports:
- "9021:9021"
environment:
CONTROL_CENTER_BOOTSTRAP_SERVERS: 'broker:29091'
CONTROL_CENTER_ZOOKEEPER_CONNECT: 'zookeeper:2181'
CONTROL_CENTER_CONNECT_CLUSTER: 'connect:8083'
CONTROL_CENTER_KSQL_URL: "http://ksql-server:8088"
CONTROL_CENTER_KSQL_ADVERTISED_URL: "http://localhost:8088"
CONTROL_CENTER_SCHEMA_REGISTRY_URL: "http://schema-registry:8081"
CONTROL_CENTER_REPLICATION_FACTOR: 1
CONTROL_CENTER_INTERNAL_TOPICS_PARTITIONS: 1
CONTROL_CENTER_MONITORING_INTERCEPTOR_TOPIC_PARTITIONS: 1
CONFLUENT_METRICS_TOPIC_REPLICATION: 1
PORT: 9021

建立並背景執行 kafka 環境

從包含在上一步中創建的docker-compose.yml文件的目錄中,運行此命令以按正確的順序啟動所有服務:

1
$ docker-compose up -d

成功啟動所有服務後,你將運行並可以使用基本的Kafka環境。

建立 Topic

因為這邊有安裝confluentinc/cp-enterprise-control-center,是kafka的後台介面管理,可以透過介面查看、建立kafka相關資訊。

1
http://localhost:9021

進入controlcenter.cluster,可以看到選單上有Topic,點擊進去後,就可以Add Topic

停止 kafka 環境

因為有分停止、刪除⋯⋯等等,詳細指令可以參閱附註

附註

dockerdocker-compose有很多相似之處,運作模式、參數也差不多,只是變成一次控制一群容器。常用指令如下:

用途 指令 常用可選參數 類似指令
建立並前景執行容器 docker-compose up -d、-f docker run
查看容器運作 docker-compose ps -f docker ps
執行容器 docker-compose start -f docker start
停止容器 docker-compose stop -f docker stop
刪除容器 docker-compose down -f docker rm
印出log docker-compose logs -f docker logs
進入容器 docker-compose exec bash -f docker exec -it bash

註:以上參考了
Apache Kafka 教程
Day 29- 三周目 - Docker Compose:一次管理多個容器
Kafka 入门(三)–为什么 Kafka 依赖 ZooKeeper?