# クラスターリンク

::: tip 注意

クラスターリンク機能は、EMQX Dedicatedエディションのバージョン5.8.6以降でのみ利用可能です。

:::

クラスターリンクは、複数の独立したEMQXクラスターを接続し、異なる地理的に分散したクラスター上のクライアント間の通信を可能にする機能です。従来のMQTTブリッジと比較して、クラスターリンクはより効率的で信頼性が高く、スケーラビリティに優れています。帯域幅の使用を最小限に抑え、ネットワークの中断にも耐性があります。

本ページでは、クラスターリンク機能の概要と、Dedicated環境での使用および設定方法について紹介します。

## 機能概要

単一のデプロイメントで、地理的に分散した数千のMQTTクライアントに効果的に対応できます。しかし、クライアントが世界中に分散している場合、高いレイテンシやネットワーク接続の不安定さといった問題が発生します。異なる地域に複数のデプロイメントを作成してクライアントにローカルでサービスを提供することでこれらの問題を緩和できますが、異なるデプロイメントに接続されたクライアント間でシームレスな通信を可能にするという新たな課題が生じます。

従来の解決策は、各デプロイメントにMQTTブリッジを追加し、すべてのメッセージをデプロイメント間で転送する方法です。この方法は帯域幅の過剰使用を招き、転送される多くのメッセージが相手側のクライアントにとって不要であるため、メッセージのレイテンシが増加する可能性があります。

クラスターリンクは、関連するメッセージのみをデプロイメント間で転送することでこれらの問題を解決します。この最適化により帯域幅の使用が削減され、ネットワークの中断時でも効率的な通信が保証されます。

## クラスターリンクの作成

クラスターリンクは複数のユースケースをサポートしています。デプロイメント環境に応じて、以下のようにリンクできます。

- **同一EMQX Platformアカウント**内のDedicatedデプロイメント間
- **異なるEMQX Platformアカウント**間のDedicatedデプロイメント
- Dedicatedデプロイメントと**セルフホスト（ローカル）EMQXブローカー**

それぞれのシナリオで設定手順が若干異なります。以下に詳細を記載します。

### 前提条件

クラスターリンクを設定する前に、以下の要件を満たしていることを確認してください。

1. Dedicatedデプロイメントを作成します。例えば、異なるリージョンに `deployment-us` と `deployment-eu` の2つのデプロイメントを作成します。  
   Dedicatedデプロイメントの作成方法については、[Dedicatedデプロイメントの作成](../create/dedicated.md)を参照してください。  
2. [NATゲートウェイ](../vas/nat-gateway.md)を介したパブリックネットワークアクセスを確保します。  
   - 各デプロイメントでNATゲートウェイを設定する必要があります。  
   - NATゲートウェイは外部接続を許可するために「Running」状態である必要があります。  

::: tip

アカウント間のクラスターリンクでは、NATゲートウェイの有効化は必須ではありません。  

ただし、ターゲットがセルフホストのEMQXインスタンスの場合、Dedicatedデプロイメントはパブリックインターネット経由でターゲットノードにアクセス可能である必要があります。

:::

これらの前提条件は、クラウドデプロイメントとセルフホスト（ローカル）EMQXブローカーを接続する場合にも適用されます。Dedicatedデプロイメントはパブリックネットワーク経由でターゲットブローカーに接続可能でなければなりません。

### シナリオ1：同一アカウント内のデプロイメントをリンクする

最も簡単なシナリオです。ターゲットデプロイメントをドロップダウンから選択でき、多くの項目が自動入力されます。

1. `deployment-us` のコンソールで **Cluster Linking** ページを開きます。

2. **New** をクリックして新しいクラスターリンクを作成します。

3. **New Cluster Linking** ページで以下のオプションを設定します。  
   - **Deployment Name**：リンク先のDedicatedデプロイメント名を選択します。ここでは例として `deployment-eu` を選択します。  
   - **Address**：リンク先デプロイメントのMQTTホストとポート。選択したデプロイメントに基づき自動入力されます。  
   - **Username / Password**：ターゲットデプロイメントで設定された有効な認証情報を使用します。  
   - **Client ID Prefix**：`deployment-eu` へのMQTT接続で使用されるクライアントIDのプレフィックスを定義します。例：`from-us`。  

     ::: tip

     クラスターの規模や設定により、リモートクラスターへの複数のMQTTクライアント接続が確立されることがあります。各クライアントはユニークなClientIDを持つ必要があり、*Client ID Prefix* を設定することでこれらのClientIDの割り当てを制御できます。

     :::

   - **Topics**：現在のデプロイメントがリモートデプロイメントから受信するメッセージのMQTTトピックフィルターのリスト。例：`/from-eu`。プラスアイコンをクリックしてトピックを追加可能です。  

     ::: tip

     これらはローカルクラスターがリモートクラスターから受信を期待するトピックです。空欄の場合、ローカルクラスターはリモートクラスターからメッセージを受信しません。

     :::

   - **Advanced Settings**：MQTTプロトコルパラメータなどの追加設定を行います。

4. **Confirm** をクリックします。クラスターリンクページにリダイレクトされ、新しいエントリが表示されデフォルトで有効になります。

   ![create_link_us](./_assets/create_link_us.png)

5. `deployment-eu` 側でも同様の手順で `deployment-us` への逆リンクを作成します。

   ![create_link_eu](./_assets/create_link_eu.png)

### シナリオ2：異なるアカウント間のデプロイメントをリンクする

このシナリオでは、両デプロイメントはEMQX Platform上にありますが、異なるアカウントに属しています。より多くの情報を手動で入力する必要があります。

1. `deployment-us` のコンソールで **Cluster Linking** ページを開きます。

2. **New** をクリックして新しいクラスターリンクを作成します。

3. **New Cluster Linking** ページで以下のオプションを設定します。  
   - **Cluster Name**：ターゲットデプロイメントのデプロイメントIDを入力します。ターゲットデプロイメントの **Settings** ページで確認可能です。  
   - **Address**：リモートデプロイメントのTLS/SSL対応MQTTアドレスを入力します。  
   - **Username / Password**：ターゲットデプロイメントで設定された認証情報を使用します。  
   - **Client ID Prefix**：`deployment-eu` へのMQTT接続で使用されるクライアントIDのプレフィックスを定義します。例：`from-us`。  
   - **Topics**：現在のデプロイメントがリモートデプロイメントから受信するメッセージのMQTTトピックフィルターのリスト。例：`/from-eu`。プラスアイコンをクリックしてトピックを追加可能です。  
   - **Advanced Settings**：MQTTプロトコルパラメータなどの追加設定を行います。

4. **Confirm** をクリックします。クラスターリンクページにリダイレクトされ、新しいエントリが表示されデフォルトで有効になります。

5. リモートアカウントの `deployment-eu` 側でも同様の手順で `deployment-us` への逆リンクを作成します。

### シナリオ3：ローカル（セルフホスト）ブローカーへのリンク

クラウドデプロイメントとローカルに展開されたEMQXブローカー（例：プライベートデータセンターや仮想マシン上のセルフホスト）をリンクすることも可能です。

::: tip

ローカルデプロイメントはパブリックネットワークからアクセス可能であり、TLS/SSL対応のMQTTをサポートしている必要があります。  
有効な証明書の使用を推奨します。

:::

1. デプロイメントの **Cluster Linking** ページで **New** をクリックします。

2. **New Cluster Linking** ページで以下のオプションを設定します。  
   - **Cluster Name**：ローカルEMQXの設定ファイルにある `cluster.name` の値を入力します。  
   - **Address**：ローカルEMQXインスタンスのアドレスとポートを入力します（例：`<your-host>:8883`）。  
   - **Username / Password**：ローカルデプロイメントが接続を許可するユーザー名とパスワードを入力します。  
   - **Client ID Prefix**：ローカルEMQXへのMQTT接続で使用されるクライアントIDのプレフィックスを定義します。例：`from-us`。  
   - **Topics**：現在のデプロイメントがローカルEMQXから受信するメッセージのMQTTトピックフィルターのリスト。例：`/from-local`。  
   - **Advanced Settings**：MQTTプロトコルパラメータなどの追加設定を行います。

3. **Confirm** をクリックします。クラスターリンクページにリダイレクトされ、新しいエントリが表示されデフォルトで有効になります。

4. ローカルEMQX側でも同様に逆リンクを作成します。詳細は [Dashboardによるクラスターリンクの設定と管理](https://docs.emqx.com/en/emqx/latest/cluster-linking/configuration.html#configure-and-manage-cluster-linking-via-dashboard) を参照してください。

## クラスターリンクの検証

MQTTXを使ってクラスターリンクが正常に作成されたか検証できます。

1. MQTTXで `us-client` という名前の新しい接続を作成し、`deployment-us` に接続します。トピック `/from-eu` をサブスクライブします。  
2. MQTTXで `eu-client` という名前の新しい接続を作成し、`deployment-eu` に接続します。トピック `/from-us` をサブスクライブします。  
3. `us-client` を使ってトピック `/from-us` にペイロード `from us` のメッセージをパブリッシュします。  
4. `eu-client` がメッセージを受信することを確認します。  
5. `eu-client` を使ってトピック `/from-eu` にメッセージをパブリッシュし、`us-client` もメッセージを受信することを確認します。

## 非対称リンクの作成

非対称リンクを作成するには、クラスターリンク設定の **Topics** フィールドを空にし、他の設定はそのままにします。

例えば、`deployment-us` のクラスターリンク設定でトピックを削除すると、`deployment-us` は `deployment-eu` からのメッセージを一切受信しないことを意味します。これによりクラスターリンクは非対称となり、クラスター間の一方向メッセージ転送に有用です。

[クラスターリンクの検証](#クラスターリンクの検証)のメッセージパブリッシュとサブスクライブの手順を繰り返すと、`deployment-eu` からパブリッシュされたメッセージが `deployment-us` のサブスクライバーに届かないことが確認できます。

## クラスターリンクの管理

クラスターリンクページで、クラスターリンクの基本情報を一覧で確認できます。

デプロイメント名をクリックすると、**Overview** タブでクラスターリンクの実行状況やメッセージ送受信のメトリクス・統計情報を閲覧できます。メトリクスをリセットしたい場合は、右上の「Reset」ボタンをクリックし、確認プロンプトに従ってください。

**Settings** タブをクリックすると設定を変更できます。また、一覧の **Actions** 列にある編集アイコンからも設定を編集可能です。

**Actions** 列の削除アイコンをクリックすると、選択したクラスターリンクエントリを削除できます。
