簡體   English   中英

如何在 kafka 中將主題從一個代理移動到另一個代理?

[英]How to move a topic from one broker to another broker in kafka?

我首先嘗試查看是否可以在特定代理中創建主題。 但看起來這是不可能的。 即使我在引導程序中提到代理主機

    admin_client = AdminClient({
    "bootstrap.servers": "xxx1.com:9092,xxx2.com:9092"
})

futmap=admin_client.create_topics(topic_list)

該程序任意挑選我擁有的 5 個代理之一作為該主題的領導代理。 我試圖理解為什么會這樣。

我也在嘗試查看是否可以將主題負責人重新分配給另一個經紀人。 我知道可以通過 kafka-reassign-partitions 命令行腳本來實現,但我想使用 python 和 confluent-Kafka package 以編程方式進行。 是否可以以編程方式執行此操作。 我在 confluent-Kafka package 的 ADMIN class 中沒有找到重新分配分區 function

謝謝

我終於找到了解決方案,融合的 Kafka python package 的文檔不足以解決這個問題。 但是開源的一件好事是你可以閱讀代碼並弄清楚。 因此,要在特定代理中創建主題,我必須編寫創建主題代碼,如下所示。 請注意,我使用的是replica_assignment 而不是replication_factor。 這兩者是互斥的。 如果使用replication_factor,分區將由Kafka分配,您可以通過replica_assignment控制分配。 但是,我確信在重新平衡/重新分配分區的情況下,這將被重新分配。 但這也可以通過 on_revoke 事件來處理。 但就目前而言,這對我有用。

def createTopic(admin_client,topics):
    #topic_name=topics
    topic_name = ['rajib1_test_xxx_topic']
    replica_assignment = [[262, 261]]
    topic_list = [NewTopic(topic, num_partitions=1, replica_assignment=replica_assignment) for topic in topic_name]
futmap=admin_client.create_topics(topic_list)
# Wait for each operation to finish.
for topic, f in futmap.items():
    try:
        f.result()  # The result itself is None
        print("Topic {} created".format(topic))
    except Exception as e:
        print("Failed to create topic {}: {}".format(topic, e))
#return futmap

您還可以使用 Kafka 附帶的kafka-reassign-partitions.sh工具將一個主題的副本更改為另一個代理。

例如,如果你想讓你的(在這個例子中是單復制和單分區的)主題“test”位於代理“1”上,你可以首先定義一個計划(命名為 replicachange.json):

{
"partitions":
  [{"topic": "test", "partition": 0,
    "replicas": [
       1
    ]
  }],
"version":1
}

然后使用執行它:

kafka-reassign-partitions.sh --zookeeper localhost:2181 --execute \
--reassignment-json-file replicachange.json

暫無
暫無

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

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