一、背景介绍
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进行铺垫的……
閱讀更多 極客慧 的文章