通過Docker在自己電腦上啟動Kafka
想Apache Kafka在你自己的電腦上執行,需要Docker,docker-compose,一些磁碟空間和網際網路連線。我們將使用來自ofollow,noindex" target="_blank">https://www.confluent.io/的 Kafka Docker映象。
我們之所以選擇docker-compose(而不是Confluent CLI工具),是因為大多數現代開發人員已經熟悉Docker,而且很多人每天都在使用docker-compose; 這將使您能夠輕鬆地在現有專案中包含Kafka群集配置:
我們的群集將包括:
- 一位卡夫卡經紀人,
- 一個Zookeeper例項,
- 一個模式schema登錄檔(因為我們稍後會使用Avro)
在真正的生產系統中,一個Kafka經紀人和一個Zookeeper是不夠的,但它對開發來說很好。
使用Confluent Kafka docker映象,我們無需手動編寫配置檔案。相反,一切都可以通過環境變數進行配置,我們將Kafka的環境與容器配置分開儲存。
1. Zookeeper的環境
讓我們從Zookeeper開始吧。向Zookeeper提供的最重要的選項是此例項ID,客戶端埠以及群集中所有伺服器的列表。
原始 [url=https://gist.github.com/saabeilin/4708a2b1a16dbf3c52d53a721744a779#file-zookeeper-env]zookeeper.env[/url]
ZOOKEEPER_SERVERS=zookeeper-1:4182:5181 ZOOKEEPER_SERVER_ID=1 ZOOKEEPER_CLIENT_PORT=2181 KAFKA_HEAP_OPTS=-Xms32M -Xmx32M -verbose:gc
我們也配置了一些堆記憶體 - 這對於開發環境來說已經足夠了。
Confluent的Zookeeper映像匯出兩個卷,data並log分別匯出; 我們將不得不裝載它們以保持永續性。因此,最小的Zookeeper服務描述將如下所示:
zookeeper-1: image: confluentinc/cp-zookeeper:5.0.0 hostname: zookeeper-1 container_name: zookeeper-1 ports: - <font>"2181:2181"</font><font> env_file: - zookeeper.env healthcheck: test: /bin/sh -c '[ \"imok\" = \"$$(echo ruok | nc -w 1 127.0.0.1 2181)\" ]' || exit 1 interval: 1m volumes: - zookeeper-1-data:/<b>var</b>/lib/zookeeper/data/ - zookeeper-1-log:/<b>var</b>/lib/zookeeper/log/ </font>
請注意,我們對主機、服務非常明確規定名稱都是zookeeper-1,它們應與Zookeeper配置環境中的內容zookeeper-1相匹配。
2. Kafka
首先,我們需要指定kafka代理ID,將其指向先前配置的Zookeeper,並配置偵聽器和釋出商(代理在哪裡監聽以及在客戶端連線時它通告的內容).
請注意,我們配置的代理應用,我可以通過kafka-1:9092從其他docker容器訪問,也可以從你的主機通過localhost:29092訪問。
Kafka可以在您第一次製作主題時自動建立主題; 這通常不是生產的最佳選擇,但在開發中非常方便。在許多情況下,不希望刪除主題,而在開發中它也沒關係。因此,我們將啟用主題自動建立和刪除。
# This will be our first and only broker KAFKA_BROKER_ID=1 # Define listeneres <b>for</b> accessing broker both inside Docker and from host machine KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_ADVERTISED_LISTENERS=PLAINTEXT:<font><i>//kafka-1:9092,PLAINTEXT_HOST://localhost:29092</i></font><font> # Zookeeper connection KAFKA_ZOOKEEPER_CONNECT=zookeeper-1:2181 # In dev, we <b>do</b> not need Confluent metrics CONFLUENT_SUPPORT_METRICS_ENABLE=false # As well, we can add some heap pressure KAFKA_HEAP_OPTS=-Xms256M -Xmx256M -verbose:gc # In development enviroment, auto-creating topics (and deleting them) could be convenient KAFKA_AUTO_CREATE_TOPICS_ENABLE=<b>true</b> KAFKA_DELETE_TOPIC_ENABLE=<b>true</b> # Eight partitions is more than enough <b>for</b> development KAFKA_NUM_PARTITIONS=8 # Retain offsets <b>for</b> 31 days - in <b>case</b> you work on your project not that often KAFKA_OFFSETS_RETENTION_MINUTES=44640 # Since we have just one broker, set replication factors to just one KAFKA_DEFAULT_REPLICATION_FACTOR=1 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1 KAFKA_MIN_INSYNC_REPLICAS=1 # In development environ, we <b>do</b> not need to many threads KAFKA_NUM_RECOVERY_THREADS_PER_DATA_DIR=1 KAFKA_NUM_NETWORK_THREADS=3 KAFKA_NUM_IO_THREADS=3 # Configure <b>default</b> log cleanup. You can override these on per-topic basis KAFKA_LOG_CLEANUP_POLICY=compact KAFKA_LOG_RETENTION_BYTES=-1 KAFKA_LOG_RETENTION_CHECK_INTERVAL_MS=300000 KAFKA_LOG_RETENTION_HOURS=-1 KAFKA_LOG_ROLL_HOURS=24 KAFKA_LOG_SEGMENT_BYTES=1048576 KAFKA_LOG_SEGMENT_DELETE_DELAY_MS=60000 </font>
服務描述配置是為zookeeper-1Kafka日誌新增依賴關係和卷(資料日誌!)
kafka-1: image: confluentinc/cp-kafka:5.0.0 hostname: kafka-1 container_name: kafka-1 stop_grace_period: 3m depends_on: - zookeeper-1 ports: - <font>"29092:29092"</font><font> env_file: - kafka.env volumes: - kafka-1-data:/<b>var</b>/lib/kafka/data/ </font>
3.schema登錄檔
Schema登錄檔是最容易配置的。這是環境:
SCHEMA_REGISTRY_HOST_NAME=schema-registry SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL=zookeeper-1:2181 KAFKA_HEAP_OPTS=-Xms32M -Xmx32M -verbose:gc
服務:
docker-compose.schema-registry.yaml
schema-registry: image: confluentinc/cp-schema-registry:5.0.0 hostname: schema-registry container_name: schema-registry depends_on: - zookeeper-1 - kafka-1 ports: - <font>"8081:8081"</font><font> env_file: - schema-registry.env </font>
4.一起執行
最後,擁有所有三個 .env檔案和以下總的檔案放在一個目錄:
啟動整個堆疊:
docker-compose up
啟動堆疊可能需要一些時間,你會看到很多輸出。當它終於結束時,我們可以嘗試我們的新叢集!