Skip to content

クラスターアーキテクチャ

EMQX 5.0から、新しいMriaクラスターアーキテクチャが導入され、データレプリケーション機構も再設計されました。これによりEMQXの水平スケーラビリティが大幅に向上し、単一のEMQX 5.0クラスターで最大1億のMQTT接続をサポート可能となった重要な要素の一つです。

本ページでは、新アーキテクチャに基づくEMQXクラスターの展開モデルと、展開時の主な考慮点について紹介します。自動化されたクラスター展開については、EMQX Kubernetes OperatorおよびEMQXコアノードとレプリカントノードの設定のガイドを参照してください。

前提知識

まずはEMQXクラスタリングをお読みになることを推奨します。

Mriaアーキテクチャ概要

MriaはErlangのネイティブデータベースであるMnesiaのオープンソース拡張であり、最終的整合性を実現したデータレプリケーションを可能にします。非同期トランザクションログレプリケーションが有効になると、ノード間接続のトポロジーはMnesiaのフルメッシュモデルからMriaのメッシュ+スターハイブリッドトポロジーに変わります。

EMQX Mria

ノードの役割説明

クラスター内のノードは、コアノードとレプリカントノードの2つの役割に分類されます。

コアノード

コアノードはクラスターのフルメッシュ型データレイヤーを形成します。各コアノードは完全かつ最新のデータレプリカを保持し、フォールトトレランスを確保します。つまり、1つでもコアノードが稼働していればデータは失われません。コアノードは基本的に静的かつ永続的であり、頻繁に追加・削除・置換されるオートスケーリングには推奨されません。

レプリカントノード

レプリカントノードはコアノードに接続し、そこからのデータ更新を受動的にレプリケートします。書き込み操作は許可されず、すべての書き込みはコアノードに転送され処理されます。ローカルに完全なデータコピーを持つため、レプリカントは高速な読み取りアクセスと低いルーティングレイテンシを提供します。

Mriaアーキテクチャの利点

Mriaアーキテクチャはリーダーレスレプリケーションとマスター・スレーブレプリケーションの長所を組み合わせ、以下のような利点をもたらします。

  • 水平スケーラビリティの向上:EMQX 5.0は最大23ノードの大規模クラスターをサポートします。
  • クラスターのオートスケーリングが簡素化:レプリカントノードは動的に追加・削除でき、自動スケーリングに対応します。

EMQX 4.xではすべてのノードがフルメッシュ接続であったため、ノード数増加に伴い同期オーバーヘッドが増大していましたが、EMQX 5.0ではレプリカントノードを読み取り専用にすることでこの問題を回避しています。レプリカントが増えても書き込み効率は低下せず、より大規模なクラスター形成が可能です。

さらに、レプリカントノードは使い捨て可能でスケールイン・アウトが容易な設計となっており、オートスケーリンググループに最適でDevOpsの効率化にも寄与します。

注意:データセットが大きくなると、コアノードから新しいレプリカントへの初期データ同期に多くのリソースを要する場合があります。レプリカントノードのオートスケーリングポリシーは過度に積極的にしないよう注意してください。

展開アーキテクチャ

デフォルトではすべてのノードがコアノードの役割を担い、クラスターはEMQX 4.xと同様の動作をします。これは7ノード以下の小規模クラスターに推奨される構成です。コア+レプリカントモードはクラスターが7ノードを超える場合にのみ推奨されます。

注意

コア+レプリカントクラスターアーキテクチャはEMQX Enterprise版のみで利用可能です。オープンソース版はコアノードのみのクラスターをサポートします。

推奨

クラスターには最低1つのコアノードを含める必要があります。ベストプラクティスとして、3つのコアノード+N個のレプリカントノードで開始することを推奨します。

ノードの役割割り当ては実際のビジネス要件と想定されるクラスター規模に基づいて行うべきです。

シナリオ推奨展開
小規模クラスター(7ノード以下)コアノードのみで十分。すべてのノードがMQTTトラフィックを処理。
中規模クラスターコアノードがMQTTトラフィックを処理するかはワークロード次第。テスト推奨。
大規模クラスター(10ノード以上)コアノードはデータベース層のみ担当。MQTTトラフィックはレプリカントノードが処理し、安定性とスケーラビリティを最大化。

コア+レプリカントモードの有効化

コア+レプリカントモードを有効にするには、特定のノードをレプリカントノードとして指定する必要があります。これはnode.roleパラメータをreplicantに設定することで実現します。加えて、自動クラスターディスカバリ戦略cluster.discovery_strategy)を有効にする必要があります。

TIP

レプリカントノードはmanualディスカバリ戦略を使用してコアノードを検出できません。

設定例:

bash
node {
    ## ノードをレプリカントノードとして設定する場合:
    role = replicant
}
cluster {
    ## 静的ディスカバリ戦略を有効化:
    discovery_strategy = static
    static.seeds = [emqx@host1.local, emqx@host2.local]
}

ネットワークおよびハードウェア要件

ネットワーク

  • コアノード間のネットワークレイテンシは10ms未満が望ましい。100msを超えるとクラスター障害の原因となる可能性があります。
  • コアノードは同一プライベートネットワーク内に配置することを強く推奨します。
  • レプリカントノードもコアノードと同じプライベートネットワークに配置すべきですが、ネットワーク品質の要件はやや緩やかです。

CPUおよびメモリ

コアノードはメモリを多く必要としますが、クライアント接続を処理していない場合のCPU使用率は比較的低いです。レプリカントノードはEMQX 4.xと同様のハードウェアサイズを想定し、接続数とメッセージスループットに応じてメモリ要件を見積もってください。

監視とデバッグ

MriaのパフォーマンスはPrometheusメトリクスまたはErlangコンソールで監視可能です。

Prometheus指標

Prometheusと連携してクラスターの動作を監視できます。連携方法についてはログと可観測性 - Prometheus連携を参照してください。

コアノード

指標名説明
emqx_mria_last_intercepted_transノード起動以降にシャードが受信したトランザクション数
emqx_mria_weightコアノードの瞬間的な負荷
emqx_mria_replicantsコアノードに接続しているレプリカントノード数(シャードごとに集計)
emqx_mria_server_mqlレプリカントノードに送信待ちのトランザクション数。少ないほど良い。
この指標が増加傾向にある場合はコアノードの増設が必要。

レプリカントノード

指標名説明
emqx_mria_lagレプリカントが上流のコアノードにどれだけ遅れているかを示す。少ないほど良い。
emqx_mria_bootstrap_timeレプリカントノードの起動時間。正常稼働時は安定しているべき値。
emqx_mria_bootstrap_num_keys起動時にコアノードからコピーされたデータベースレコード数。正常稼働時は安定しているべき値。
emqx_mria_message_queue_lenメッセージレプリケーション時のキュー長。0付近が望ましい。
emqx_mria_replayq_lenレプリカントノード内部のリプレイキュー長。少ないほど良い。

コンソールコマンド

Erlangコンソール上でemqx eval 'mria_rlog:status().'コマンドを実行してクラスターの稼働状況を監視できます。

EMQXクラスターが正常に稼働している場合、現在のログレベル、処理済みメッセージ数、ドロップされたメッセージ数などのステータス情報が一覧表示されます。

参照:Mriaログとアラーム