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)システムは、以下のいずれかの値を返します。
Expand 表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 共有ストアファイルシステムを示しています。Expand オペレーティングシステム ファイルシステム 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 で、バインディングフォルダーにあります。
- Jakarta Messaging Journal
このジャーナルインスタンスは、Jakarta Messaging キュー、トピック、接続ファクトリー、ならびにこれらのリソースに対する JNDI バインディングなどの Jakarta Messaging 関連のデータをすべて格納します。
管理 API で作成された Jakarta Messaging リソースは、このジャーナルに永続化されます。設定ファイルで設定したリソースは一切、このジャーナルに永続化されません。Jakarta Messaging が使用されている場合のみ、Jakarta Messaging ジャーナルが作成されます。
このジャーナルのファイルには 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. バインディングジャーナルと Jakarta Messaging ジャーナルの設定 リンクのコピーリンクがクリップボードにコピーされました!
バインディングジャーナルと Jakarta Messaging ジャーナルは設定を共有しているため、以下の 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.dir は EAP_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)
value を true に設定するとディレクトリーの自動作成が有効になります。value を false に設定すると無効になります。
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.dir は EAP_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)
value を true に設定するとディレクトリーの自動作成が有効になります。value を false に設定すると無効になります。
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-dirtrueに設定すると、ジャーナルディレクトリーがまだ存在しない場合は、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-sizeASYNCIO でタイムアウトになったバッファーのサイズ (バイト単位)。
journal-buffer-sizeとjournal-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-sizeとjournal-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-transactionaltrue に設定されると、JBoss EAP では、コミット、準備、ロールバックなどのトランザクション限界で、すべてのトランザクションデータが必ずディスクにフラッシュされるようになります。デフォルト値は
trueです。journal-sync-non-transactionaltrue に設定されると、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 libaioRed Hat Enterprise Linux 8 の場合
dnf install libaio
tmpfs ファイルシステム (たとえば /tmp ディレクトリーで使用) にメッセージングジャーナルを配置しないでください。ASYNCIO ジャーナルが tmpfs を使用している場合、JBoss EAP は起動できません。