--- title: Apache Kafka 實作紀錄 tags: Apache, Kafka description: Apache Kafka 實作記錄 --- # Apache Kafka 實作記錄 ## Apache Kafka kafka是一個分散式流式平台,可以再多台機器及時寫入、儲存、讀取 ,kafka 在使用時會搭配 zookeeper 使用,但是本篇使用 kafka 版本已自帶 zookeeper。 ## Kafka installation 下載 [kafka](https://www.apache.org/dyn/closer.cgi?path=/kafka/3.0.0/kafka_2.13-3.0.0.tgz)並且解壓縮 ``` $ tar -xzf kafka_2.13-3.0.0.tgz $ cd kafka_2.13-3.0.0 ``` ## 啟動 kafka service ***注意:您的本地環境必須安裝 Java 8+*** ### 單台機器單 broker #### 啟動 service 先啟動 zookeeper service ``` $ bin/zookeeper-server-start.sh config/zookeeper.properties ``` 啟動完 zookeeper service 後再啟動 kafka service ``` $ bin/kafka-server-start.sh config/server.properties ``` #### 測試 kafka service 在編寫第一個事件之前,您必須創建一個Topic。打開另一個終端會話並運行: ``` $ bin/kafka-topics.sh --create --topic test1 --bootstrap-server localhost:9092 ``` ![](https://i.imgur.com/4kCVtaB.png) 查看 kafka 顯示指定topic使用的信息 ``` $ bin/kafka-topics.sh --describe --topic test1 --bootstrap-server localhost:9092 ``` ![](https://i.imgur.com/qRYBv4t.png) 使用producer向Topic寫入訊息 ``` $ bin/kafka-console-producer.sh --topic test1 --bootstrap-server localhost:9092 > This is my first event > This is my second event ``` 使用consumer讀取指定Topic中的訊息 ``` $ bin/kafka-console-consumer.sh --topic test1 --from-beginning --bootstrap-server localhost:9092 This is my first event This is my second event ``` --- ### 單台機器多 broker #### 啟動 service 在單台機器上啟動3個 broker,由3個 broker 組成的 cluster,這些 broker 儲存空間都是在單台機器上,在啟動時需先修改每個 broker 節點,已有一份 broker 文件因此需再複製兩份 broker文件 ``` $ cp config/server.properties config/server-1.properties $ cp config/server.properties config/server-2.properties ``` **Note:** broker.id 是 cluster 中的節點,在單台機器上要啟動 kafka service 需要制定不同的 service port 和 log 的儲存位置,否則會互搶 port 或覆蓋數據,需修改以下數據 ``` config/server-1.properties: broker.id=1 listeners=PLAINTEXT://:9093 log.dir=/tmp/kafka-logs-1 config/server-2.properties: broker.id=2 listeners=PLAINTEXT://:9094 log.dir=/tmp/kafka-logs-2 ``` ![](https://i.imgur.com/74tA3xK.png) ![](https://i.imgur.com/FwkmJMA.png) ![](https://i.imgur.com/4PFcmzQ.png) #### 測試 kafka service 先啟動 zookeeper service ``` $ bin/zookeeper-server-start.sh config/zookeeper.properties ``` 啟動完 zookeeper service 後,再根據上面修改過後文檔以及原始檔啟動 kafka service ``` $ bin/kafka-server-start.sh config/server.properties $ bin/kafka-server-start.sh config/server-1.properties $ bin/kafka-server-start.sh config/server-2.properties ``` 創建一個有3個replicas的Topic ``` $ bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 1 --topic test2 ``` ![](https://i.imgur.com/kFzFFbU.png) 查看 kafka 顯示指定 Topic 使用的信息 ``` $ bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test2 ``` ![](https://i.imgur.com/uYbkebV.png) * Topic: Topic key 名稱 * Partition: 文件有多少內容 * Leader: Topic 的 leader在哪一個節點上 * replicas:列出了所有的節點,不管節點是否在服務中 * isr:正在服務中的節點 使用producer向Topic寫入訊息 ``` $ bin/kafka-console-producer.sh --topic test2 --bootstrap-server localhost:9092 > This is first test2 event > This is second test2 event ``` ![](https://i.imgur.com/AYbBF1t.png) 使用consumer讀取指定Topic中的訊息 ``` $ bin/kafka-console-consumer.sh --topic test2 --from-beginning --bootstrap-server localhost:9092 This is my first test2 event This is my second test2 event ``` ![](https://i.imgur.com/SqpRgfa.png) ### 多台機器多 broker #### 啟動 service 在兩台機器上啟動5個 broker,第一台機器 ip 為192.168.1.20,其中包含由3個 broker,第二台機器 ip 為192.168.1.21,其中包含2個broker,在啟動前需先配置每個server broker 節點 #### Server ip 192.168.1.20 ``` $ cp config/server.properties config/server-1.properties $ cp config/server.properties config/server-2.properties ``` **Note:** broker.id 是 cluster 中的節點,在單台機器上要啟動 kafka service 需要制定不同的 service port 和 log 的儲存位置,否則會互搶 port 或覆蓋數據,需修改以下數據 ``` config/server-1.properties: broker.id=1 listeners=PLAINTEXT://:9093 log.dir=/tmp/kafka-logs-1 config/server-2.properties: broker.id=2 listeners=PLAINTEXT://:9094 log.dir=/tmp/kafka-logs-2 ``` ![](https://i.imgur.com/74tA3xK.png) ![](https://i.imgur.com/FwkmJMA.png) ![](https://i.imgur.com/4PFcmzQ.png) #### Server ip 192.168.1.21 ``` $ cp config/server.properties config/server-3.properties $ cp config/server.properties config/server-4.properties ``` **Note:** broker.id 是 cluster 中的節點,在單台機器上要啟動 kafka service 需要制定不同的 service port 和 log 的儲存位置,否則會互搶 port 或覆蓋數據,需修改以下數據 ``` config/server-3.properties: broker.id=3 listeners=PLAINTEXT://:9095 log.dir=/tmp/kafka-logs-4 config/server-4.properties: broker.id=4 listeners=PLAINTEXT://:9096 log.dir=/tmp/kafka-logs-5 ``` ![](https://i.imgur.com/tPJ3y6l.png) ![](https://i.imgur.com/wZPQd0l.png) ![](https://i.imgur.com/SrOzmQm.png) ![](https://i.imgur.com/DVaEvB8.png) #### 測試 kafka service 先啟動 Server ip 192.168.1.20 的 zookeeper service #### Server ip 192.168.1.20 ``` $ bin/zookeeper-server-start.sh config/zookeeper.properties ``` 啟動完 zookeeper service 後,再根據上面修改過後文檔以及原始檔啟動 kafka service ``` $ bin/kafka-server-start.sh config/server.properties $ bin/kafka-server-start.sh config/server-1.properties $ bin/kafka-server-start.sh config/server-2.properties ``` #### Server ip 192.168.1.21 上面完成後再啟動,Server ip 192.168.1.21 的 kafka service ``` $ bin/kafka-server-start.sh config/server-3.properties $ bin/kafka-server-start.sh config/server-4.properties ``` #### Server ip 192.168.1.20 創建一個有5個replicas的Topic ``` $ bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 5 --partitions 1 --topic test3 ``` ![](https://i.imgur.com/mWLpH2u.png) 查看 kafka 顯示指定 Topic 使用的信息 ``` $ bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test3 ``` ![](https://i.imgur.com/wj7w3SN.png) * Topic: Topic key 名稱 * Partition: 文件有多少內容 * Leader: Topic 的 leader在哪一個節點上 * replicas:列出了所有的節點,不管節點是否在服務中 * isr:正在服務中的節點 以上完成 kafka 在多台機器多個 broker 的配置,producer、consumer 的測試就不在贅述 --- ## Thank you! :dash: You can find me on - GitHub: https://github.com/shaung08 - Email: a2369875@gmail.com