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進行鋪墊的……


分享到:


相關文章: