转载:http://cloudurable.com/blog/kafka-tutorial-kafka-failover-kafka-cluster/index.html
开始使用Kafka集群教程
了解Kafka故障转移
这个Kafka教程正好从命令行中的第一个Kafka教程停止。第一个教程有关于如何运行ZooKeeper和使用Kafka utils的说明。
在本教程中,我们将在我们的开发笔记本电脑上运行许多Kafka节点,这样您将需要至少16 GB的RAM用于本地开发机器。如果内存少于16 GB,则只能运行两台服务器。我们将创建一个复制的主题。然后我们演示了消费者故障转移和代理故障转移。我们还演示了Kafka消费者的负载平衡。我们展示了如何与许多团体一起,Kafka表现得像发布/订阅。但是,当我们将所有消费者放在同一个组中时,Kafka会将消息加载到同一组中的消费者(更像是队列而不是传统MOM意义上的主题)。
如果尚未运行,则启动ZooKeeper(./run-zookeeper.sh
从第一个教程开始)。另外,从第一个教程关闭Kafka。
接下来,您需要复制三个代理的服务器属性(详细说明)。然后我们将修改这些Kafka服务器属性以添加唯一的Kafka端口,Kafka日志位置和唯一的Broker ID。然后我们将创建三个脚本以使用这些属性启动这些服务器,然后启动服务器。最后,我们创建了复制主题,并使用它来演示Kafka使用者故障转移和Kafka代理故障转移。
创建三个新的Kafka server-n.properties文件
在本节中,我们将现有的卡夫卡复制server.properties
到server-0.properties
,server-1.properties
和server-2.properties
。然后我们server-0.properties
改为设置log.dirs
为“./logs/kafka-0
。然后,我们修改server-1.properties
设置port
到9093
,经纪人id
给1
,并log.dirs
给“./logs/kafka-1”
。最后修改 server-2.properties
为使用port
9094,经纪人id
2和log.dirs
“./logs/kafka-2”
。
Copy server properties file
$ ~/kafka-training
$ mkdir -p lab2/config
$ cp kafka/config/server.properties kafka/lab2/config/server-0.properties
$ cp kafka/config/server.properties kafka/lab2/config/server-1.properties
$ cp kafka/config/server.properties kafka/lab2/config/server-2.properties
使用文本编辑器更改server-0.properties,以便log.dirs
设置为./logs/kafka-0
。保留文件的其余部分。确保log.dirs
只定义一次
~/kafka-training/lab2/config/server-0.properties
broker.id=0
port=9092
log.dirs=./logs/kafka-0
...
用文本编辑器的更改server-1.properties、server-2.properties的broker.id,
log.dirs,port。如下图:
~/kafka-training/lab2/config/server-1.properties
broker.id=1
port=9093
log.dirs=./logs/kafka-1
...
~/kafka-training/lab2/config/server-2.properties
broker.id=2
port=9094
log.dirs=./logs/kafka-2
...
为三个Kafka服务器创建启动脚本
启动脚本将kafka-server-start.sh
与相应的属性文件一起运行。
~/kafka-training/lab2/start-1st-server.sh
#!/usr/bin/env bash
CONFIG=`pwd`/config
cd ~/kafka-training
## Run Kafka
kafka/bin/kafka-server-start.sh \
"$CONFIG/server-0.properties"
~/kafka-training/lab2/start-2nd-server.sh
#!/usr/bin/env bash
CONFIG=`pwd`/config
cd ~/kafka-training
## Run Kafka
kafka/bin/kafka-server-start.sh \
"$CONFIG/server-1.properties"
~/kafka-training/lab2/start-3rd-server.sh
#!/usr/bin/env bash
CONFIG=`pwd`/config
cd ~/kafka-training
## Run Kafka
kafka/bin/kafka-server-start.sh \
"$CONFIG/server-2.properties"
请注意,我们正在传递我们在上一步中创建的Kafka服务器属性文件。
现在在单独的终端/ shell中运行所有三个。
Run Kafka servers each in own terminal from ~/kafka-training/lab2
~/kafka-training/lab2
$ ./start-1st-server.sh
...
$ ./start-2nd-server.sh
...
$ ./start-3rd-server.sh
等待服务器启动并连接到ZooKeeper。
创建Kafka复制的主题my-failsafe-topic
现在我们将创建一个控制台生产者和控制台使用者可以使用的复制主题。
~/kafka-training/lab2/create-replicated-topic.sh
#!/usr/bin/env bash
cd ~/kafka-training
kafka/bin/kafka-topics.sh --create \
--zookeeper localhost:2181 \
--replication-factor 3 \
--partitions 13 \
--topic my-failsafe-topic
请注意,复制因子设置为3,主题名称是my-failsafe-topic
,并且在它有13个分区之前。
然后我们只需运行脚本来创建主题。
Run create-replicated-topic.sh
~/kafka-training/lab2
$ ./create-replicated-topic.sh
启动使用复制主题的Kafka Consumer
接下来,创建一个启动使用者的脚本,然后使用该脚本启动使用者。
~/kafka-training/lab2/start-consumer-console-replicated.sh
#!/usr/bin/env bash
cd ~/kafka-training
kafka/bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9094,localhost:9092 \
--topic my-failsafe-topic \
--from-beginning
请注意,Kafka服务器列表将传递给--bootstrap-server
参数。只有我们之前运行的三台服务器中的两台已经通过。即使只需要一个代理,消费者客户端也只能从一个服务器上了解另一个代理。通常,如果发生中断,您会列出多个代理,以便客户端可以连接。
现在我们只运行此脚本来启动使用者。
Run start-consumer-console-replicated.sh
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
启动使用复制主题的Kafka Producer
接下来,我们创建一个启动生产者的脚本。然后使用您创建的脚本启动生产者。
~/kafka-training/lab2/start-consumer-producer-replicated.sh
#!/usr/bin/env bash
cd ~/kafka-training
kafka/bin/kafka-console-producer.sh \
--broker-list localhost:9092,localhost:9093 \
--topic my-failsafe-topic
请注意,我们启动Kafka生产者并通过参数传递一个Kafka Brokers列表--broker-list
。
现在使用start producer脚本启动生成器,如下所示。
Run start-producer-console-replicated.sh
~/kafka-training/lab2
$ ./start-consumer-producer-replicated.sh
现在发送消息
现在从生产者向Kafka发送一些消息,并查看消费者使用的消息。
Producer Console
~/kafka-training/lab2
$ ./start-consumer-producer-replicated.sh
Hi Mom
How are you?
How are things going?
Good!
Consumer Console
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
Hi Mom
How are you?
How are things going?
Good!
现在启动另外两个消费者并发送更多消息
现在在他们自己的终端窗口中启动另外两个消费者,并从生产者发送更多消息。
Producer Console
~/kafka-training/lab2
$ ./start-consumer-producer-replicated.sh
Hi Mom
How are you?
How are things going?
Good!
message 1
message 2
message 3
Consumer Console 1st
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
Hi Mom
How are you?
How are things going?
Good!
message 1
message 2
message 3
Consumer Console 2nd in new Terminal
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
Hi Mom
How are you?
How are things going?
Good!
message 1
message 2
message 3
Consumer Console 2nd in new Terminal
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
Hi Mom
How are you?
How are things going?
Good!
message 1
message 2
message 3
请注意,消息将发送给所有使用者,因为每个使用者都在不同的使用者组中。
将消费者变为自己的消费者群体
停止生产者和消费者,但让Kafka和ZooKeeper继续运行。
现在让我们修改start-consumer-console-replicated.sh
脚本以添加Kafka 使用者组。我们希望将所有消费者都放在同一个消费者群体中。这样消费者将共享消息,因为消费者组中的每个消费者将获得其分区的份额。
~/kafka-training/lab2/start-consumer-console-replicated.sh
#!/usr/bin/env bash
cd ~/kafka-training
kafka/bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9094,localhost:9092 \
--topic my-failsafe-topic \
--consumer-property group.id=mygroup
请注意,该脚本与之前的脚本相同,但我们添加的脚本--consumer-property group.id=mygroup
会将使用此脚本运行的每个使用者放入mygroup
使用者组中。
现在我们只运行生产者和三个消费者
Run this three times - start-consumer-console-replicated.sh
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
Run Producer Console
~/kafka-training/lab2
$ ./start-consumer-producer-replicated.sh
Now send seven messages from the Kafka producer console.
Producer Console
~/kafka-training/lab2
$ ./start-consumer-producer-replicated.sh
m1
m2
m3
m4
m5
m6
m7
请注意,消息在消费者之间均匀分布。
1st Kafka Consumer gets m3, m5
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
m3
m5
2nd Kafka Consumer gets m2, m6
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
m2
m6
3rd Kafka Consumer gets m1, m4, m7
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
m1
m4
m7
请注意,组中的每个消费者都获得了一部分消息。
Kafka消费者故障转移
接下来,让我们通过杀死其中一个消费者并发送另外七个消息来演示消费者故障转移。卡夫卡应该将工作分配给正在运行的消费者。
首先,杀死第三个消费者(消费者终端中的CTRL-C就可以了)。
现在用Kafka控制台生产者再发送七条消息。
Producer Console - send seven more messages m8 through m14
~/kafka-training/lab2
$ ./start-consumer-producer-replicated.sh
m1
...
m8
m9
m10
m11
m12
m13
m14
1st Kafka Consumer gets m8, m9, m11, m14
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
m3
m5
m8
m9
m11
m14
2nd Kafka Consumer gets m10, m12, m13
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
m2
m6
m10
m12
m13
我们杀了一个消费者,又发了七条消息,看到卡夫卡把负担分散给剩下的消费者。Kafka消费者故障转移工作!
创建Kafka Describe主题脚本
您可以使用kafka-topics.sh
以查看Kafka经纪人如何布置Kafka主题。该 ---describe
会显示分区的ISR和经纪人分区领导。
~/kafka-training/lab2/describe-topics.sh
#!/usr/bin/env bash
cd ~/kafka-training
# List existing topics
kafka/bin/kafka-topics.sh --describe \
--topic my-failsafe-topic \
--zookeeper localhost:2181
运行describe-topics
我们将列出哪个经纪人拥有(领导者)哪个分区,并列出每个分区的副本和ISR。ISR是最新的复制品。请记住,有13个主题。
Topology of Kafka Topic Partition Ownership
~/kafka-training/lab2
$ ./describe-topics.sh
Topic: my-failsafe-topic PartitionCount: 13 ReplicationFactor: 3 Configs:
Topic: my-failsafe-topic Partition: 0 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
Topic: my-failsafe-topic Partition: 1 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: my-failsafe-topic Partition: 2 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: my-failsafe-topic Partition: 3 Leader: 2 Replicas: 2,1,0 Isr: 2,1,0
Topic: my-failsafe-topic Partition: 4 Leader: 0 Replicas: 0,2,1 Isr: 0,2,1
Topic: my-failsafe-topic Partition: 5 Leader: 1 Replicas: 1,0,2 Isr: 1,0,2
Topic: my-failsafe-topic Partition: 6 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
Topic: my-failsafe-topic Partition: 7 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: my-failsafe-topic Partition: 8 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: my-failsafe-topic Partition: 9 Leader: 2 Replicas: 2,1,0 Isr: 2,1,0
Topic: my-failsafe-topic Partition: 10 Leader: 0 Replicas: 0,2,1 Isr: 0,2,1
Topic: my-failsafe-topic Partition: 11 Leader: 1 Replicas: 1,0,2 Isr: 1,0,2
Topic: my-failsafe-topic Partition: 12 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
请注意每个代理如何获得分区作为领导者和关注者的份额。另外,请参阅Kafka如何复制每个代理上的分区。
通过终止第一台服务器来测试代理故障转移
让我们杀死第一个代理,然后测试故障转移。
Kill the first broker
$ kill `ps aux | grep java | grep server-0.properties | tr -s " " | cut -d " " -f2`
您可以通过在代理终端中按CTRL-C或运行上述命令来停止第一个代理。
现在第一个kafka经纪人已经停止了,让我们用kafka topics describe
看看新领导人当选了!
Run describe-topics again to see leadership change
~/kafka-training/lab2/solution
$ ./describe-topics.sh
Topic:my-failsafe-topic PartitionCount:13 ReplicationFactor:3 Configs:
Topic: my-failsafe-topic Partition: 0 Leader: 2 Replicas: 2,0,1 Isr: 2,1
Topic: my-failsafe-topic Partition: 1 Leader: 1 Replicas: 0,1,2 Isr: 1,2
Topic: my-failsafe-topic Partition: 2 Leader: 1 Replicas: 1,2,0 Isr: 1,2
Topic: my-failsafe-topic Partition: 3 Leader: 2 Replicas: 2,1,0 Isr: 2,1
Topic: my-failsafe-topic Partition: 4 Leader: 2 Replicas: 0,2,1 Isr: 2,1
Topic: my-failsafe-topic Partition: 5 Leader: 1 Replicas: 1,0,2 Isr: 1,2
Topic: my-failsafe-topic Partition: 6 Leader: 2 Replicas: 2,0,1 Isr: 2,1
Topic: my-failsafe-topic Partition: 7 Leader: 1 Replicas: 0,1,2 Isr: 1,2
Topic: my-failsafe-topic Partition: 8 Leader: 1 Replicas: 1,2,0 Isr: 1,2
Topic: my-failsafe-topic Partition: 9 Leader: 2 Replicas: 2,1,0 Isr: 2,1
Topic: my-failsafe-topic Partition: 10 Leader: 2 Replicas: 0,2,1 Isr: 2,1
Topic: my-failsafe-topic Partition: 11 Leader: 1 Replicas: 1,0,2 Isr: 1,2
Topic: my-failsafe-topic Partition: 12 Leader: 2 Replicas: 2,0,1 Isr: 2,1
请注意Kafka如何在第二和第三位Kafka经纪人中传播领导力。
显示代理故障转移工作
让我们通过从生产者控制台发送另外两条消息来证明故障转移是有效的。
然后注意消费者是否仍然收到消息。
Send the message m15 and m16.
Producer Console - send m15 and m16
~/kafka-training/lab2
$ ./start-consumer-producer-replicated.sh
m1
...
m15
m16
请注意,消息在剩余的实时消费者中均匀分布。
1st Kafka Consumer gets m16
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
m3
m5
m8
m9
m11
m14
...
m16
The first Kafka broker gets m16.
2nd Kafka Consumer gets m15
~/kafka-training/lab2
$ ./start-consumer-console-replicated.sh
m2
m6
m10
m12
m13
...
m15
The second Kafka broker gets m15.
Kafka broker Failover WORKS!