[TOC]
<br >
*****
# **在 CentOS 7 上安裝 Kafka 2.3.1 偽分布式環境**
到目前為止,我們一直在使用單個 broker,這并不好玩。對 Kafka 來說,單個 broker 只是一個大小為一的集群。 為了深入了解它,讓我們把集群擴展到三個節點(仍然在一臺機器上)。
> 提示:在開始本節之前,請先安裝單節點環境,然后調整 JVM 啟動參數。
> 編輯個人文件 `vim ~/.bash_profile`,調整 JVM 參數:
> ```
> export KAFKA_HEAP_OPTS="-Xmx512m -Xms512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=85"
> ```
> 編譯 .bash\_profile,`source ~/.bash_profile`。
<br >
## **安裝**
1. 首先為每個 broker 創建一個配置文件:
~~~
$ cd /opt/kafka_2.12-2.3.1
$ cp config/server.properties config/server-1.properties
$ cp config/server.properties config/server-2.properties
~~~
<br >
1. 編輯 broker 1 的配置文件 `vim config/server-1.properties`,并設置如下屬性:
~~~
broker.id=1
listeners=PLAINTEXT://:9093
log.dir=/data/kafka/kafka-logs-1
~~~
> [broker.id](http://broker.id) 屬性是集群中每個節點的名稱,這一名稱是唯一的。我們必須重寫監聽端口和日志目錄,因為我們在同一臺機器上運行這些,我們不希望所有的 broker 嘗試在同一個端口注冊,或者覆蓋彼此的數據。
<br >
1. 編輯代理2的配置文件 `vim config/server-2.properties`,并設置如下屬性:
~~~
broker.id=2
listeners=PLAINTEXT://:9094
log.dir=/data/kafka/kafka-logs-2
~~~
<br >
1. 我們已經建立 Zookeeper 和一個單節點了,現在我們只需要啟動兩個新的節點:
~~~
$ bin/kafka-server-start.sh config/server-1.properties &
...
[2020-01-11 21:54:39,662] INFO [KafkaServer id=1] started (kafka.server.KafkaServer)
~~~
~~~
$ bin/kafka-server-start.sh config/server-2.properties &
...
[2020-01-11 21:55:09,813] INFO [KafkaServer id=2] started (kafka.server.KafkaServer)
~~~
<br >
## **測試**
1. 現在創建一個副本為 3 的新 topic:
~~~
$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic
~~~
<br >
1. Good,現在我們有一個集群,但是我們怎么才能知道那些代理在做什么呢?運行 `describe topics` 命令來查看:
~~~
$ bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: my-replicated-topic Partition: 0 Leader: 2 Replicas: 2,1,0 Isr: 2,1,0
~~~
> 第一行給出了所有分區的摘要,下面的每行都給出了一個分區的信息。因為我們只有一個分區,所以只有一行。
> * “leader”是負責給定分區所有讀寫操作的節點。每個節點都是隨機選擇的部分分區的領導者。
> * “replicas”是復制分區日志的節點列表,不管這些節點是 leader 還是僅僅活著。
> * “isr”是一組“同步” replicas,是 replicas 列表的子集,它活著并被指到 leader。
<br >
1. 我們可以在已創建的原始主題上運行相同的命令來查看它的位置:
~~~
$ bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
Topic:test PartitionCount:1 ReplicationFactor:1 Configs:
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0
~~~
這沒什么大不了,原來的主題沒有副本且在服務器 0 上。我們創建集群時,這是唯一的服務器。
<br >
1. 讓我們發表一些信息給我們的新 topic:
~~~
$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic
...
my test message 1
my test message 2
^C
~~~
<br >
1. 現在我們來消費這些消息:
~~~
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic
...
my test message 1
my test message 2
^C
~~~
<br >
1. 讓我們來測試一下容錯性。 Broker 1 現在是 leader,讓我們來殺了它(注意要切換到 root 用戶):
~~~
# ps aux | grep server-1.properties
root 12452 2.5 9.6 3707296 371960 pts/0 Sl 22:53 0:07 /opt/jdk1.8.0_231/bin/java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent...
# kill -9 12452
~~~
領導權已經切換到一個從屬節點,而且節點1也不在同步副本集中了:
~~~
# bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: my-replicated-topic Partition: 0 Leader: 2 Replicas: 2,1,0 Isr: 2,0
~~~
2. 不過,即便原先寫入消息的 leader 已經不在,這些消息仍可用于消費:
~~~
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic
my test message 1
my test message 2
^C
~~~
<br >
<br >
<br >
# **參考資料**
* [Apache Kafka QuickStart](http://kafka.apache.org/quickstart)
<br >