第6章 メッセージデータの永続化
AMQ Broker には、メッセージデータの永続化 (つまり 格納) の 2 つのオプションがあります。
- ジャーナルでのメッセージの永続化
- 以下はデフォルトのオプションになります。ジャーナルベースの永続性は、ファイルシステムのジャーナルにメッセージを書き込む高パフォーマンスオプションです。
- データベースのメッセージの永続化
- このオプションは、Java Database Connectivity (JDBC) 接続を使用して、選択したデータベースにメッセージを永続化します。
または、ブローカーを設定して、メッセージデータを永続化し ない ようにすることもできます。詳細は、「永続性の無効化」 を参照してください。
ブローカーは、メッセージジャーナル以外で大きなメッセージを永続化するために別のソリューションを使用します。詳細は、8章大きなメッセージの処理 を参照してください。
ブローカーは、メモリー不足の状況でメッセージをディスクにページングするように設定することもできます。詳細は、「メッセージのページングの設定」 を参照してください。
AMQ Broker でサポートされるデータベースおよびネットワークファイルシステムに関する現在の情報は、Red Hat カスタマーポータルの Red Hat AMQ 7 Supported Configurations を参照してください。
6.1. ジャーナルでのメッセージデータの永続化
ブローカージャーナルは、ディスク上の append-only のファイルセットです。各ファイルは固定サイズに事前作成され、最初にパディングが入力されます。メッセージング操作がブローカーで実行されると、レコードがジャーナルの最後に追加されます。レコードを追加すると、ブローカーはディスクヘッドの移動およびランダムアクセス操作を最小限に抑えることができます。これは通常、ディスク上で最も遅い操作です。1 つのジャーナルファイルが満杯になると、ブローカーは新しいジャーナルファイルを作成します。
ジャーナルファイルサイズは設定可能です。各ファイルによって使用されるディスクリプラーの数を最小限に抑えることができます。最新のディスクトポロジーは複雑で、ブローカーはファイルのマッピング先の cylinder を制御することはできません。そのため、ジャーナルファイルのサイジングは正確に制御するのが難しくなります。
ブローカーが使用するその他の永続性関連の機能は、以下のとおりです。
- 特定のジャーナルファイルがまだ使用中かどうかを判断する ガベージコレクション アルゴリズム。ジャーナルファイルが使用されなくなった場合、ブローカーはファイルを再利用できるように回収できます。
- ジャーナルからデッドスペースを削除し、データを圧縮する圧縮アルゴリズム。これにより、ジャーナルがディスク上のファイル数より小さくなります。
- ローカルトランザクションのサポート。
- JMS クライアントを使用する場合の Extended Architecture(XA) トランザクションのサポート。
ジャーナルのほとんどは Java で記述されています。ただし、実際のファイルシステムとの対話は抽象化されるため、さまざまなプラグ可能な実装を使用できます。AMQ Broker には以下の実装が含まれます。
- NIO
- NIO(New I/O) は標準の Java NIO を使用してファイルシステムとインターフェイスします。これにより、非常に優れたパフォーマンスを実現し、Java 6 以降のランタイムを備えたプラットフォーム上で稼働します。Java NIO の詳細は、Java NIO を参照してください。
- AIO
AIO(Aynshcronous I/O) は、シンネイティブラッパーを使用して、Linux Asynchronous I/O Library(
libaio
) と通信します。AIO では、ブローカーはデータがディスクの作成後に呼び出されるので、同期を明示的に回避できます。デフォルトでは、ブローカーは AIO ジャーナルの使用を試み、AIO が利用できない場合は NIO を使用するようにフォールバックします。通常 AIO は Java NIO よりもさらにパフォーマンスが優れています。
libaio
のインストール方法は、「Linux 非同期 I/O ライブラリーのインストール」 を参照してください。
以下のサブセクションにある手順は、ジャーナルベースの永続性をブローカーに設定する方法を表しています。
6.1.1. Linux 非同期 I/O ライブラリーのインストール
Red Hat は、永続性のパフォーマンスを向上させるために AIO ジャーナル (NIO ではなく) を使用することを推奨しています。
他のオペレーティングシステムや、それ以前のバージョンの Linux カーネルで AIO ジャーナルを使用することはできません。
AIO ジャーナルを使用するには、Linux Asynchronous I/O Library(libaio
) をインストールする必要があります。libaio
をインストールするには、以下のように yum
コマンドを使用します。
yum install libaio
6.1.2. ジャーナルベースの永続性の設定
以下の手順では、ブローカーがジャーナルベースの永続性に使用するデフォルト設定を確認する方法を説明します。この説明を使用すると、必要に応じて設定を調整できます。
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。デフォルトでは、ブローカーは以下のようにジャーナルベースの永続性を使用するように設定されています。
<configuration> <core> ... <persistence-enabled>true</persistence-enabled> <journal-type>ASYNCIO</journal-type> <bindings-directory>./data/bindings</bindings-directory> <journal-directory>./data/journal</journal-directory> <journal-datasync>true</journal-datasync> <journal-min-files>2</journal-min-files> <journal-pool-files>-1</journal-pool-files> <journal-device-block-size>4096</journal-device-block-size> <journal-file-size>10M</journal-file-size> <journal-buffer-timeout>12000</journal-buffer-timeout> <journal-max-io>4096</journal-max-io> ... </core> </configuration>
persistence-enabled
-
このパラメーターの値を
true
に設定すると、ブローカーはメッセージ永続性にファイルベースのジャーナルを使用します。 journal-type
-
使用するジャーナルのタイプ。
ASYNCIO
に設定されている場合には、ブローカーはまず AIO の使用を試行します。AIO が見つからない場合、ブローカーは NIO を使用します。 bindings-directory
-
バインディングジャーナルのファイルシステムの場所。デフォルト値は、
<broker_instance_dir>
ディレクトリーを起点とした相対パスです。 journal-directory
-
メッセージジャーナルのファイルシステムの場所。デフォルト値は、
<broker_instance_dir>
ディレクトリーを起点とした相対パスです。 journal-datasync
-
このパラメーターの値を
true
に設定すると、ブローカーはfdatasync
関数を使用してディスク書き込みを確認します。 journal-min-files
- ブローカーの起動時に最初に作成するジャーナルファイルの数。
journal-pool-files
-
未使用のファイルを回収した後に保持するファイルの数。デフォルト値の
-1
は、クリーンアップ中にファイルが削除されないことを意味します。 journal-device-block-size
- ストレージデバイスのジャーナルが使用するデータブロックの最大サイズ (バイト単位)。デフォルト値は 4096 バイトです。
journal-file-size
- 指定したジャーナルディレクトリーの各ジャーナルファイルの最大サイズ (バイト単位)。この制限に達すると、ブローカーは新規ファイルを起動します。このパラメーターは、バイト表記 (K、M、G など)、または同等のバイナリー (Ki、Mi、Gi) もサポートします。このパラメーターが設定で明示的に指定されていない場合、デフォルト値は 10485760 バイト (10MiB) になります。
journal-buffer-timeout
- ブローカーがジャーナルバッファーをフラッシュする頻度をナノ秒で指定します。通常、AIO は NIO よりも高いフラッシュレートを使用するため、ブローカーは NIO と AIO の異なるデフォルト値を維持します。このパラメーターが設定で明示的に指定されていない場合、NIO のデフォルト値は 3333333 ナノ秒 (つまり、1 秒あたり 300 回) になります。AIO のデフォルト値は 50000 ナノ秒 (例: 2000 回/秒) です。
journal-max-io
いつでも IO キューに格納できる書き込み要求の最大数。キューが満杯になると、ブローカーは領域が利用可能になるまで追加の書き込みをブロックします。
NIO を使用している場合、この値は常に
1
である必要があります。AIO を使用し、このパラメーターが明示的に設定されていない場合、デフォルト値は500
になります。
- 上記の説明に基づいて、ストレージデバイスの必要に応じて永続性設定を調整します。
関連情報
- ジャーナルベースの永続性設定に使用できる 全 パラメーターの詳細は、付録E メッセージングジャーナル設定要素 を参照してください。
6.1.3. バインディングジャーナルについて
バインディングジャーナルは、ブローカーにデプロイされたキューのセットや属性などのバインディング関連のデータを保存するために使用されます。また、ID シーケンスカウンターなどのデータも格納します。
バインディングジャーナルは常に NIO を使用します。これは通常、メッセージジャーナルと比べるとスループットが低くなるためです。このジャーナルのファイルには activemq-bindings
という接頭辞が付けられます。各ファイルには拡張子 .bindings
があり、デフォルトサイズは 1048576 バイトです。
バインディングジャーナルを設定するには、<broker_instance_dir>/etc/broker.xml
設定ファイルの core
要素に以下のパラメーターを追加します。
bindings-directory
-
バインディングジャーナルのディレクトリー。デフォルト値は
<broker_instance_dir>/data/bindings
です。 create-bindings-dir
-
このパラメーターの値を
true
に設定すると、ブローカーはbindings-directory
で指定された場所 (存在しない場合) にバインディングディレクトリーを自動的に作成します。デフォルト値はtrue
です。
6.1.4. JMS ジャーナルについて
JMS ジャーナルは、JMS キュー、トピック、接続ファクトリー、ならびにこれらのリソースの JNDI バインディングを含む JMS 関連のデータをすべて格納します。管理 API で作成された JMS リソースはこのジャーナルに永続化されますが、設定ファイルを介して設定されたリソースは永続化されません。ブローカーは、JMS が使用されている場合に のみ JMS ジャーナルを作成します。
JMS ジャーナルのファイルには activemq-jms
という接頭辞が付けられます。各ファイルには拡張子 .jms
があり、デフォルトサイズは 1048576 バイトです。
JMS ジャーナルはバインディングジャーナルと設定を共有します。
関連情報
- バインディングジャーナルの詳細は、「バインディングジャーナルについて」 を参照してください。
6.1.5. ジャーナル保持の設定
AMQ Broker は、作成された各ジャーナルファイルコピーを保持するように設定することができます。ジャーナル保持を設定した後、ジャーナルファイルコピーでメッセージを再生して、メッセージをブローカーに送信できます。
6.1.5.1. ジャーナル保持の設定
AMQ Broker は、ジャーナルファイルコピーを特定の期間、またはストレージの制限に達するまで、あるいはその両方について保持するように設定できます。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 -
core
要素内に、journal-retention-directory
属性を追加します。ジャーナルファイルの保持を制御するために、period
またはstorage-limit
、あるいはその両方を指定します。さらに、ジャーナルファイルコピー用のファイルシステムの場所を指定します。次の例では、AMQ Broker が、ジャーナルファイルコピーをdata/retention
ディレクトリーに7
日間、またはファイルが10GB
のストレージを使用するまで保持するように設定します。
<configuration> <core> ... <journal-retention-directory period="7" unit="DAYS" storage-limit="10G">data/retention</journal-retention-directory> ... </core> </configuration>
period
- ジャーナルファイルコピーを保持する期間。期間が終了すると、AMQ Broker は指定された期間より古いファイルを削除します。
unit
-
保持期間に適用する測定単位。デフォルト値は
DAYS
です。その他の有効な値は、HOURS
、MINUTES
、SECONDS
です。 directory
- ジャーナルファイルコピーのファイルシステムの場所。指定されたディレクトリーは <broker_instance_dir> ディレクトリーに対して相対的です。
storage-limit
- すべてのジャーナルファイルコピーで使用できる最大ストレージ。ストレージの制限に達した場合、ブローカーは最も古いジャーナルファイルを削除して、新しいジャーナルファイルコピーのためのスペースを提供します。ストレージ制限を設定することは、ジャーナルファイルの保持によってブローカーがディスク容量を使い果たしてシャットダウンしないようにするための効果的な方法です。
6.1.5.2. ブローカー上に存在するアドレスのジャーナルファイルコピーのメッセージの再生
ジャーナルファイルコピーから再生したいメッセージのアドレスが AMQ Broker 上に存在する場合、以下の手順でメッセージを再生してください。ブローカーにある元のアドレス、または別のアドレスにメッセージを再生することができます。
手順
- AMQ Management Console にログインします。詳細については、AMQ 管理コンソールへのアクセス を参照してください。
- メインメニューの Artemis をクリックします。
- フォルダーツリーで、addresses をクリックすると、アドレスの一覧が表示されます。
- Addresses タブをクリックします。
- メッセージを再生するアドレスの Action 列で、operations をクリックします。
再生操作を選択します。
- 再生操作で、すべてのジャーナルファイルコピーで再生するメッセージを検索する場合は、replay(String,String) 操作をクリックしてください。
- 再生操作で、特定の期間内に作成されたジャーナルファイルコピーでのみ再生するメッセージを検索する場合は、replay(String,String, String,String) 操作を選択します。startScanDate および endScanDate フィールドで、期間を指定します。
再生オプションを指定します。
- target フィールドで、再生されたメッセージを送信するブローカー上のアドレスを指定します。このフィールドを空白にすると、メッセージはブローカー上の元のアドレスに再生されます。
-
(オプション) filter フィールドで、フィルター文字列に一致するメッセージのみを再生する文字列を指定します。たとえば、メッセージに storeID プロパティーがある場合、
storeID="1000"
のフィルターを使用して、ストア ID 値が 1000 のすべてのメッセージを再生できます。フィルターを指定しない場合、スキャンされたジャーナルファイルコピーのすべてのメッセージが AMQ Broker に再生されます。
- Execute をクリックします。
関連情報
- AMQ 管理コンソールの使用の詳細については、AMQ 管理コンソールの使用 を参照してください。
6.1.5.3. ブローカーから削除されたアドレスのジャーナルファイルコピーでのメッセージの再生
ジャーナルファイルコピーから再生したいメッセージのアドレスが AMQ Broker から削除された場合、以下の手順を使用して、ブローカーの別のアドレスにメッセージを再生します。
手順
- AMQ Management Console にログインします。詳細については、AMQ 管理コンソールへのアクセス を参照してください。
- メインメニューの Artemis をクリックします。
- フォルダーツリーで、トップレベルのサーバーをクリックします。
- Operations タブをクリックします。
再生操作を選択します。
- 再生操作で、すべてのジャーナルファイルコピーで再生するメッセージを検索する場合は、replay(String,String,String) 操作をクリックしてください。
- 再生操作で、特定期間内に作成されたジャーナルファイルコピーでのみ再生するメッセージを検索する場合は、replay(String,String, String,String,String) 操作を選択してください。startScanDate および endScanDate フィールドで、期間を指定します。
再生オプションを指定します。
- アドレス フィールドには、再生するメッセージのアドレスを指定します。
- target フィールドで、再生されたメッセージを送信するブローカー上のアドレスを指定します。
-
(オプション) filter フィールドで、フィルター文字列に一致するメッセージのみを再生する文字列を指定します。たとえば、メッセージに storeID プロパティーがある場合、
storeID="1000"
のフィルターを使用して、ストア ID 値が 1000 のすべてのメッセージを再生できます。フィルターを指定しない場合、スキャンされたジャーナルファイルコピーのすべてのメッセージが AMQ Broker に再生されます。
- Execute をクリックします。
関連情報
- AMQ 管理コンソールの使用の詳細については、AMQ 管理コンソールの使用 を参照してください。
6.1.6. ジャーナルファイルの圧縮
AMQ Broker には、ジャーナルからデッド領域を削除し、データの圧縮解除によりディスク領域が少なくなるようにする圧縮アルゴリズムが含まれています。
以下のサブセクションでは、以下の方法を示しています。
6.1.6.1. ジャーナルファイル圧縮の設定
ブローカーは以下の基準を使用して、圧縮を開始するタイミングを決定します。
- ジャーナル用に作成されたファイルの数。
- ジャーナルファイルのライブデータの割合。
これらの基準に設定された値に達した後、圧縮プロセスはジャーナルを解析し、デッドレコードをすべて削除します。そのため、ジャーナルにはファイルが少なくなります。
以下の手順は、ジャーナルファイルコンパクション にブローカーを設定する方法を説明します。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 core
要素内にjournal-compact-min-files
パラメーターおよびjournal-compact-percentage
パラメーターを追加し、値を指定します。以下に例を示します。<configuration> <core> ... <journal-compact-min-files>15</journal-compact-min-files> <journal-compact-percentage>25</journal-compact-percentage> ... </core> </configuration>
journal-compact-min-files
-
圧縮の開始前にブローカーが最小限作成する必要のあるジャーナルファイル数。デフォルト値は
10
です。値を0
に設定すると、圧縮が無効になります。ジャーナルのサイズが無限に増加する可能性があるため、コンパクションの無効化に注意する必要があります。 journal-compact-percentage
-
ジャーナルファイルのライブデータの割合。この割合より少ない場合にはライブデータとみなされ、 (
journal-compact-min-files
の設定値に達した場合)、圧縮が開始されます。デフォルト値は30
です。
6.1.6.2. コマンドラインインターフェイスからの圧縮の実行
以下の手順では、コマンドラインインターフェイス (CLI) を使用してジャーナルファイルを圧縮する方法を説明します。
手順
<broker_instance_dir>
ディレクトリーの所有者として、ブローカーを停止します。以下の例は、ユーザーamq-broker
を示しています。su - amq-broker cd <broker_instance_dir>/bin $ ./artemis stop
(オプション) 以下の CLI コマンドを実行して、データツールのパラメーターの全リストを取得します。デフォルトでは、このツールは
<broker_instance_dir>/etc/broker.xml
にある設定を使用します。$ ./artemis help data compact.
以下の CLI コマンドを実行して、データを圧縮します。
$ ./artemis data compact.
ツールがデータを正常に圧縮したら、ブローカーを再起動します。
$ ./artemis run
関連情報
- AMQ Broker には、ジャーナルファイル管理用の CLI コマンドが多数含まれています。詳細は、付録の コマンドラインツール を参照してください。
6.1.7. ディスク書き込みキャッシュの無効化
ほとんどのディスクには、ハードウェア書き込みキャッシュが含まれます。書き込みキャッシュは、後でディスクに遅延書き込みされるため、ディスクの見かけのパフォーマンスを向上させることができます。多くのシステムでは、ディスク書き込みキャッシュがデフォルトで有効になっています。つまり、オペレーティングシステムから同期した後であっても、データが実際にディスクに書き込まれる保証はありません。したがって障害が発生した場合は、重大なデータが失われることがあります。
一部の高価なディスクには、非揮発性、またはバッテリー駆動の書き込みキャッシュがあります。これらを使用した場合は、障害発生時に必ずしもデータが失われるわけではありませんが、テストが必要になります。ディスクにこのような機能がない場合は、書き込みキャッシュを必ず無効にする必要があります。ディスク書き込みキャッシュを無効にすると、パフォーマンスに悪影響を及ぼす可能性があることに注意してください。
以下の手順は、Windows 上の Linux でディスク書き込みキャッシュを無効にする方法を示しています。
手順
-
Linux で、ディスク書き込みキャッシュ設定を管理するには、
hdparm
(IDE ディスクの場合) またはsdparm
またはsginfo
(SDSI/SATA ディスクの場合) ツールを使用します。 - Windows でディスクライターキャッシュ設定を管理するには、ディスクを右クリックします。Properties を選択します。