10.2. デフォルトのファイルジャーナルを使用したメッセージングジャーナルの永続化

JBoss EAP メッセージングには、メッセージング向けに最適化された高パフォーマンスのファイルベースのジャーナルが備わっています。

JBoss EAP メッセージングジャーナルのファイルには設定可能なファイルサイズがあります。また、このジャーナルは、追加のみ可能です。このように単一の書き込み操作を有効にすることでパフォーマンスが向上します。これは、ディスク上の 1 組のファイルで設定されます。このファイルは、最初に固定サイズで事前作成され、パディングが書き込まれます。メッセージの追加、削除、更新などのサーバーオペレーションが実行されると、ジャーナルファイルが満杯になるまで、オペレーションの記録が追加されます。満杯になると、次のジャーナルファイルが使用されます。

すべてのデータが削除された場合、高度なガベージコレクションアルゴリズムにより、ジャーナルファイルを回収して再利用できるかどうかが決定されます。圧縮アルゴリズムにより、ジャーナルファイルから不要な領域が削除され、データが圧縮されます。

またジャーナルは、ローカルトランザクションと XA トランザクションの両方に完全に対応しています。

10.2.1. メッセージングジャーナルファイルシステムの実装

ジャーナルの大半は Java で記述されていますが、ファイルシステムとのやりとりは抽象化されており、さまざまなプラグ可能な実装が可能となります。JBoss EAP メッセージングには次の 2 つの実装が標準装備されています。

Java New I/O (NIO)
この実装は、ファイルシステムとのインターフェイスに標準の Java NIO を使用します。これにより非常に優れたパフォーマンスを実現できます。また、Java 6 以降のランタイムを備えたプラットフォーム上で稼働します。JBoss EAP 7 には Java 8 が必要となります。NIO は JBoss EAP がサポートするオペレーティングシステムで使用できます。
Linux Asynchronous IO (ASYNCIO)

これを実装する場合は、ネイティブコードラッパーを使用して Linux 非同期 IO ライブラリー (ASYNCIO) と通信をします。これを実装すると、明示的に同期をする必要がなくなります。通常 ASYNCIO は Java NIO よりもパフォーマンスが良好です。

使用中のジャーナルタイプを確認するには、以下の CLI 要求を発行します。

/subsystem=messaging-activemq/server=default:read-attribute(name=runtime-journal-type)

システムは、以下のいずれかの値を返します。

表10.1 ジャーナルタイプの戻り値

戻り値説明

NONE

永続性が無効

NIO

Java NIO が使用中

ASYNCIO

libaio を使用した AsyncIO が使用中

DATABASE

JDBC 永続性が使用中

以下のファイルシステムは、libaio ネイティブを使用している場合、Red Hat Enterprise Linux 6、Red Hat Enterprise Linux 7、および Red Hat Enterprise Linux 8 のみでテストされ、サポートされています。これらは他のオペレーティングシステムではテストされておらず、サポートされていません。

  • EXT4
  • XFS
  • NFSv4
  • GFS2

以下の表は、libaio ネイティブありとなしの両方で、サポートの有無をテストされた HA 共有ストアファイルシステムを示しています。

オペレーティングシステムファイルシステムlibaio ネイティブを使用したサポート
(journal-type="ASYNCIO")
libaio ネイティブを使用しないサポート
(journal-type="NIO")

Red Hat Enterprise Linux 6

NFSv4

あり

あり

Red Hat Enterprise Linux 7 以降

NFSv4

あり

あり

Red Hat Enterprise Linux 6

GFS2

あり

なし

Red Hat Enterprise Linux 7 以降

GFS2

あり

なし

10.2.2. 標準メッセージングジャーナルファイルシステムインスタンス

標準の JBoss EAP メッセージングコアサーバーでは、以下のジャーナルインスタンスを使用します。

バインディングジャーナル

このジャーナルは、サーバーにデプロイされた一連のキューと属性を含むバインディング関連のデータを格納するために使用されます。また、ID シーケンスカウンターなどのデータも格納します。

バインディングジャーナルは常に NIO ジャーナルであり、通常はメッセージジャーナルと比べて低スループットです。

このジャーナルのファイルには activemq-bindings という接頭辞が付けられます。各ファイルには bindings 拡張子があります。ファイルサイズは 1048576 で、バインディングフォルダーにあります。

JMS ジャーナル

このジャーナルインスタンスは、JMS キュー、トピック、接続ファクトリー、ならびにこれらのリソースに対する JNDI バインディングなどの JMS 関連のデータをすべて格納します。

管理 API で作成されたすべての JMS リソースは、このジャーナルに永続化されます。設定ファイルで設定したリソースは一切、このジャーナルに永続化されません。JMS ジャーナルは、JMS が使用中の場合のみ作成されます。

このジャーナルのファイルには activemq-jms という接頭辞が付けられます。各ファイルには jms 拡張子があります。ファイルサイズは 1048576 で、バインディングフォルダーにあります。

メッセージジャーナル

このジャーナルインスタンスは、メッセージ自体と duplicate-id キャッシュを含むすべてのメッセージ関連のデータを格納します。

デフォルトでは、JBoss EAP メッセージングは ASYNCIO ジャーナルの使用を試みます。ASYNCIO が利用できない場合 (たとえば、プラットフォームが正しいカーネルバージョンの Linux ではない、または ASYNCIO がインストールされていない場合など)、Java プラットフォームで利用可能な Java NIO を使用するように自動的にフォールバックします。

このジャーナルのファイルには activemq-data という接頭辞が付けられます。各ファイルには amq 拡張子があります。ファイルサイズはデフォルトで 10485760 (設定可能) で、ジャーナルフォルダーにあります。

大きなメッセージは、JBoss EAP メッセージングによりメッセージジャーナル外部で永続化されます。詳細は、大きなメッセージ のセクションを参照してください。

メモリーが少なくなった場合に、JBoss EAP メッセージングがメッセージをディスクにページングするように設定することも可能です。詳細は、ページング のセクションを参照してください。

永続性が全く必要ない場合、JBoss EAP メッセージングは、ゼロ永続化の JBoss EAP メッセージングの設定 のセクションで説明されているように、ストレージに一切のデータを永続化しないように設定することもできます。

10.2.3. バインディングジャーナルと JMS ジャーナルの設定

バインディングジャーナルと JMS ジャーナルは設定を共有しているため、以下の 1 つの管理 CLI コマンドで現在の両方の設定を読み取ることができます。出力も、デフォルト設定を強調表示するように組み込まれています。

/subsystem=messaging-activemq/server=default/path=bindings-directory:read-resource

{
    "outcome" => "success",
    "result" => {
        "path" => "activemq/bindings",
        "relative-to" => "jboss.server.data.dir"
    }
}

ジャーナルへの path のデフォルトは activemq/bindings であることに注意してください。以下の管理 CLI コマンドを使用すると path の場所を変更できます。

/subsystem=messaging-activemq/server=default/path=bindings-directory:write-attribute(name=path,value=PATH_LOCATION)

また、上記の出力の relative-to 属性にも注意してください。relative-to が使用された場合、path 属性の値は、relative-to で指定されたファイルパスに対する相対値とみなされます。デフォルト値は JBoss EAP プロパティーの jboss.server.data.dir です。スタンドアロンサーバーの場合、jboss.server.data.dirEAP_HOME/standalone/data にあります。ドメインの場合、各サーバーには EAP_HOME/domain /servers の下に独自の serverX/data/activemq ディレクトリーがあります。以下の管理 CLI コマンドを使用すると relative-to の値を変更できます。

/subsystem=messaging-activemq/server=default/path=bindings-directory:write-attribute(name=relative-to,value=RELATIVE_LOCATION)

デフォルトでは、JBoss EAP は、バインディングディレクトリーが存在しなければ自動的に作成するように設定されています。以下の管理 CLI コマンドを使用して、この動作を切り替えます。

/subsystem=messaging-activemq/server=default:write-attribute(name=create-bindings-dir,value=TRUE/FALSE)

valuetrue に設定するとディレクトリーの自動作成が有効になります。valuefalse に設定すると無効になります。

10.2.4. メッセージジャーナルの場所の設定

以下の管理 CLI コマンドを使用すると、メッセージジャーナルの場所の情報を読み取ることができます。出力も、デフォルト設定を強調表示するように組み込まれています。

/subsystem=messaging-activemq/server=default/path=journal-directory:read-resource
{
    "outcome" => "success",
    "result" => {
        "path" => "activemq/journal",
        "relative-to" => "jboss.server.data.dir"
    }
}

ジャーナルへの path のデフォルトは activemq/journal であることに注意してください。以下の管理 CLI コマンドを使用すると path の場所を変更できます。

/subsystem=messaging-activemq/server=default/path=journal-directory:write-attribute(name=path,value=PATH_LOCATION)
注記

Red Hat では、最適なパフォーマンスを得るために、ディスクヘッドの動きを最小限に抑えられるように、ジャーナルを固有の物理ボリュームに配置することを推奨しています。ジャーナルが、バインディングジャーナル、データベース、トランザクションコーディネーターなど、他のファイルを書き込む可能性のある他のプロセスと共有するボリュームにあるとします。その場合、書き込み時にディスクヘッドがこれらのファイル間で素早く移動するため、パフォーマンスが大幅に低下する可能性があります。

また、上記の出力の relative-to 属性にも注意してください。relative-to が使用された場合、path 属性の値は、relative-to で指定されたファイルパスに対する相対値とみなされます。デフォルト値は JBoss EAP プロパティーの jboss.server.data.dir です。スタンドアロンサーバーの場合、jboss.server.data.dirEAP_HOME/standalone/data にあります。ドメインの場合、各サーバーには EAP_HOME/domain /servers の下に独自の serverX/data/activemq ディレクトリーがあります。以下の管理 CLI コマンドを使用すると relative-to の値を変更できます。

/subsystem=messaging-activemq/server=default/path=journal-directory:write-attribute(name=relative-to,value=RELATIVE_LOCATION)

デフォルトでは、JBoss EAP は、ジャーナルディレクトリーが存在しなければ自動的に作成するように設定されています。以下の管理 CLI コマンドを使用して、この動作を切り替えます。

/subsystem=messaging-activemq/server=default:write-attribute(name=create-journal-dir,value=TRUE/FALSE)

valuetrue に設定するとディレクトリーの自動作成が有効になります。valuefalse に設定すると無効になります。

10.2.5. メッセージジャーナル属性の設定

以下に挙げる属性はすべて、メッセージングサーバーの子プロパティーです。そのため、管理 CLI を使用して値の取得と設定をするコマンド構文は同じです。

指定された属性の現在の値を読み取る構文は以下のようになります。

/subsystem=messaging-activemq/server=default:read-attribute(name=ATTRIBUTE_NAME)

属性の値を書き込む構文は、一致するパターンに従います。

/subsystem=messaging-activemq/server=default:write-attribute(name=ATTRIBUTE_NAME,value=NEW_VALUE)
  • create-journal-dir

    true に設定すると、ジャーナルディレクトリーがまだ存在しない場合は、journal-directory で指定された場所にジャーナルディレクトリーが自動的に作成されます。デフォルト値は true です。

  • journal-file-open-timeout

    この属性は、ジャーナルファイルを開く際のタイムアウト値を変更します。デフォルト値は 5 秒です。

  • journal-buffer-timeout

    フラッシュを必要とする書き込みで毎回フラッシュするのではなく、内部バッファーに保持し、満杯になるかタイムアウトになる (どちらか早い方) と内部バッファー全体をフラッシュします。これは NIO と ASYNCIO の両方で使用され、フラッシュが必要な多くの同時書き込みがある場合は、システムがより適切な調整を行うことが可能となります。

    このパラメーターは、バッファーがまだ満杯になっていない場合、バッファーをフラッシュするタイムアウトの制御を行います。通常、ASYNCIO は NIO より高速のフラッシュレートに対応できるため、システムは NIO と ASYNCIO のデフォルトを別々に保持します。NIO のデフォルト値は 3333333 ナノ秒 (300 回/秒) です。ASYNCIO のデフォルト値は 500000 ナノ秒 (2000 回/秒) です。

    注記

    タイムアウトを長くすると、レイテンシーを代償にシステムのスループットを増やすことができる可能性があり、デフォルトパラメーターはスループットと待ち時間のバランスをうまくとるように選択されています。

  • journal-buffer-size

    ASYNCIO でタイムアウトになったバッファーのサイズ (バイト単位)。journal-buffer-sizejournal-file-size は、min-large-message-size よりも高く設定する必要があります。そのように設定しなければ、メッセージはジャーナルには書き込まれません。詳細は、大きいメッセージの設定 を参照してください。

  • journal-compact-min-files

    ジャーナルが圧縮される前のファイルの最小数journal-compact-min-files を設定してはじめて圧縮アルゴリズムが起動されます。

    これを 0 に設定すると、圧縮機能は完全に無効になります。ただし、ジャーナルが無制限に増加する危険性があります。有効に使用してください。

    このパラメーターのデフォルトは 10 です。

  • journal-compact-percentage

    圧縮を開始するしきい値。ライブデータがこの割合より少ないとみなされた場合は、圧縮が開始されます。また、少なくとも journal-compact-min-files のデータファイルがジャーナルに存在しなければ、圧縮は起動されません。

    このパラメーターのデフォルトは 30 です。

  • journal-file-size

    各ジャーナルファイルのサイズ (バイト単位)。このデフォルト値は 10485760 バイト (10MB) です。journal-file-sizejournal-buffer-size は、min-large-message-size より大きく設定する必要があります。そのように設定しなければ、メッセージはジャーナルには書き込まれません。詳細は、大きいメッセージの設定 を参照してください。

  • journal-max-io

    書き込み要求は、実行するためにシステムへ送信される前にキューに置かれます。このパラメーターは、常時 IO キューに格納できる書き込み要求の最大数を制御します。キューが満杯になると、領域が解放されるまで書き込みがブロックされます。

    システムは、NIO または ASYNCIO のどちらかによって、パラメーターに別々のデフォルト値を保持します。NIO のデフォルト値は 1 で、ASYNCIO のデフォルト値は 500 です。

    値には制限があります。最大 ASYNCIO の合計値は、OS レベルで設定されている値 (/proc/sys/fs/aio-max-nr、通常 65536) より高くすることはできません。

  • journal-min-files

    ジャーナルが保持するファイルの最小数。JBoss EAP が起動され、初期メッセージデータがない場合、JBoss EAP では journal-min-files の数のファイルを事前に作成します。デフォルトは 2 です。

    ジャーナルファイルを作成してパディングを書き込むことは、かなりコストのかかる操作で、ファイルで一杯になる実行時には、これを最小限に抑える必要があります。ファイルを事前に作成しておくと、ジャーナルが満杯になっても、ジャーナルを作成するために一時停止することなく、次のジャーナルをすぐに再開できます。

    定常状態でキューに格納する予定のデータ量に応じて、データ全体の量と一致するようにこのファイルの数を調整する必要があります。

  • journal-pool-files

    再利用可能なジャーナルファイルの数。ActiveMQ では必要に応じてファイルを作成しますが、ファイルを回収する際には、この値まで減少させます。デフォルトは -1 です。これは、無制限を意味します。

  • journal-sync-transactional

    true に設定されると、JBoss EAP では、コミット、準備、ロールバックなどのトランザクション限界で、すべてのトランザクションデータが必ずディスクにフラッシュされるようになります。デフォルト値は true です。

  • journal-sync-non-transactional

    true に設定されると、JBoss EAP では、送信や確認などのトランザクション以外のメッセージデータが、毎回必ずディスクにフラッシュされるようになります。デフォルト値は true です。

  • journal-type

    有効な値は NIO または ASYNCIO です。

    NIO を選択すると、JBoss EAP に Java NIO ジャーナルの使用を指示します。ASYNCIO は、JBoss EAP に Linux 非同期 IO ジャーナルの使用を指示します。ASYNCIO を選択しても Linux が実行されていない場合、または libaio がインストールされていない場合、JBoss EAP は Java NIO ジャーナルを使用します。

10.2.6. ディスク書き込みキャッシュの無効の確認

オペレーティングシステムから fsync() を実行した場合でも、Java プログラム内から正しくデータを同期した場合でも、以下のような事象が発生します。

多くのシステムでは、ディスク書き込みキャッシュがデフォルトで有効になっています。つまり、オペレーティングシステムから同期した後であっても、データが実際にディスクに書き込まれる保証はありません。したがって障害が発生した場合は、重大なデータが失われることがあります。

一部の高価なディスクには、非揮発性、またはバッテリー駆動の書き込みキャッシュがあります。これらを使用した場合は、障害発生時に必ずしもデータが失われるわけではありませんが、テストが必要になります。

ディスクが高価な非揮発性キャッシュやバッテリー駆動キャッシュを備えておらず、ディスクが冗長アレイ (RAID など) の一部ではなく、データの整合性を重視している場合は、ディスク書き込みキャッシュが無効になっていることを確認してください。

ディスク書き込みキャッシュを無効にすると、突然パフォーマンスが低下する可能性があります。デフォルト設定で書き込みキャッシュが有効な状態でディスクを使用している場合、気付かずにデータの整合性が損なわれる可能性があります。このため、書き込みキャッシュを無効にして、ディスクを実際に確実に機能させて高速で稼働させる方法を考える必要があります。

Linux の場合は、IDE ディスク用の hdparm ツール、あるいは SDSI/SATA ディスク用の sdparm または sginfo で、ディスクの書き込みキャッシュ設定を検査または変更できます。

Windows の場合は、ディスクを右クリックし、プロパティーをクリックすると、設定を確認して変更できます。

10.2.7. libaio のインストール

Java NIO ジャーナルは極めて高性能ですが、Linux カーネル 2.6 以降を使用して JBoss EAP メッセージングを実行している場合は、Red Hat では、非常に最適な永続性パフォーマンスを得るために ASYNCIO ジャーナルを使用することを強く推奨します。

注記

JBoss EAP は、Red Hat Enterprise Linux のバージョン 6、7、または 8 にインストールされ、ext4、xfs、gfs2、nfs4 のいずれかのファイルシステムを使用している場合に限り、ASYNCIO に対応できます。他のオペレーティングシステムや、それ以前のバージョンの Linux カーネルで ASYNCIO ジャーナルを使用することはできません。

ASYNCIO ジャーナルを使用するには、libaio のインストールが必要となります。インストールには以下のコマンドを使用します。

  • Red Hat Enterprise Linux 6 および 7 の場合

    yum install libaio
  • Red Hat Enterprise Linux 8 の場合

    dnf install libaio
警告

tmpfs ファイルシステム (たとえば /tmp ディレクトリーで使用) にメッセージングジャーナルを配置しないでください。ASYNCIO ジャーナルが tmpfs を使用している場合、JBoss EAP は起動できません。

10.2.8. メッセージング用の NFS 共有ストアの設定

専用の共有のストアを使用して、データのレプリケーションに高可用性を確保する場合は、ライブサーバーとバックアップサーバーの両方を NFS クライアントの共有ディレクトリーを使用するように設定する必要があります。あるサーバーが NFS サーバーの共有ディレクトリーを使用し、別のサーバーが NFS クライアントの共有ディレクトリーを使用するように設定すると、ライブサーバーの起動時または稼働中にバックアップサーバーが認識できません。そのため正常に作動させるには、両方のサーバーで NFS クライアントの共有ディレクトリーを指定する必要があります。

NFS クライアントマウントでは、以下のオプションを設定することも必要です。

  • sync: このオプションは、すべての変更が即時にディスクにフラッシュされることを指定します。
  • intr: このオプションは、サーバーがダウンした場合やサーバーにアクセスできない場合に、NFS 要求を割り込みできるようにします。
  • noac: このオプションは、属性キャッシングを無効にし、複数のクライアント間で属性キャッシュの一貫性を実現するために必要です。
  • soft: このオプションは、エクスポートしたファイルシステムを提供するホストが利用できない場合、サーバーがオンラインに戻るのを待たずにエラーを報告するように指定します。
  • lookupcache=none: このオプションはルックアップキャッシングを無効にします。
  • timeo=n: NFS クライアントが NFS 要求を再試行するまで応答を待つ時間 (デシ秒 (10 分の 1 秒) 単位)。TCP 経由の NFS の場合、デフォルトの timeo 値は 600 (60 秒) です。UDP 経由の NFS では、クライアントは適応アルゴリズムを使用して、読み取り要求や書き込み要求など、頻繁に使用される要求のタイプに適切なタイムアウト値を予測します。
  • retrans=n: さらなるリカバリーアクションを試行する前に、NFS クライアントが要求を再試行する回数。retrans オプションが指定されていない場合、NFS クライアントは各リクエストを 3 回試行します。
重要

timeo オプションおよび retrans オプションを設定する場合、適切な値を使用することが重要です。デフォルト timeo600 デシ秒 (60 秒) と retrans 値の 5 を組み合わせると、ActiveMQ Artemis が NFS 接続の切断を検出するのを 5 分間待機する可能性があります。

高可用性を実現するために共有ファイルシステムを使用する方法の詳細は、本ガイドの 共有ストア のセクションを参照してください。