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进行铺垫的……


分享到:


相關文章: