1. 概要

このチュートリアルでは、Consulを使用したリーダーシップ選挙がデータの安定性を確保するのにどのように役立つかを確認します。並行アプリケーションで分散ロックを管理する方法の実際的な例を示します。

2. 領事とは何ですか?

Consul は、ヘルスチェックに基づいたサービスレジストリと検出を提供するオープンソースツールです。 さらに、Consulを表示して簡単に操作するためのWebグラフィカルユーザーインターフェイス(GUI)が含まれています。 また、セッション管理とキー値(KV)ストアの追加機能についても説明します。

次のセクションでは、 Consulのセッション管理とKVストアを使用して、複数のインスタンスを持つアプリケーションのリーダーを選択する方法に焦点を当てます。

3. 領事の基礎

Consulエージェントは、Consulクラスターの各ノードで実行される最も重要なコンポーネントです。ヘルスチェックを担当します。 サービスの登録、発見、および解決。 構成データの保存。 とはるかに。

領事エージェントは、2つの異なるモード—サーバーとエージェントで実行できます。

領事サーバーの主なの責任は、エージェントからのクエリに応答し、リーダーを選出することです。 リーダーシップは、コンセンサスプロトコルを使用して選択され、ラフトアルゴリズムに基づいて一貫性(CAPで定義)を提供します。

コンセンサスがどのように機能するかについて詳しく説明することは、この記事の範囲内ではありません。 それでも、ノードはリーダー、候補者、フォロワーの3つの状態のいずれかになります。 また、データを保存し、エージェントからのクエリに応答します。

AgentはConsulサーバーよりも軽量です。 登録されたサービスのヘルスチェックを実行し、クエリをサーバーに転送する役割を果たします。 Consulクラスターの簡単な図を見てみましょう。

Consulは、他の方法でも役立ちます。たとえば、1つのインスタンスがリーダーでなければならない並行アプリケーションの場合です。

次のセクションで、Consulがセッション管理とKVストアを介してこの重要な機能をどのように提供できるかを見てみましょう。

4. 領事とのリーダーシップ選挙

分散展開では、ロックを保持しているサービスがリーダーです。 したがって、高可用性システムの場合、ロックとリーダーを管理することが重要です。

Consulは、使いやすいKVストアとセッション管理を提供します。 これらの機能はリーダー選出を構築するのに役立つので、それらの背後にある原則を学びましょう。

4.1. リーダーシップの争い

分散システムに属するすべてのインスタンスが最初に行うことは、リーダーシップを競うことです。リーダーになるための競合には、一連のステップが含まれます。

  1. すべてのインスタンスは、競合する共通のキーについて合意する必要があります。
  2. 次に、インスタンスは、Consulセッション管理とKV機能を介して合意されたキーを使用してセッションを作成します。
  3. 第三に、彼らはセッションを取得する必要があります。 戻り値がtrueの場合、ロックはインスタンスに属し、 false の場合、インスタンスはフォロワーです。
  4. インスタンスは、失敗またはリリースの場合に再びリーダーシップを獲得するために、セッションを継続的に監視する必要があります
  5. 最後に、リーダーはセッションを解放でき、プロセスが再開されます。

リーダーが選出されると、残りのインスタンスは領事KVとセッション管理を使用して、次の方法でリーダーを検出します。

  • 合意されたキーを取得する
  • リーダーを知るためのセッション情報の取得

4.2. 実用例

複数のインスタンスを実行しているConsulのセッションと一緒に、キーと値を作成する必要があります。 これを支援するために、 Kinguin Digital Limited LeadershipConsulオープンソースJava実装を使用します。

まず、依存関係を含めましょう。

<dependency>
   <groupId>com.github.kinguinltdhk</groupId>
   <artifactId>leadership-consul</artifactId>
   <version>${kinguinltdhk.version}</version>
   <exclusions>
       <exclusion>
           <groupId>com.ecwid.consul</groupId> 
           <artifactId>consul-api</artifactId>
       </exclusion>
   </exclusions>
</dependency>

Javaの異なるバージョンでの衝突を回避するために、consul-api依存関係を除外しました。

共通キーには、次のものを使用します。

services/%s/leader

簡単なスニペットを使用して、すべてのプロセスをテストしてみましょう。

new SimpleConsulClusterFactory()
    .mode(SimpleConsulClusterFactory.MODE_MULTI)
    .debug(true)
    .build()
    .asObservable()
    .subscribe(i -> System.out.println(i));

次に、 asObservable()を使用して複数のインスタンスを持つクラスターを作成し、サブスクライバーによるイベントへのアクセスを容易にします。 リーダーは領事館でセッションを作成し、すべてのインスタンスがセッションを検証してリーダーシップを確認します。

最後に、領事館の構成とセッション管理、およびインスタンス間で合意されたキーをカスタマイズして、リーダーを選出します。

cluster:
  leader:
    serviceName: cluster
    serviceId: node-1
    consul:
      host: localhost
      port: 8500
      discovery:
        enabled: false
    session:
      ttl: 15
      refresh: 7
    election:
      envelopeTemplate: services/%s/leader

4.3. それをテストする方法

Consulをインストールし、エージェントを実行するにはいくつかのオプションがあります。

Consulを展開する可能性の1つは、containerを使用することです。 コンテナイメージの世界最大のリポジトリであるDockerHubで利用可能なConsulDockerイメージを使用します。

次のコマンドを実行して、Dockerを使用してConsulをデプロイします。

docker run -d --name consul -p 8500:8500 -e CONSUL_BIND_INTERFACE=eth0 consul

Consulは現在実行中であり、 localhost:8500で利用できるはずです。

スニペットを実行して、実行された手順を確認しましょう。

  1. リーダーは領事館でセッションを作成します。
  2. 次に、それが選出されます( selected.first )。
  3. 残りのインスタンスはセッションが解放されるまで監視します
INFO: multi mode active
INFO: Session created e11b6ace-9dc7-4e51-b673-033f8134a7d4
INFO: Session refresh scheduled on 7 seconds frequency 
INFO: Vote frequency setup on 10 seconds frequency 
ElectionMessage(status=elected, vote=Vote{sessionId='e11b6ace-9dc7-4e51-b673-033f8134a7d4', serviceName='cluster-app', serviceId='node-1'}, error=null)
ElectionMessage(status=elected.first, vote=Vote{sessionId='e11b6ace-9dc7-4e51-b673-033f8134a7d4', serviceName='cluster-app', serviceId='node-1'}, error=null)
ElectionMessage(status=elected, vote=Vote{sessionId='e11b6ace-9dc7-4e51-b673-033f8134a7d4', serviceName='cluster-app', serviceId='node-1'}, error=null)

Consulは、 http:// localhost:8500 /uiで利用可能なWebGUIも提供しています。

ブラウザを開き、Key-Valueセクションをクリックして、セッションが作成されたことを確認しましょう。

したがって、同時インスタンスの1つが、アプリケーション用に合意されたキーを使用してセッションを作成しました。 セッションが解放されたときにのみ、プロセスを最初からやり直すことができ、新しいインスタンスがリーダーになることができます。

5. 結論

この記事では、複数のインスタンスを使用する高性能アプリケーションでのリーダーシップ選挙の基本を示しました。 Consulのセッション管理とKVストア機能が、ロックの取得とリーダーの選択にどのように役立つかを示しました。

いつものように、コードはGitHubから入手できます。