6.2. データベースのメッセージデータの永続化
メッセージのデータをデータベースで永続化すると、ブローカーは Java Database Connectivity (JDBC) 接続を使用して、メッセージおよびバインディングデータをデータベーステーブルに保存します。テーブルのデータは AMQ Broker ジャーナルエンコーディングを使用してエンコードされます。サポートされるデータベースの詳細は、Red Hat カスタマーポータルの Red Hat AMQ 7 Supported Configurations を参照してください。
管理者は、組織の IT インフラストラクチャーの要件に基づいて、メッセージデータをデータベースに保管できます。ただし、データベースを使用すると、メッセージングシステムのパフォーマンスに悪影響を及ぼす可能性があります。具体的には、JDBC 経由でメッセージングデータをデータベーステーブルに書き込むと、ブローカーのパフォーマンスに大きなオーバーヘッドが発生します。
6.2.1. JDBC 永続性の設定
以下の手順では、メッセージおよびバインディングデータをデータベーステーブルに保存するようにブローカーを設定する方法を説明します。
手順
-
適切な JDBC クライアントライブラリーをブローカーランタイムに追加します。これを実行するには、関連する
.jar
ファイルを<broker_instance_dir>/lib
ディレクトリーに追加します。 -
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 core
要素内に、database-store
要素が含まれるstore
要素を追加します。<configuration> <core> <store> <database-store> </database-store> </store> </core> </configuration>
database-store
要素内に JDBC 永続化の設定パラメーターを追加し、値を指定します。以下は例になります。<configuration> <core> <store> <database-store> <jdbc-connection-url>jdbc:oracle:data/oracle/database-store;create=true</jdbc-connection-url> <jdbc-user>ENC(5493dd76567ee5ec269d11823973462f)</jdbc-user> <jdbc-password>ENC(56a0db3b71043054269d11823973462f)</jdbc-password> <bindings-table-name>BINDINGS_TABLE</bindings-table-name> <message-table-name>MESSAGE_TABLE</message-table-name> <large-message-table-name>LARGE_MESSAGES_TABLE</large-message-table-name> <page-store-table-name>PAGE_STORE_TABLE</page-store-table-name> <node-manager-store-table-name>NODE_MANAGER_TABLE</node-manager-store-table-name> <jdbc-driver-class-name>oracle.jdbc.driver.OracleDriver</jdbc-driver-class-name> <jdbc-network-timeout>10000</jdbc-network-timeout> <jdbc-lock-renew-period>2000</jdbc-lock-renew-period> <jdbc-lock-expiration>20000</jdbc-lock-expiration> <jdbc-journal-sync-period>5</jdbc-journal-sync-period> </database-store> </store> </core> </configuration>
- jdbc-connection-url
- データベースサーバーの完全な JDBC 接続 URL。接続 URL には、すべての設定パラメーターとデータベース名が含まれている必要があります。
- jdbc-user
- データベースサーバー用に暗号化されたユーザー名。設定ファイルで使用するユーザー名とパスワードの暗号化に関する詳細は、「設定ファイルのパスワードの暗号化」 を参照してください。
- jdbc-password
- データベースサーバー用に暗号化されたパスワード。設定ファイルで使用するユーザー名とパスワードの暗号化に関する詳細は、「設定ファイルのパスワードの暗号化」 を参照してください。
- bindings-table-name
- データのバインディングが保存されるテーブルの名前。このテーブル名を指定すると、干渉なしに複数のサーバー間で単一のデータベースを共有できます。
- message-table-name
- メッセージデータが保存されるテーブルの名前。このテーブル名を指定すると、干渉なしに複数のサーバー間で単一のデータベースを共有できます。
- large-message-table-name
- サイズの大きいメッセージと関連データが永続化されるテーブルの名前。さらに、クライアントがサイズの大きいメッセージをチャンクでストリーミングする場合に、チャンクはこのテーブルに保存されます。このテーブル名を指定すると、干渉なしに複数のサーバー間で単一のデータベースを共有できます。
- page-store-table-name
- ページストアディレクトリー情報が格納されるテーブルの名前。このテーブル名を指定すると、干渉なしに複数のサーバー間で単一のデータベースを共有できます。
- node-manager-store-table-name
- 共有ストア高可用性 (HA) がライブおよびバックアップブローカー向けにロックされ、他の HA 関連のデータがブローカーサーバーに保存されているテーブルの名前。このテーブル名を指定すると、干渉なしに複数のサーバー間で単一のデータベースを共有できます。共有ストア HA を使用する各ライブ/バックアップペアは、同じテーブル名を使用する必要があります。複数の (および関連性のない) ライブ/バックアップペア間で同じテーブルを共有できません。
- jdbc-driver-class-name
- JDBC データベースドライバーの完全修飾クラス名。サポートされるデータベースの詳細は、Red Hat カスタマーポータルの Red Hat AMQ 7 Supported Configurations を参照してください。
- jdbc-network-timeout
-
JDBC ネットワーク接続のタイムアウト (ミリ秒単位)。デフォルト値は 20000 ミリ秒です。共有ストア HA に JDBC を使用する場合は、
jdbc-lock-expiration
未満の値にタイムアウトを設定することが推奨されます。 - jdbc-lock-renew-period
-
現在の JDBC ロックの更新期間の長さ (ミリ秒単位)。この時間が経過すると、ブローカーはロックを更新できます。
jdbc-lock-expiration
の値の数分の 1 の値を設定することをお勧めします。これにより、ブローカーはリースを延長するのに十分な時間を確保でき、接続に問題が発生した場合にブローカーがロックの更新を試みる時間を確保できます。デフォルト値は 2000 ミリ秒です。 - jdbc-lock-expiration
jdbc-lock-renew-period
の値が経過した場合でも、現在の JDBC ロックが所有 ( 取得または更新 ) されているとみなされる時間 ( ミリ秒単位 )。ブローカーは、
jdbc-lock-renew-period
の値に従って、所有するロックの定期更新を試みます。ブローカーがロックの更新に 失敗 した場合 ( 接続の問題などにより )、ブローカーはロックが最後に正常に取得または更新されてからjdbc-lock-expiration
の値が経過するまでロックの更新を試み続けます。上記の更新動作の例外は、別のブローカーがロックを取得する場合です。これは、Database Management System (DBMS) とブローカー間の時間の不整合が発生した場合や、ガベージコレクションの一時停止期間が長い場合に発生する可能性があります。この場合、最初にロックを所有していたブローカーは、ロックが失われたと判断し、更新を試行しません。
有効期限の経過後、現在 JDBC ロックを所有しているブローカーによって JDBC ロックが更新されない場合、別のブローカーが JDBC ロックを確立できます。
jdbc-lock-expiration
のデフォルト値は 20000 ミリ秒です。- jdbc-journal-sync-period
- ブローカージャーナルが JDBC と同期する期間 ( ミリ秒単位 )。デフォルト値は 5 ミリ秒です。