# 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 の両方のクライアント認証設定に認証情報を追加します。
   - クラスター 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)
- [クラスターリンクのセキュリティ](./security.md)
