Kafka のパーティションリーダーを変更する方法

Kafka のパーティションリーダーを変更する方法

数日前、私のグループの友人が私に尋ねました: Kafka の優先度レプリカを変更するにはどうすればいいですか?パーティション内のレプリカの 1 つをリーダーとして指定する必要があります。

ここに画像の説明を挿入

需要分析

この問題は、私たちの生産環境では非常によく発生します。多くの場合、トピック内のパーティションのリーダーを変更する必要があります。

たとえば、topic1-0には3つのレプリカ[0,1,2]があります。 「優先レプリカ」ルールに従って

その場合、レプリカ 0 がリーダーである必要があります。パーティション内のリーダー レプリカのみが読み取り/書き込みレプリカを提供することは誰もが知っています。

その他のコピーはバックアップとして使用されます。場合によっては、コピー0のパフォーマンスリソースが不足していたり​​、ネットワークが良好でなかったり、IOの負荷が高かったりするなど、

これは間違いなく、トピックの全体的な読み取りおよび書き込みパフォーマンスに大きな影響を与えます。このとき、リーダーとしてプレッシャーの少ないレプリカに切り替えることが非常に重要です。

優先レプリカ: パーティション内のAR(すべてのレプリカ)情報、最初のレプリカがリーダーとして選択される

リーダーメカニズム: パーティションには読み取りと書き込みを担当するリーダーが 1 つだけ存在し、他のレプリカはバックアップとしてのみ使用されます。

では、そのような要件をどのように達成するのでしょうか?

解決

原理を理解すれば、それに応じた解決策を考えることができます。パーティションの AR の最初の位置を、指定したコピーに置き換えるだけです。 AR = {0,1,2} ==> AR = {2,1,0}

この目標を達成するには、一般的に 2 つの解決策があります。以下で分析してみましょう。

解決策1: パーティションレプリカの再配布

これまでにパーティション レプリカの再配布に関する記事を多数書きました。パーティション レプリカの再配布、データ移行、レプリカの拡張と縮小について詳しく知りたい場合は、リンクされた記事をお読みください。ここで簡単にお話しします。

一般に、パーティション レプリカの再配布には主に 3 つのプロセスがあります。

  • 推奨移行JSONファイルを生成する
  • 移行JSONファイルを実行する
  • 移行プロセスが完了したことを確認する

ここでは主にステップ2を見て、移行ファイルが一般的にどのようになっているかを確認します。

  1. {
  2. 「バージョン」 : 1,
  3. 「パーティション」 : [{
  4. 「トピック」 : 「トピック1」
  5. 「パーティション」 : 0,
  6. 「レプリカ」 : [0,1,2]
  7. }]
  8. }

この移行 Json は、topic1 のパーティション 0 のレプリカが [0,1,2] に分散されることを意味し、つまり topic1 のパーティション 0 には最終的に {brokerId-0,brokerId-1,brokerId-2} に 3 つのレプリカが存在することになります。

以前書いたパーティションレプリカ再分配原則のソースコード分析を読んだことがあるなら、間違いなく知っているだろう。

以前の割り当て方法が何であっても、最終的なコピー割り当ては [0,1,2] になります。コピー数が多いものは削除され、コピー数が少ないものが追加されます。

それで、私たちのニーズを満たしたい場合は、このJSONファイル内の「replicas」: [0,1,2]を変更するだけでいいのでしょうか?

たとえば、これを "replicas": [2,1,0] に変更します。Json を変更した後、それを実行すると、再配布プロセスが正式に開始されます。移行が完了すると、リーダーが上記の最初の位置のレプリカ「2」になっていることがわかります。

長所と短所

利点: 要件が満たされ、リーダーが積極的に切り替えられる

デメリット: 操作が複雑で、エラーが発生しやすくなります。まず元のパーティション割り当てデータを取得し、次に Json ファイルを手動で変更する必要があります。ここでは間違いが起きやすく、その影響も比較的大きくなります。もちろん、これらは検証インターフェースを通じて制限できます。最も重要な点は、レプリカの再配布には現時点では 1 つのタスクしか存在しないことです。現在「レプリカ再配布」タスクがある場合、ここでは実行できません。 「レプリカの再配布」は比較的「重い」操作であり、エラーはクラスターに大きな影響を与えます。

解決策2: AR注文を手動で変更する

まず、パーティション レプリカ割り当てデータは Zookeeper のノード brokers/topics/{topicName} に保存されていることがわかります。 Topic1 のノード データの例を見てみましょう。

  1. {
  2. 「バージョン」 : 2,
  3. 「パーティション」 : {
  4. 「2」 :[3, 2, 1],
  5. 「1」 :[2, 1, 3],
  6. 「4」 :[2, 3, 1],
  7. 「0」 : [1, 3, 2],
  8. 「3」 :[1, 2, 3]
  9. },
  10. 「レプリカの追加」 : {},
  11. 「レプリカを削除しています」 : {}
  12. }

データの説明: バージョン: バージョン情報。現在、「1」と「2」の 2 つのバージョンがあります。

removed_replicas: 削除する必要があるレプリカ データ。パーティション レプリカの再配布プロセス中に、データ移行がほぼ完了すると、余分なレプリカは削除されます。削除が成功すると、ここのデータは消去されます

adding_replicas: 追加する必要があるレプリカ データ。パーティション レプリカの再配布プロセス中に、新しく追加されたレプリカが追加されます。追加が完了すると、ここにあるデータはクリアされます。

パーティション: トピックのすべてのパーティション コピーの割り当て方法。上記は、合計 5 つのパーティションとそれに対応するコピー場所があることを示しています。

これを知った上で、優先レプリカを変更したい場合は、Zookeeper 内のノードデータを直接変更するだけでよいのでしょうか?たとえば、パーティション「1」のレプリカの場所を[2,1,3]に変更します。

これを変更した後でも、たとえばkafkaコマンドを実行して、優先レプリカを再選出する必要があります。

  1. sh bin/kafka-leader-election.sh --bootstrap-server xxxx:9090 --topic Topic1--election-type PREFERRED --partition 1  

--election-type : PREFERRED これは優先コピーモードでの再選出を意味します

つまり、これら 2 つの手順を完了すると、優先コピーを変更するという目標は達成されたことになります...?

実際にはそうではありません。なぜなら、ここではZookeeperノードのデータのみが変更されるからです。

bin/kafka-leader-election.sh の再選出操作はコントローラーによって実行されます。コントローラーの役割とソースコードを十分に理解している場合

コントローラーは各トピックのパーティションレプリカ情報を JVM メモリに保存することがわかっています。次に、Zookeeper 内のノードを手動で変更します。これにより、コントローラーが独自のメモリを更新するようにトリガーされません。

つまり、kafka-leader-election.sh を実行しても、優先レプリカは変更を認識しないため、まったく変更されません。

この問題の解決も非常に簡単です。コントローラーにデータの変更を認識させるだけです。最も簡単な方法は、コントローラーにデータを再選択させて再ロードさせることです。

要約する

Zookeeper の「AR」順序を手動で変更する

コントローラーの再選出

パーティションレプリカの再選出操作を実行する(優先レプリカ戦略)

シンプルなコード

もちろん、上記の機能は LogiKM に統合する必要があります。簡単なコードは以下のとおりです

  1. // ここで HashMap 型に変換します。Kafka ノード データが後で新しいデータ ノードを追加してデータが失われるのを防ぐために、型をカスタマイズしないでください。
  2. ハッシュマップのパーティションマップ = zkConfig.get(ZkPathUtil.getBrokerTopicRoot(topicName), HashMap.class);
  3. JSONObject パーティションJson = (JSONObject)partitionMap.get( "パーティション" );
  4. JSONArray パーティション = (JSONArray)partitionJson.get(partition);
  5.  
  6. //コードの一部は省略されています
  7.  
  8. //スイッチシーケンスの優先順位のコピー
  9. 整数 最初= パーティション.getInteger(0);
  10. パーティションを設定します(0、ターゲットブローカー);
  11. パーティションを設定します(インデックス最初);
  12.  
  13. クラスター内の Zookeeper インスタンスを取得します。
  14. 文字列 json = JSON.toJSONString(partitionMap);
  15.  
  16. zkUtils.updatePersistentPath(ZkPathUtil.getBrokerTopicRoot(topicName), json, null );
  17.  
  18. //書き込みが成功したら、非同期優先コピー選択をトリガーします
  19. 新しいスレッド(()->{
  20. 試す {
  21. // 1. 最初にコントローラーを再選出します (そうしないと、上記の変更は有効になりません) (TODO.. 最適化が必要 -> コントローラーの再選出が頻繁に行われると、クラスターのパフォーマンスに影響します)
  22. zkConfig.deletePath(ZkPathUtil.CONTROLLER_ROOT_NODE);
  23. // コントローラーが選出されるまで待つ
  24. スレッドをスリープ状態にします(1000);
  25. //2.次にレプリカの再選出を開始する
  26. preferredReplicalElectCommand.preferredReplicaElection(クラスター ID、トピック名、パーティション、 "" );
  27. } キャッチ (ConfigException | InterruptedException e) {
  28. LOGGER.error( "再選例外.e:{}" ,e);
  29. e.printStackTrace();
  30. }
  31.  
  32. })。始める();

長所と短所

利点: 目標需要を達成、シンプル、操作が簡単

デメリット: コントローラの頻繁な再選出は、実稼働環境に何らかの影響を及ぼします。

最適化と改善

2 番目の解決策では、コントローラーを再選する必要があります。頻繁な選挙は間違いなく生産環境に影響を与えます。コントローラーには、パーティション レプリカの再配布、トピックの削除、リーダーの選出など、多くの責任があります。

では、コントローラーを再選せずにニーズを満たすにはどうすればよいでしょうか?

私たちの要件は、Zookeeper でノード データを変更すると、コントローラーがそれをすぐに認識し、独自のメモリ データを更新できることです。

この問題については次の記事で紹介します。

質問

この記事を読んだ後、考えるべきいくつかの関連する質問をしたいと思います。

順序を変更するだけでなく、コピーを追加または削除して zk の「AR」情報を変更するとどうなりますか?

brokers/topics/{topicName}/partitions/{partition number}/state ノードのリーダー情報を手動で変更した場合、リーダーを直接更新できますか?

レプリカ選挙プロセス全体はどのようなものですか?

考えてみて下さい、その質問に対する答えを以下の記事で一つずつ解説していきます!

<<:  Kubernetes ソースコード分析: リソースと API

>>:  システムとカオスのテスト: クラウドの回復力へのアプローチ

推薦する

あなたのクラウド戦略はハイパースケールに対応していますか?

2020 年に入ってから予想外の需要に直面し、ビジネス リーダーと IT リーダーはクラウド運用の計...

オートホーム:4億5000万元の利益を生んだメディア変革の道

ナンドゥのイラスト2013年12月11日、ニューヨーク証券取引所でベルが鳴るとともに、設立されて間も...

エッジコンピューティングの 5 つのベストユースケース

翻訳者 |崔浩企画 |徐潔成1. はじめに時間はお金や安全に等しいと認識したとき;データコンプライア...

ネットセレブやライブストリーミング販売の後に、想像力を働かせる余地はどれくらいあるのでしょうか?

突然の流行により、ライブストリーミングは予想外に全国的な現象となった。 2006年頃から「ライブスト...

インターネット思考はケータリングビジネスの運営を困難にする:ITマンが肉家墨で五道口に戻る

【要約】インターネット業界とは異なり、飲食業界のハードコストははるかに高く、原材料、工場の賃貸料、物...

reprisehosting: シアトルでAlipayに公式接続された超格安サーバーを提供

格安サーバーを販売するアメリカの会社reprisehostingが、正式にAlipay決済を導入した...

2020 年のクラウド移行の最大の課題

クラウド コンピューティングの人気は高まり続けていますが、競争で優位に立つためには、2020 年にク...

負担を軽くするための投資がトレンドになる中、次に打撃を受けるのは56.comだろうか?

インターネットの世界は常に変化しています。アリババによるインタイムへの投資をめぐる論争はまだ収まって...

亥年には、エッジコンピューティングとモノのインターネットが大きな注目を集めると聞きました。

エッジ コンピューティングは、インテリジェントな相互接続サービスをローカルに提供し、デジタル変革プロ...

エッジコンピューティングに関する3つの誤解を解く

【51CTO.comオリジナル記事】毎日何百万台ものマシンやデバイスがインターネットに接続される中、...

「fantong.com」は閉鎖され、良いドメイン名fantong.comが残ったと言われています

eName.cnは4月23日、かつて有名だった飲食O2Oサイト「Fantong.com」が現在破産の...

ウェブサイトが悪意を持って利用されていないか確認する

マルウェアやスパムに感染したくない人は誰もいません。だからこそ、安全な Web サイトを運営するため...

新たに開発されたネットワーク金融システムに心を痛めているのは誰でしょうか?

中国の電子商取引のリーダーとして、アリババは自社の発展の機会を正確に把握できるだけでなく、利用可能な...

SwiftVM 月額 4 ドル 1G メモリ/25GSSD/OpenVZ/カリフォルニア データ センター

SwiftVM の低価格 VPS プロモーションでは、Samsung のソリッド ステート ドライブ...

SAPはインテリジェントなイノベーションを推進し、データの価値を活用し、ビジネスの成長を促進します

疫病の影響により、企業のビジネスの俊敏性と価値の迅速な実現に対する要求はますます緊急なものとなり、テ...