データレプリカの管理
EMQXクラスターにおいて、耐久ストレージは複数のデータレプリカを通じて高可用性を実現します。ノードがクラッシュした場合でも、クライアントはすぐに新しいノードに接続し、他のノード上のレプリカからデータを復旧できます。本ガイドでは、データレプリケーションの設定方法と耐久ストレージの高可用性を確保する手順を説明します。本ガイドは、新規EMQXクラスターの耐久ストレージ設定と、既存クラスターの耐久ストレージ有効化の2つのシナリオに分かれています。
初期クラスター設定
クラスターの初期設定時には、耐久ストレージの構築方法やデータレプリケーションの開始に影響する複数の設定パラメータがあります。これらのパラメータはランタイムで変更できず、一度耐久ストレージが初期化されると変更は反映されません。
耐久ストレージを初期化する前に、各ノードのEMQXデータディレクトリがローカルファイルシステムを使用していることを確認してください。組み込み耐久ストレージバックエンドは、NFSやSMB/CIFSなどのネットワークファイルシステムをサポートしていません。
レプリケーションファクター
durable_storage.<DB>.replication_factor設定パラメータで制御されるレプリケーションファクターは、クラスター全体で各シャードが持つべきレプリカ数を決定します。デフォルト値は3です。
レプリケーションファクターは奇数に設定することが推奨されます。これは書き込み操作の成功に必要なクォーラムサイズに影響を与えるためです。レプリケーションファクターが高いほど、クラスター全体により多くのデータコピーが分散され、高可用性が向上します。ただし、コンセンサスを得るための通信が増えるため、ストレージおよびネットワークのオーバーヘッドも増加します。
TIP
小規模クラスターでは、レプリケーションファクターは厳密に適用されません。例えば、2ノードクラスターでは、各シャードが両ノードにレプリケートされるため、実質的なレプリケーションファクターは2となり、追加のレプリケーションは不要です。EMQXは冗長性を確保するため、各シャードのレプリカをクラスター内の異なるノードに割り当てます。
シャード数
組み込みの耐久ストレージはシャードに分割されており、それぞれ独立してレプリケートされます。シャード数が多いほど、MQTTメッセージのパブリッシュおよびコンシュームの並列処理が増えます。ただし、各シャードはファイルディスクリプタなどのシステムリソースを消費し、セッションごとに保存されるメタデータの量も増加します。
durable_storage.messages.n_shardsパラメータでシャード数を制御しますが、耐久ストレージが初期化されると固定されます。
サイト数
durable_storage.n_sites設定パラメータは、耐久ストレージの初期化および書き込み受け入れ開始に必要な最小オンラインサイト数を決定します。この最小数に達すると、耐久ストレージは利用可能なサイトに対してシャードを均等に割り当て始めます。
デフォルト値は1であり、各ノードは最初は自分自身をデータストレージの唯一のサイトと見なします。この設定は単一ノードのEMQXクラスターに最適化されています。クラスターが形成されると、最終的に1つのノードの見解が優勢となり、他のノードは保存していたデータを放棄します。
複数ノードのクラスターでは、競合を防ぐためにサイト数を初期クラスターサイズに設定することを推奨します。耐久ストレージが初期化されると、このパラメータは変更できません。
既存クラスターの変更
既存クラスターは、容量や耐久性、クライアントトラフィックの変化、古いノードの廃止と新しいノードへの置き換えなどにより再構成が必要になる場合があります。これは、耐久ストレージのレプリケーションを持つサイトのセットに新しいサイトを追加したり、不要になったサイトを削除したりすることで実現できます。
現在のシャード割り当ては、emqx ctl CLIのdsサブコマンドで確認できます。
$ emqx ctl ds info
SITES:
...
SHARDS:
...サイトの追加
新しいノードがクラスターに参加すると、Site IDが割り当てられ、耐久ストレージに含めることが可能になります。一部のシャードレプリカの責任が新しいサイトに移され、データのレプリケーションが開始されます。
$ emqx ctl ds join all <Site ID>
okクラスターのデータ量によっては、新しいサイトの参加に時間がかかる場合があります。この処理は耐久ストレージの可用性を損なうことはありませんが、サイト間のバックグラウンドデータ転送により一時的にクラスターのパフォーマンスに影響を与える可能性があります。
レプリカセットの変更は耐久的に保存されるため、ノードの再起動やネットワーク分断があっても結果に影響しません。クラスターは最終的に望ましい状態に一貫して到達します。
サイトの削除
サイトの削除は、削除対象のサイトからシャードレプリカの責任を移譲することを伴います。追加と同様に、時間とリソースを要する場合があります。
$ emqx ctl ds leave all <Site ID>
okサイトを削除すると、実効レプリケーションファクターが設定値を下回る可能性があります。例えば、レプリケーションファクターが3で3ノードクラスターのうち1サイトを削除すると、実効レプリケーションファクターは2に低下します。サイトを恒久的に置き換える場合は、古いサイトを廃止する前に新しいサイトを追加するか、両操作を同時に行うことを推奨します。
サイトの割り当て
耐久ストレージレプリカを保持するサイトのセットに対する一連の変更を単一操作で実行できます。
$ emqx ctl ds set-replicas all <Site ID 1> <Site ID 2> ...この方法はサイト間のデータ転送量を最小化しつつ、可能な限りレプリケーションファクターを維持します。
災害からの復旧
災害発生時に効率的に復旧する方法を知ることは、サービス継続性の維持に不可欠です。本節では一般的な災害シナリオからの復旧手順を説明します。
ノードの完全喪失
最も一般的な災害シナリオの一つは、ハードウェアの復旧不能な故障、ディスク破損、人為的ミスなどによりノードが完全に失われることです。
ノードが完全に失われると、クラスターの可用性はある程度損なわれます。これを回復するには、失われたノードのシャードレプリカをクラスター内の他の正常なサイトに再割り当てします。
ノード喪失の認識
まず、ノードがクラスターの一部でなくなったことをクラスターに通知してください。これを行わないと、再割り当て処理が一時的なオフラインとみなし、一部の遷移が無期限に停止する可能性があります。
shell$ emqx ctl cluster force-leave emqx@n2.localシャード遷移の開始
次に、失われたノードのシャードを他のノードに再割り当てして可用性を復元します。標準の
leaveコマンドを使用できます。このコマンドは失われたノードが到達不能でも機能しますが、遷移完了までに時間がかかる場合があります。shell$ emqx ctl ds leave all 5C6028D6CE9459C7 # ここで5C6028D6CE9459C7は失われたノードのSite IDクラスター状態の監視
すべてのシャード遷移が正常に完了するまで待ちます。進行中の遷移は
infoコマンドで確認できます。shell$ emqx ctl ds info <...> SITES: .------------------.-------------------.----------. : Site : Node : Status : :------------------:-------------------:----------: : D8894F95DC86DFDB : 'emqx@n1.local' : up : : 5C6028D6CE9459C7 : 'emqx@n2.local' : (!) LOST : : <...> SHARDS: .------------.----------------------.------------------------. : DB/Shard : Replicas : Transitions : :------------:----------------------:------------------------: :-messages/0-:----------------------:------------------------: : : 5C6028D6CE9459C7 (!) : - 5C6028D6CE9459C7 (!) : : : <...> : + D8894F95DC86DFDB : : <...>次のステップに進む前に、遷移がすべて完了していることを確認してください。
後処理
すべてのシャード遷移が完了したら、失われたサイトが二度と戻らないことをクラスターに通知する必要があります。
shell$ emqx ctl ds forget all 5C6028D6CE9459C7この手順は、失われたノードを元のノード名で新しいノードに置き換える場合に特に重要です。これを行わないと、クラスターが同じノード名を異なるSite IDで認識し、重大な混乱や問題を引き起こす可能性があります。