Kafka容错性功能介绍并实战演练,深入理解Kafka的fault-tolerant

一、背景介绍

Kafka 允许 topic 的 partition 拥有若干副本,你可以在server端配置partition 的副本数量。当集群中的节点出现故障时,能自动进行故障转移,保证数据的可用性。

创建副本的单位是 topic 的 partition ,正常情况下, 每个分区都有一个 leader 和零或多个 followers 。 总的副本数是包含 leader 的总和。所有的 followers 节点都同步 leader 节点的日志,日志中的消息和偏移量都和 leader 中的一致。(当然, 在任何给定时间, leader 节点的日志末尾时可能有几个消息尚未被备份完成)。

Followers 节点就像普通的 consumer 那样从 leader 节点那里拉取消息并保存在自己的日志文件中。Followers 节点可以从 leader 节点那里批量拉取消息日志到自己的日志文件中。

与大多数分布式系统一样,自动处理故障需要精确定义节点 “alive” 的概念。Kafka 判断节点是否存活有两种方式。

节点必须可以维护和 ZooKeeper 的连接,Zookeeper 通过心跳机制检查每个节点的连接。如果节点是个 follower ,它必须能及时的同步 leader 的写操作,并且延时不能太久。

二、场景设计

建立3个broker,3个副本,1个partition的topic查看当前的topic信息开启1个生产者,1个消费者,看下生产、消费是否正常杀掉1个broker,此时,看下生产、消费是否正常杀掉2个broker,此时,看下生产、消费是否正常

三、实战测试

1、命令行演示

建立topic

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic

查看topic信息

[root@jikeh kafka_2.12-0.11.0.3]# 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: 3 Replicas: 3,1,2 Isr: 3,1,2
开启1个生产者,1个消费者,看下生产、消费是否正常

生产消息:

bin/kafka-console-producer.sh --broker-list localhost:9093,localhost:9094,localhost:9095 --topic my-replicated-topic

消费消息:

bin/kafka-console-consumer.sh --bootstrap-server localhost:9093,localhost:9094,localhost:9095 --topic my-replicated-topic

杀掉1个broker(follower),此时,看下生产、消费是否正常

kill -9 进程号

先查看下当前的进程号:

[root@jikeh ~]# jps -m
1522 Kafka config/server-1.properties
5061 Jps -m
1814 Kafka config/server-2.properties
1270 QuorumPeerMain /usr/local/zookeeper-3.4.12/bin/../conf/zoo.cfg
2106 Kafka config/server-3.properties

我们先杀死掉第1个kafka broker:

kill -9 1522

再扯查看此时的topic信息:

bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic

[root@jikeh kafka_2.12-0.11.0.3]# 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: 3 Replicas: 3,1,2 Isr: 3,2

分析上面的打印结果:此时,Isr就剩两个broker节点了,因为当前只有2个存活的broker节点了

看我们再测试下,生产、消费是否正常?

一切正常

杀掉2个broker(leader),此时,看下生产、消费是否正常

[root@jikeh kafka_2.12-0.11.0.3]# 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: 3,1,2 Isr: 2

分析上面的打印结果:此时leader节点已经变成了broker2了,当前也仅有一个broker节点存货了,但此时仍旧可以正常消费

2、SpringBoot项目演示

总结:只要还有一个副本,仍旧是可以正常运行的

更多内容:你可以自己看官网学习,我们后面如果有时间也会讲解kafka的消息存储机制、kafka的可靠消息存储等等高可用特性。我们下篇文章就先不讲kafka的高级特性了,我们开始讲解Storm了,我们讲kakfa也是为讲Storm进行铺垫的……