Skip to content

Durable Sessions の設定と管理 ​

本ドキュメントでは、EMQX における MQTT Durable Sessions 機能の設定、管理、および最適化に関するリファレンスと手順を提供します。セッションおよびストレージの設定も含まれます。

設定パラメータ ​

MQTT Durable Sessions の設定は主に以下の2つのカテゴリに分かれています。

  • durable_sessions:MQTT クライアントのセッションに関する設定で、耐久ストレージからのデータ消費方法やデータ保持パラメータを含みます。
  • durable_storage:MQTT メッセージデータを保持する耐久ストレージシステムの設定を管理します。

Durable Sessions の設定 ​

Dashboard で Durable Sessions のパラメータを設定できます。Dashboard の左メニューから Management -> MQTT Settings をクリックし、Durable Session タブを選択してパラメータを設定してください。

ダッシュボードのセッション設定
パラメータDashboard UI 表示名説明
durable_sessions.enableEnable Durable Sessionsセッションの耐久性を有効化します。この設定は Dashboard、REST API、CLI から変更できず、設定ファイルでのみ指定可能です。変更を反映するには EMQX ノードの再起動が必要です。
durable_sessions.message_retention_periodMessage Retention PeriodDurable Sessions 内の MQTT メッセージの保持期間を定義します。注意:このパラメータはグローバル設定です。
durable_sessions.batch_sizeMessage Query Batch SizeDurable Sessions がストレージから消費するメッセージのバッチ最大サイズを制御します。
durable_sessions.checkpoint_intervalSession Checkpoint Intervalセッションメタデータを保存する間隔を指定します。

以下のパラメータは ゾーンごとに上書き可能です。

  • durable_sessions.enable
  • durable_sessions.batch_size
  • durable_sessions.checkpoint_interval

Durable Storage の設定 ​

<DS> プレースホルダーは「durable storage(耐久ストレージ)」を表します。現在、利用可能な <DS> パラメータは message です。

コア Durable Storage パラメータ ​

パラメータ説明
durable_storage.n_sitesサイト数を指定します。
durable_storage.<DS>.data_dirEMQX がデータを保存するファイルシステム上のディレクトリです。
durable_storage.<DS>.n_shardsシャード数を指定します。
durable_storage.<DS>.replication_factorレプリケーションファクターは各シャードのレプリカ数を決定します。
durable_storage.<DS>.transactionメッセージのバッファリングに関するパラメータを含みます。詳細は バッファリング を参照してください。
durable_storage.<DS>.layoutEMQX がディスク上にデータを配置する方法を制御するパラメータを含みます。詳細は ストレージレイアウトの設定 を参照してください。

データベースグループの設定 ​

EMQX 6.0.2 以降、Durable Storage はノードレベルのリソースガバナンスをサポートするために データベースグループを導入しました。データベースグループにより、複数の耐久ストレージデータベースを論理データモデルを変更せずに共有リソース制限のもとで一括管理できます。

デフォルトでは、各耐久ストレージデータベースは自身の名前を持つデータベースグループに属し、そのグループにはその単一のデータベースのみが含まれ、従来の動作を維持しています。

データベースグループは durable_storage.db_groups ネームスペースで設定します。

パラメータ説明
durable_storage.db_groups.<group>.storage_quotaグループの SST ファイル合計ディスク使用量のソフトクォータです。
durable_storage.db_groups.<group>.write_buffer_sizeグループの RocksDB メモリテーブルの最大合計サイズです。
durable_storage.db_groups.<group>.rocksdb_nthreads_high高優先度 RocksDB バックグラウンドスレッド数です。
durable_storage.db_groups.<group>.rocksdb_nthreads_low低優先度 RocksDB バックグラウンドスレッド数です。

バッファリング ​

EMQX はクライアントからの MQTT メッセージを耐久ストレージにバッチ単位で書き込み、スループットを最大化します。
バッチングは durable_storage.<DS>.transaction 設定サブツリーの以下のパラメータで制御します。

パラメータ説明
max_pending指定したメッセージ数に達したらバッファをフラッシュします。
flush_intervalバッファに1件以上のメッセージがある場合、この時間間隔でフラッシュします。
idle_flush_interval新しいメッセージがこの間隔内に到着しなければ早期にバッファをフラッシュします。

ストレージレイアウトの設定 ​

ストレージレイアウトは EMQX がディスク上にデータをどのように配置するかを決定します。
durable_storage.<DS>.layout.type パラメータを設定することで、新しい 世代で使用されるレイアウトを変更できます。この変更は既存の世代には影響しません。
各レイアウトタイプの設定は durable_storage.<DS>.layout サブツリーに含まれます。現在は wildcard_optimized レイアウトタイプが利用可能です。

wildcard_optimized レイアウトタイプの設定 ​

wildcard_optimized レイアウトは、多数の MQTT トピックに対するワイルドカードサブスクライブのマッチングを最適化することを目的としています。
時間をかけてトピック構造に関する知識を自律的に蓄積し、軽量な機械学習アルゴリズムを活用して、クライアントがサブスクライブしそうなワイルドカードトピックフィルターを予測します。
その後、これらのトピックを統合されたストリームに編成し、一度のスイープで効率的に消費できるようにします。

パラメータ説明
bytes_per_topic_levelトピックレベルハッシュのサイズを決定します。
topic_index_bytesストリーム識別子のバイト数を指定します。

CLI コマンド ​

耐久ストレージの管理に利用できる CLI コマンドは以下の通りです。

emqx ctl ds info ​

耐久ストレージの状態概要を表示します。

例:

bash
$ emqx ctl ds info

THIS SITE:
D8894F95DC86DFDB

SITES:
.------------------.-------------------.----------.
: Site             : Node              : Status   :
:------------------:-------------------:----------:
: 5C6028D6CE9459C7 : 'emqx@n2.local'   : up       :
: D8894F95DC86DFDB : 'emqx@n1.local'   : up       :
: F4E92DEA197C8EBC : 'emqx@n3.local'   : (x) down :
`------------------`-------------------`----------`

SHARDS:
.-------------.------------------.-------------.
: DB/Shard    : Replicas         : Transitions :
:-------------:------------------:-------------:
:-messages/0--:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/1--:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/10-:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/11-:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/12-:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/2--:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/3--:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/4--:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/5--:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/6--:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/7--:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/8--:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
:-messages/9--:------------------:-------------:
:             : 5C6028D6CE9459C7 :             :
`-------------`------------------`-------------`

このコマンド出力には以下が含まれます:

  • THIS SITE:ローカル EMQX ノードが所有するサイトの ID。
  • SITES:既知のすべてのサイトのリスト。EMQX ノード名とそのステータスを含みます。
  • SHARDS:耐久ストレージのシャードと、そのレプリカが配置されているサイト ID のリスト。

emqx ctl ds set-replicas all <site1> <site2> ... ​

このコマンドは、クラスター内で耐久ストレージのレプリカを保持するサイトのリストを設定します。
実行すると、シャードをサイト間で公平に割り当てる操作計画を作成し、バックグラウンドでその実行を続けます。

重要なお知らせ

耐久ストレージのレプリカリストの更新は、大量のデータをサイト間でコピーする可能性があるためコストがかかる場合があります。

例:

bash
$ emqx ctl ds set-replicas all 5C6028D6CE9459C7 D8894F95DC86DFDB F4E92DEA197C8EBC
ok

このコマンド実行後、ds info の出力例は以下のようになる場合があります。

bash
$ emqx ctl ds info

THIS SITE:
D8894F95DC86DFDB

SITES:
.------------------.-------------------.----------.
: Site             : Node              : Status   :
:------------------:-------------------:----------:
: 5C6028D6CE9459C7 : 'emqx@n2.local'   : up       :
: D8894F95DC86DFDB : 'emqx@n1.local'   : up       :
: F4E92DEA197C8EBC : 'emqx@n3.local'   : up       :
`------------------`-------------------`----------`

SHARDS:
.-------------.------------------.--------------------.
: DB/Shard    : Replicas         : Transitions        :
:-------------:------------------:--------------------:
:-messages/0--:------------------:--------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             : D8894F95DC86DFDB :                    :
:-messages/1--:------------------:--------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             : D8894F95DC86DFDB :                    :
:-messages/10-:------------------:--------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             :                  : + D8894F95DC86DFDB :
:-messages/11-:------------------:-------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             : D8894F95DC86DFDB :                    :
:-messages/2--:------------------:--------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             : D8894F95DC86DFDB :                    :
:-messages/3--:------------------:--------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             :                  : + D8894F95DC86DFDB :
:-messages/4--:------------------:-------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             : D8894F95DC86DFDB :                    :
:-messages/5--:------------------:--------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             : D8894F95DC86DFDB :                    :
:-messages/6--:------------------:--------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             :                  : + D8894F95DC86DFDB :
:-messages/7--:------------------:-------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             : D8894F95DC86DFDB :                    :
:-messages/8--:------------------:--------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             : D8894F95DC86DFDB :                    :
:-messages/9--:------------------:--------------------:
:             : 5C6028D6CE9459C7 : + F4E92DEA197C8EBC :
:             :                  : + D8894F95DC86DFDB :
`-------------`------------------`--------------------`

新たに追加された REPLICA TRANSITIONS セクションは保留中の操作を示します。すべての操作が完了すると、このリストは空になります。

emqx ctl ds join all <site> / emqx ctl ds leave all <site> ​

これらのコマンドは、耐久ストレージのレプリカサイトリストにサイトを追加または削除します。
set_replicas コマンドと似ていますが、一度に1サイトずつ更新します。

例:

bash
$ emqx ctl ds join all B2A7DBB2413CD6EE
ok

詳細は Add Sites および Remove Sites を参照してください。

REST API ​

組み込みの Durable Sessions の管理および監視に利用できる REST API エンドポイントは以下の通りです。

  • /ds/sites:既知のサイト一覧を取得します。
  • /ds/sites/:site:サイトの情報(ステータス、現在そのサイトを管理している EMQX ノード名など)を取得します。
  • /ds/storages:耐久ストレージの一覧を取得します。
  • /ds/storages/:ds:耐久ストレージおよびそのシャードの情報を取得します。
  • /ds/storages/:ds/replicas:耐久ストレージのレプリカを保持するサイトの一覧取得および更新を行います。
  • /ds/storages/:ds/replicas/:site:特定サイトの耐久ストレージレプリカの追加または削除を行います。

詳細は EMQX OpenAPI スキーマを参照してください。

メトリクス ​

Durable Sessions に関連する Prometheus メトリクスは以下の通りです。

emqx_ds_egress_batches ​

耐久ストレージへのメッセージバッチ書き込みが成功するたびにインクリメントされます。

emqx_ds_egress_messages ​

耐久ストレージに正常に書き込まれたメッセージ数をカウントします。

emqx_ds_egress_bytes ​

耐久ストレージに正常に書き込まれたペイロードデータの合計バイト数をカウントします。
注意:このメトリクスはメッセージペイロードのみを対象としているため、実際の書き込みデータ量はこれより大きい場合があります。

emqx_ds_egress_batches_failed ​

耐久ストレージへの書き込みが何らかの理由で失敗した場合にインクリメントされます。

emqx_ds_egress_flush_time ​

耐久ストレージへのバッチ書き込みに要した時間(μs)のローリング平均です。レプリケーション速度の重要な指標です。

emqx_ds_store_batch_time ​

ローカルの RocksDB ストレージへのバッチ書き込みに要した時間(μs)のローリング平均です。
emqx_ds_egress_flush_time と異なり、ネットワークレプリケーションコストを除外しているため、ディスク I/O 効率の重要な指標となります。

emqx_ds_builtin_next_time ​

耐久ストレージからメッセージバッチを消費するのに要した時間(μs)のローリング平均です。

emqx_ds_storage_bitfield_lts_counter_seek および emqx_ds_storage_bitfield_lts_counter_next ​

これらのカウンターは「wildcard optimized」ストレージレイアウトに特有のもので、ローカルストレージからのデータ消費効率を測定します。
seek 操作は一般的に遅いため、emqx_ds_storage_bitfield_lts_counter_next の増加速度が seek より速いことが望ましいです。

durable_storage.messages.layout.epoch_bits パラメータを増やすことで、この比率の改善が期待できます。

emqx_ds_raft_db_shards_num ​

データベースが分割されているシャード数です。

emqx_ds_raft_db_sites_num ​

DS DB がレプリケートされている現在および割り当てられたサイト数を追跡するゲージです。

通常、現在のサイト数は割り当てられたサイト数と等しいはずです。長期間異なる場合は、レプリカ転送に問題がある可能性があります。

emqx_ds_raft_shard_replication_factor ​

DS DB シャードのレプリカセット内のレプリカ数を追跡します。

この数が設定されたレプリケーションファクターを下回ると耐久性が危険にさらされます。より多くのサイトにレプリカを再配置することを検討してください。

emqx_ds_raft_db_shards_online_num ​

このノードでアクティブに管理されている DS DB シャード数を追跡します。

この数は現在このノードに割り当てられているシャード数と等しいはずです。異なる場合は可用性に問題がある可能性があります。ログを確認してください。

emqx_ds_raft_shard_transition_queue_len ​

DS DB シャードの保留中のレプリカセット遷移数を追跡します。

この数が長期間ゼロでない場合、レプリカ転送に問題があります。

emqx_ds_raft_shard_transitions ​

DB シャードのレプリカセット遷移の開始/完了/スキップ/クラッシュ数をカウントします。

クラッシュした遷移は常にゼロであるべきです。そうでない場合はログのエラーを確認してください。

emqx_ds_raft_shard_transition_errors ​

DB シャードのレプリカセット遷移のオーケストレーション中に発生した一時的なエラー数をカウントします。

このカウンターが増加する場合、レプリカ転送に問題があります。ログのエラーを確認してください。

emqx_ds_raft_snapshot_reads ​

シャードがスナップショットレプリケーションのソースであった際のスナップショット読み取りの開始/完了数をカウントします。

emqx_ds_raft_snapshot_read_errors ​

スナップショット読み取り中に発生し、スナップショットレプリケーションが中止されたエラー数をカウントします。

エラーは通常発生しません。ログで原因を調査してください。

emqx_ds_raft_snapshot_read_chunks ​

スナップショット転送のソース DS DB シャードで読み取られ、その後受信先に転送された個別チャンク数をカウントします。

emqx_ds_raft_snapshot_read_chunk_bytes ​

ソース DS DB シャードでチャンクとして読み取られたバイト数をカウントします。

emqx_ds_raft_snapshot_writes ​

シャードがスナップショットレプリケーションの受信先であった際のスナップショット書き込みの開始/完了数をカウントします。

emqx_ds_raft_snapshot_write_errors ​

スナップショット書き込み中に発生し、スナップショットレプリケーションが中止されたエラー数をカウントします。

こちらも増加は想定されません。詳細はログを確認してください。

emqx_ds_raft_snapshot_write_chunks ​

ソース DS DB シャードから受信し、受信先に書き込まれた個別チャンク数をカウントします。

emqx_ds_raft_snapshot_write_chunk_bytes ​

受信先 DS DB シャードでチャンクとして書き込まれたバイト数をカウントします。

emqx_ds_raft_current_timestamp_us ​

シャードサーバーが現在レプリケートしている最新の操作タイムスタンプ(マイクロ秒単位)を追跡します。

通常、各レプリカは同じタイムスタンプを持つべきです。異なる場合はレプリケーションに問題があります。

emqx_ds_raft_rasrv_state_changes ​

Raft サーバーが候補者/フォロワー/リーダーに状態変化した回数をカウントします。

頻繁な状態変化は不安定の兆候です。ログを確認してください。

データベースグループメトリクス ​

以下の Prometheus メトリクスは耐久ストレージのデータベースグループにおけるノードレベルの可視性を提供します。

emqx_ds_disk_usage ​

グループ内のすべてのデータベースが使用する SST ファイルの合計サイズです。

emqx_ds_write_buffer_memory_usage ​

グループが使用する RocksDB メモリテーブルの合計メモリ使用量です。

emqx_ds_total_trash_size ​

削除待ちの不要な SST ファイルのディスク使用量です。

これらのメトリクスはノード単位およびデータベースグループ単位で報告されます。クラスター環境では、運用者が外部で集約し、クラスター全体の容量を評価することが可能です。