# クラスター

単一のEMQXノードで動作させる以外に、EMQXはネイティブに分散クラスターアーキテクチャをサポートしており、多数のクライアントとメッセージを処理しながら、高可用性、フォールトトレランス、スケーラビリティを確保できます。EMQXクラスターを利用することで、1つ以上のノードが障害を起こしてもクラスター全体が継続して稼働できるため、フォールトトレランスと高可用性のメリットを享受できます。

::: tip Note

クラスタリング機能はトライアル期間中に利用可能ですが、トライアル期間終了後は商用ライセンスの購入が必要です。有効な商用ライセンスがない場合、トライアル期間終了後にクラスタリング機能は無効化されます。

:::

本章では、[クラスタリングのメリット](#reasons-for-clustering)、新しい[MriaおよびRLOG](./mria-introduction.md)アーキテクチャ、[クラスタの手動・自動作成方法](./create-cluster.md)、[ロードバランシングの実装方法](./lb.md)、およびクラスタ内の[通信セキュリティ確保](./security.md)について紹介します。

## クラスタリングのメリット

EMQXクラスターは大規模またはミッションクリティカルなアプリケーションに推奨され、以下の利点をもたらします。

- **スケーラビリティ**：EMQXはクラスターにノードを追加することで水平スケールが容易になり、増加するMQTTメッセージやクライアント数に対応可能です。
- **高可用性**：クラスターで稼働することで、1つ以上のノードが障害を起こしてもクラスター全体は機能し続けます。EMQXは単一障害点を排除する分散アーキテクチャを採用しています。
- **ロードバランシング**：クラスター内のEMQXノードはMQTTメッセージ処理の負荷を分散でき、単一ノードの過負荷を防ぎ、リソースの有効活用を促進します。
- **集中管理**：クラスター内のすべてのノードは単一の管理コンソールから監視・制御でき、大規模なデバイスやメッセージの管理が容易になります。
- **データの一貫性とセキュリティ**：クラスターはすべてのノード間でデータを複製し、データの一貫性とセキュリティを確保します。

## EMQXのクラスタリングの仕組み

分散EMQXクラスターの基本機能は、異なるサブスクライバーにメッセージを転送およびパブリッシュすることです。以前のバージョンでは、EMQXはErlang/OTP組み込みのデータベースであるMnesiaを使用してMQTTセッション状態を保存していました。データベースのレプリケーションチャネルは「Erlang distribution」プロトコルにより実現されており、各ノードはクライアント兼サーバーとして機能します。このプロトコルのデフォルトのリスニングポート番号は4370です。



<img src="./assets/mnesia-cluster.png" alt="mnesia-cluster" style="zoom: 33%;" />



しかし、フルメッシュトポロジーはクラスターサイズに実用的な制限を課します。EMQX 5未満のバージョンでは、クラスターサイズを5ノード未満に保つことが推奨されます。これを超える場合は、より高性能なマシンを使う垂直スケーリングがクラスターの性能と安定性を維持するために望ましい選択肢です。当社のベンチマーク環境では、[EMQX Enterprise 4.3で1000万同時接続を達成](https://www.emqx.com/en/resources/emqx-v-4-3-0-ten-million-connections-performance-test-report)しています。

より優れたクラスターのスケーラビリティ性能を提供するため、EMQX 5.0では新しい[Mriaクラスターアーキテクチャ](./mria-introduction.md)を採用しています。このMriaアーキテクチャにより、1つのEMQXクラスターで最大1億の同時MQTT接続をサポート可能です。



<img src="./assets/EMQX_cluster.png" alt="EMQX_cluster" style="zoom:30%;" />



EMQXのクラスタリングの仕組みをより深く理解するには、[EMQXクラスタリング](../../design/clustering.md)を参照してください。

::: tip Note

厳密な上限はありませんが、EMQXオープンソース版ではクラスターサイズを3ノードに制限することを推奨します。コアタイプノードのみを使用する場合、小規模なクラスターの方が安定性が高い傾向にあります。

:::

## 主な機能

EMQXは分散Erlangの上に[Ekka](https://github.com/emqx/ekka)ライブラリによる抽象化レイヤーを追加し、EMQXノードの自動検出、自動クラスタリング、ネットワークパーティションの自動復旧（autoheal）、自動クリーンアップ（autoclean）などの機能を実現しています。

### ノード検出と自動クラスタリング

EMQXは複数のノード検出戦略をサポートしています。

| 戦略       | 説明                                   |
| ---------- | ------------------------------------- |
| `manual`   | コマンドで手動でクラスターを作成する |
| `static`   | 静的ノードリストによる自動クラスタリング |
| `DNS`      | DNSのAおよびSRVレコードによる自動クラスタリング |
| `etcd`     | etcdによる自動クラスタリング         |
| `k8s`      | Kubernetesによる自動クラスタリング   |

### ネットワークパーティションの自動復旧

ネットワークパーティションの自動復旧は、EMQXがネットワークパーティションから手動介入なしに自動的に回復する機能であり、ダウンタイムが許容できないミッションクリティカルな用途に適しています。

ネットワークパーティション自動復旧機能（`cluster.autoheal`）はデフォルトで有効です。この機能により、EMQXはクラスター内のノード間の接続状態を継続的に監視します。

```bash
cluster.autoheal = true
```

ネットワークパーティションが検出されると、EMQXは影響を受けたノードを隔離し、残りのノードで稼働を続けます。ネットワークパーティションが解消されると、隔離されたノードは自動的にクラスターに再統合されます。

### クラスター内ノードの自動クリーンアップ

クラスター内ノードの自動クリーンアップ機能は、切断されたノードを設定された時間経過後に自動的にクラスターから削除します。この機能によりクラスターの効率的な稼働が維持され、時間経過による性能劣化を防ぎます。

この機能はデフォルトで有効であり、切断ノード削除までの待機時間をカスタマイズ可能です。デフォルトは`24h`です。

```bash
cluster.autoclean = 24h
```

### ノード間セッション共有

ノード間セッション共有機能は、クライアントの切断時にもセッションが失われないことを保証します。

この機能を利用するには：

- MQTT 3.xクライアントの場合、`clean_start`を`false`に設定します。
- MQTT 5.0クライアントの場合、`clean_start`を`false`にし、`session_expiry_interval`を0より大きい値に設定します。

これにより、クライアントが切断した際にクライアントIDに紐づく以前のセッションデータが保持されます。クライアントが再接続すると、EMQXは前回のセッションを再開し、切断中にキューイングされたメッセージを配信し、クライアントのサブスクリプションを維持します。

## ネットワーク要件

EMQXクラスターを最適に運用するためには、ネットワークレイテンシが10ミリ秒未満であることが望ましいです。レイテンシが100ミリ秒を超える場合、クラスターは利用できません。

コアノードは同一のプライベートネットワーク内に配置する必要があります。Mria+RLOGモードでは、レプリカントノードも同一プライベートネットワーク内に配置することが推奨されます。
