---
# System prepended metadata

title: Apache Kafka 實作紀錄
tags: [Apache, ' Kafka']

---

---
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
