簡體   English   中英

對於具有 2 個分區和 2 個副本的主題,如何處理具有兩個節點的 kafka 領導者故障轉移?

[英]How to handle kafka leader failover with two nodes for a topic with 2 partitions and 2 replicas?

我在多節點環境中使用 kafka 來測試故障轉移的工作原理。 實際上,我有 2 個 VM,每個 VM 內有 1 個 kafka 節點,而兩個 VM 之一內只有 1 個 zookeeper。 我知道沒有最佳的生產配置,但它只是為了訓練自己並更好地理解事物。

這是我的配置: VM1 ip: 192.168.64.2(只有一個 broker.id=2 的代理) VM2 ip: 192.168.64.3(在這里運行 zookeeper,broker.id=1)

我通過podman啟動kafka(這不是podman的問題,一切都配置好)

在 VM1 上:

podman run -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=192.168.64.3:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9093,PLAINTEXT_HOST://192.168.64.2:29092 -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=2 -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT_HOST -e UNCLEAN_LEADER_ELECTION_ENABLE=true --pod zookeeper-kafka confluentinc/cp-kafka:latest

在 VM2 上:

podman run -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=localhost:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092,PLAINTEXT_HOST://192.168.64.3:29092 -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=2 -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT_HOST -e UNCLEAN_LEADER_ELECTION_ENABLE=true  --pod zookeeper-kafka confluentinc/cp-kafka:latest

現在我創建一個主題“訂單”:

./kafktopics --create --bootstrap-server 192.168.64.2:29092,192.168.64.3:29092 --replication-factor 2 --partitions 2 --topic orders

然后我創建一個生產者:

./kafkconsole-producer --broker-list 192.168.64.2:29092,192.168.64.3:29092 --topic orders

還有一個消費者:

./kafka-console-consumer --bootstrap-server 192.168.64.2:29092,192.168.64.3:29092 --topic orders```

這是我正在嘗試做的事情:

  1. 啟動Zookeeper,2個kafka節點,創建“訂單”主題,生產者和消費者(OK,一切正常)
  2. 在我的生產者中發送消息並檢查消費者是否收到它(OK)
  3. 殺死VM2上的kafka節點(OK)
  4. 在我的生產者中再次發送一條消息並檢查消費者是否收到它(好的,VM1 上的代理可以分發消息)
  5. 在 VM2 上重新啟動被殺死的 kafka 節點(好的。之后我可以看到 2 個分區以 VM1 作為領導者)
  6. 在我的生產者中再次發送一條消息並檢查消費者接收 id (OK)
  7. 殺死VM1上的kafka節點,現在是2個分區的leader(OK)
  8. 在我的生產者中再次發送一條消息並檢查消費者是否收到它(OK,VM2 上的代理可以分發消息)
  9. 在 VM1 上重新啟動被殺死的 kafka 節點(好的。之后我可以看到 2 個分區以 VM2 作為領導者)
  10. 在我的生產者中再次發送一條消息並檢查消費者是否收到它(OK)
  11. 再次殺死VM2上的kafka節點(OK)
  12. 在我的生產者中再次發送一條消息並檢查消費者是否收到它(不正常):這里,生產者無法發送消息,我的消費者從未收到消息,經過一段時間后:我的生產者出現錯誤:
ERROR Error when sending message to topic orders with key: null, value: 9 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for orders-0:120000 ms has passed since batch creation

我真的不明白這里發生了什么? 一開始它運行良好,但在啟動/停止/啟動代理之后,它開始失敗。 我需要准確地說我永遠不會同時殺死 2 個經紀人。

你能解釋一下我在這里缺少什么嗎?

謝謝你們:)


編輯

要完成以下評論:

@OneCricketeer,我把你評論的答案放在這里。

在啟動時,一切都很好:

Topic: orders   TopicId: I3hMNln9TpSuo76xHSpMXQ PartitionCount: 2   ReplicationFactor: 2    Configs:
    Topic: orders   Partition: 0    Leader: 2   Replicas: 2,1   Isr: 2,1
    Topic: orders   Partition: 1    Leader: 1   Replicas: 1,2   Isr: 1,2

殺死VM2后:

Topic: orders   TopicId: I3hMNln9TpSuo76xHSpMXQ PartitionCount: 2   ReplicationFactor: 2    Configs:
    Topic: orders   Partition: 0    Leader: 2   Replicas: 2,1   Isr: 2
    Topic: orders   Partition: 1    Leader: 2   Replicas: 1,2   Isr: 2

殺死VM1后:

Topic: orders   TopicId: I3hMNln9TpSuo76xHSpMXQ PartitionCount: 2   ReplicationFactor: 2    Configs:
    Topic: orders   Partition: 0    Leader: 1   Replicas: 2,1   Isr: 1
    Topic: orders   Partition: 1    Leader: 1   Replicas: 1,2   Isr: 1

殺死VM2后:

Topic: orders   TopicId: I3hMNln9TpSuo76xHSpMXQ PartitionCount: 2   ReplicationFactor: 2    Configs:
    Topic: orders   Partition: 0    Leader: 2   Replicas: 2,1   Isr: 2
    Topic: orders   Partition: 1    Leader: 2   Replicas: 1,2   Isr: 2

(從這里開始,生產者不能再發布消息了)

我把你評論的答案放在這里。

在啟動時,一切都很好:

Topic: orders   TopicId: I3hMNln9TpSuo76xHSpMXQ PartitionCount: 2   ReplicationFactor: 2    Configs:
    Topic: orders   Partition: 0    Leader: 2   Replicas: 2,1   Isr: 2,1
    Topic: orders   Partition: 1    Leader: 1   Replicas: 1,2   Isr: 1,2

殺死VM2后:

Topic: orders   TopicId: I3hMNln9TpSuo76xHSpMXQ PartitionCount: 2   ReplicationFactor: 2    Configs:
    Topic: orders   Partition: 0    Leader: 2   Replicas: 2,1   Isr: 2
    Topic: orders   Partition: 1    Leader: 2   Replicas: 1,2   Isr: 2

殺死VM1后:

Topic: orders   TopicId: I3hMNln9TpSuo76xHSpMXQ PartitionCount: 2   ReplicationFactor: 2    Configs:
    Topic: orders   Partition: 0    Leader: 1   Replicas: 2,1   Isr: 1
    Topic: orders   Partition: 1    Leader: 1   Replicas: 1,2   Isr: 1

殺死VM2后:(從這里,生產者不能再發布消息了)

Topic: orders   TopicId: I3hMNln9TpSuo76xHSpMXQ PartitionCount: 2   ReplicationFactor: 2    Configs:
    Topic: orders   Partition: 0    Leader: 2   Replicas: 2,1   Isr: 2
    Topic: orders   Partition: 1    Leader: 2   Replicas: 1,2   Isr: 2

經過長時間閱讀和調查有關kafka的事情,我終於找到了我的問題的答案。

只有 2 個代理,我需要以下配置

KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=2
KAFKA_OFFSETS_TOPIC_NUM_PARTITIONS=1

問題是偏移主題的默認分區數。 (如果我沒記錯的話,那是 50 次中的 49 次)。

現在只有一個分區和 2 個副本,一切正常,我可以啟動/停止/啟動/停止/....

希望這可以幫助將來的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM