1. 程式人生 > >kafka 新增節點或者刪除節點

kafka 新增節點或者刪除節點

擴充套件您的群集

將伺服器新增到Kafka叢集很簡單,只需為它們分配一個唯一的代理ID並在新伺服器上啟動Kafka即可。但是,這些新伺服器不會自動分配任何資料分割槽,因此除非將分割槽移動到它們,否則在建立新主題之前它們不會執行任何工作。因此,通常在將計算機新增到群集時,您需要將一些現有資料遷移到這些計算機。

遷移資料的過程是手動啟動的,但完全自動化。發生的事情是,Kafka將新增新伺服器作為其正在遷移的分割槽的跟隨者,並允許它完全複製該分割槽中的現有資料。當新伺服器完全複製此分割槽的內容並加入同步副本時,其中一個現有副本將刪除其分割槽的資料。

分割槽重新分配工具可用於跨代理移動分割槽。理想的分割槽分佈將確保所有代理的均勻資料負載和分割槽大小。分割槽重新分配工具無法自動研究Kafka群集中的資料分佈並移動分割槽以實現均勻的負載分配。因此,管理員必須弄清楚應該移動哪些主題或分割槽。

分割槽重新分配工具可以以3種互斥模式執行:

  • --generate:在此模式下,給定主題列表和代理列表,該工具會生成候選重新​​分配,以將指定主題的所有分割槽移動到新代理。此選項僅提供了一種方便的方法,可在給定主題和目標代理列表的情況下生成分割槽重新分配計劃。
  • --execute:在此模式下,該工具根據使用者提供的重新分配計劃啟動分割槽的重新分配。(使用--reassignment-json-file選項)。這可以是由管理員手工製作的自定義重新分配計劃,也可以使用--generate選項提供
  • --verify:在此模式下,該工具將驗證最後一次--execute期間列出的所有分割槽的重新分配狀態。狀態可以是成功完成,失敗或正在進行中

自動將資料遷移到新計算機

分割槽重新分配工具可用於將一些主題從當前的代理集移動到新新增的代理。這在擴充套件現有叢集時通常很有用,因為將整個主題移動到新的代理集更容易,而不是一次移動一個分割槽。當用於執行此操作時,使用者應提供應移動到新的代理集的主題列表和新代理的目標列表。然後,該工具在新的代理集中均勻分配給定主題列表的所有分割槽。在此移動期間,主題的複製因子保持不變。有效地,輸入主題列表的所有分割槽的副本將從舊的代理集移動到新新增的代理。

例如,以下示例將主題foo1,foo2的所有分割槽移動到新的代理集5,6。在此移動結束時,主題foo1和foo2的所有分割槽將僅存在於代理5,6上。

由於該工具接受主題的輸入列表作為json檔案,因此首先需要確定要移動的主題並建立json檔案,如下所示:

1

2

3

4

> cat topics-to-move.json

{"topics": [{"topic": "foo1"},

            {"topic": "foo2"}],

"version":1

}

準備好json檔案後,使用分割槽重新分配工具生成候選分配:

1

2

3

4

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

> bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --topics-to-move-json-file topics-to-move.json --broker-list "5,6" --generate

Current partition replica assignment

 

{"version":1,

"partitions":[{"topic":"foo1","partition":2,"replicas":[1,2]},

              {"topic":"foo1","partition":0,"replicas":[3,4]},

              {"topic":"foo2","partition":2,"replicas":[1,2]},

              {"topic":"foo2","partition":0,"replicas":[3,4]},

              {"topic":"foo1","partition":1,"replicas":[2,3]},

              {"topic":"foo2","partition":1,"replicas":[2,3]}]

}

 

Proposed partition reassignment configuration

 

{"version":1,

"partitions":[{"topic":"foo1","partition":2,"replicas":[5,6]},

              {"topic":"foo1","partition":0,"replicas":[5,6]},

              {"topic":"foo2","partition":2,"replicas":[5,6]},

              {"topic":"foo2","partition":0,"replicas":[5,6]},

              {"topic":"foo1","partition":1,"replicas":[5,6]},

              {"topic":"foo2","partition":1,"replicas":[5,6]}]

}

該工具生成一個候選分配,將所有分割槽從主題foo1,foo2移動到代理5,6。但請注意,此時分割槽移動尚未開始,它只是告訴您當前的分配和建議的新分配。應儲存當前分配,以防您想要回滾它。新的賦值應儲存在json檔案中(例如expand-cluster-reassignment.json),以使用--execute選項輸入到工具,如下所示:

1

2

3

4

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

> bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file expand-cluster-reassignment.json --execute

Current partition replica assignment

 

{"version":1,

"partitions":[{"topic":"foo1","partition":2,"replicas":[1,2]},

              {"topic":"foo1","partition":0,"replicas":[3,4]},

              {"topic":"foo2","partition":2,"replicas":[1,2]},

              {"topic":"foo2","partition":0,"replicas":[3,4]},

              {"topic":"foo1","partition":1,"replicas":[2,3]},

              {"topic":"foo2","partition":1,"replicas":[2,3]}]

}

 

Save this to use as the --reassignment-json-file option during rollback

Successfully started reassignment of partitions

{"version":1,

"partitions":[{"topic":"foo1","partition":2,"replicas":[5,6]},

              {"topic":"foo1","partition":0,"replicas":[5,6]},

              {"topic":"foo2","partition":2,"replicas":[5,6]},

              {"topic":"foo2","partition":0,"replicas":[5,6]},

              {"topic":"foo1","partition":1,"replicas":[5,6]},

              {"topic":"foo2","partition":1,"replicas":[5,6]}]

}

最後,--verify選項可與該工具一起使用,以檢查分割槽重新分配的狀態。請注意,相同的expand-cluster-reassignment.json(與--execute選項一起使用)應與--verify選項一起使用:

1

2

3

4

6

7

8

> bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file expand-cluster-reassignment.json --verify

Status of partition reassignment:

Reassignment of partition [foo1,0] completed successfully

Reassignment of partition [foo1,1] is in progress

Reassignment of partition [foo1,2] is in progress

Reassignment of partition [foo2,0] completed successfully

Reassignment of partition [foo2,1] completed successfully

Reassignment of partition [foo2,2] completed successfully