# EMQX クラスターリンク

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

本章では、クラスターリンクの概要と、その使用方法および設定方法について紹介します。

## クラスターリンクを使う理由

本節では、クラスターリンクが異なるクラスター間のクライアント通信に対して効率的なソリューションを提供する仕組みを説明します。帯域幅の使用量、ネットワーク耐性、スケーラビリティの観点から、MQTT ブリッジに対するクラスターリンクの利点を強調します。

### 単一クラスターの課題

単一の EMQX クラスターは、地理的に分散した数千の MQTT クライアントに対して効果的にサービスを提供できます。しかし、クライアントが世界中に分散している場合、高レイテンシやネットワーク接続の不安定さといった問題が発生します。異なる地域に複数の EMQX クラスターを展開することで、クライアントにローカルでサービスを提供し、これらの問題を緩和できます。

### クラスターリンクと MQTT ブリッジの比較

異なる地域に複数の EMQX クラスターを展開すると、新たな課題が生じます。それは、異なるクラスターに接続されたクライアント間でシームレスな通信を可能にすることです。

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

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

#### MQTT ブリッジとの機能比較

クラスターリンクは MQTT ブリッジと一部機能を共有しています。以下は両者の比較表です。これにより、MQTT ブリッジとクラスターリンクの主な違いと共通点を理解し、それぞれの機能の利点と適用例を把握できます。

| 機能                                | MQTT ブリッジ                                                | クラスターリンク                                            |
| ------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| **プロトコル**                       | MQTT                                                         | MQTT                                                         |
| **認証**                            | リモートブローカーに準拠                                    | リモートブローカーに準拠                                    |
| **認可**                            | リモートブローカーに準拠                                    | コントロールトピックのみ認可が必要<br />**コントロールトピック**：リンク機能に必要なデータ交換トピック<br />**メッセージトピック**：メッセージ複製が必要なトピック |
| **対応製品**                        | 標準的な MQTT ブローカー全般                                | EMQX のみ                                                   |
| **メッセージループバック**           | ブリッジモードのサポートが必要                              | 自動的に回避                                               |
| **ネームスペース**                   | メッセージループバック回避のためトピックプレフィックス追加が多い | 統一されたネームスペース                                    |
| **カスタムトピックプレフィックス** | サポート                                                    | 非対応                                                     |
| **ブリッジ方式**                    | リモートまたはローカルでのブリッジルール（Pub/Sub）設定をサポート<br />同一接続でパブリッシャーおよびサブスクライバーの両方を兼ねることが可能 | プッシュモードのみ対応。ローカル側でリモートへプッシュする設定が必要。相互通信にはピア設定が必要。<br />同一接続はパブリッシャーのみ。プッシュモードは双方向モードより効率的かつ安定。 |
| **メッセージ複製方式**               | 指定トピックのフルサブスクリプション、効率は低い            | ローカルのサブスクリプションリストに基づくオンデマンド複製 |
| **ルールエンジンとデータ連携**       | 常にメッセージパブリッシュイベントをトリガー                | ローカルのルールエンジンのメッセージパブリッシュイベントはトリガーしない |

## ワークフローと利用シナリオ

本節では、クラスターリンクのワークフローを2つの異なるシナリオで説明します。

### リモートクラスターからローカルクラスターへのメッセージ複製

このシナリオでは、クラスター A をローカルクラスター、クラスター B をリモートクラスターとします。クラスター A はクラスター B からトピック `t/#` と `c/1` を複製する必要があります。

1. **クライアント認証と認可:**
   - クラスター A とクラスター B の両方で、クライアント認証設定に認証情報を追加します。
   - 両クラスターのクライアント ACL に認可設定を追加します。
2. **クラスター A でクラスターリンクを設定:**
   - クラスター B の MQTT アドレスを入力します。
   - 必要な認証情報を提供します。
   - 複製するトピック `t/#` と `c/1` を指定します。
3. **クラスター B でクラスターリンクを設定:**
   - クラスター A の MQTT アドレスを入力します。
   - 必要な認証情報を提供します。
   - トピックの指定は不要（クラスター B はクラスター A からのメッセージを必要としないため）。
4. **相互接続の確立:**
   - クラスター間の接続を確立します。
5. **ルート情報プッシュのブートストラップ（A → B）:**
   - クラスター A からクラスター B へルート情報のプッシュを開始します。
6. **サブスクリプションとメッセージフロー:**
   - クラスター A のクライアントがトピックをサブスクライブします。
   - ルート情報がクラスター A からクラスター B へプッシュされます。
   - クライアントはクラスター B にメッセージをパブリッシュします。
   - メッセージがクラスター B からクラスター A へプッシュされます。
7. **サブスクリプション解除:**
   - クラスター A のクライアントがトピックのサブスクリプションを解除します。
   - クラスター A からクラスター B へのルート情報プッシュを削除します。
8. **完了:** 設定プロセスが完了します。

### 旧クラスターから新クラスターへの移行

このシナリオでは、クラスター A を旧クラスター、クラスター B を新クラスターとします。目的はクラスター A からクラスター B へ全メッセージを完全に複製することです。

1. クラスター A とクラスター B の間に対称的なリンクを設定し、両クラスターでトピックを `#` に設定します。
2. クラスター間の接続を確立します。
3. DNS 変更またはロードバランサーのトラフィック切り替えを実施します。
4. クライアントを新クラスターに移行します。メッセージは中断されませんが、セッションは移行できないため、クライアントは再サブスクライブが必要です。
5. クラスター A をネットワークから切断します。
6. クラスター B で新たな接続を確立し、クライアントは再度アクティブにサブスクリプションを開始します。移行プロセスが完了します。

## 次のステップ

次に、クラスターリンク機能の使用方法と設定方法について、以下のガイドをご参照ください。

- [クラスターリンク クイックスタート](./quick-start.md)
- [クラスターリンクの設定](./configuration.md)
