10.3. JDBC データベースを使用したメッセージングジャーナルの永続化
デフォルトのファイルベースのジャーナルを使用するのではなく、JDBC を使用してメッセージを永続化し、データをデータベースにバインドするように、JBoss EAP 7 メッセージングを設定する必要があります。
この設定を行うには、まず datasources サブシステムの datasource 要素を設定し、次に messaging-activemq サブシステムの server 要素で journal-datasource 属性を定義して、データソースを使用する必要があります。journal-datasource 属性が存在すると、ファイルベースのジャーナルではなくジャーナルエントリーをデータベースに永続化することを、メッセージングサブシステムに通知します。messaging-activemq サブシステムの server リソースの journal-database 属性は、データベースとの通信に使用される SQL ダイアレクトを定義します。この属性は、データソースメタデータを使用して自動的に設定されます。
メッセージをファイルベースのジャーナルに永続化すると、大きいメッセージのサイズはディスクのサイズによってのみ制限されます。ただし、メッセージをデータベースに永続化すると、大きなメッセージのサイズは、そのデータベースの BLOB データ型の最大サイズに制限されます。
JBoss EAP 7.4 では現在、Oracle 12c および IBM DB2 Enterprise データベースのみをサポートします。
10.3.1. データベースの永続ストアを設定する際の考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
信頼性を向上させるために、JBoss EAP は接続プールを介してメッセージング呼び出しを行います。接続プールは、複数のアプリケーション間で共有できる指定されたデータベースに対して一連の接続を開通します。これは、JBoss EAP が接続を切断した場合に、プール内の別の接続がその失敗した接続を置き換えて失敗を回避することを意味します。
以前のバージョンの JBoss EAP は、プールからの接続を 1 つだけサポートします。
datasources サブシステムでデータベース永続ストアまたはプールを設定するときは、次の点を考慮してください。
min-pool-size属性の値を少なくとも 4 に設定して、次の用途ごとに専用の接続を作成します。- バインディング用
- メッセージジャーナル用
- 高可用性 (HA) を使用している場合はリースロック用
- HA を使用している場合はノードマネージャーの共有状態用
-
ページングまたは大きなメッセージストリーミング操作を実行する同時スレッドの数に基づいて、
max-pool-size属性の値を設定します。スレッド数と接続数の関係は 1 対 1 ではないため、max-pool-size属性を設定するための規則は定義されていません。
接続の数は、ページングおよび大きなメッセージ操作を処理するスレッドの数と、接続を取得するための待機にかかる時間を定義する属性 blocking-timeout-wait-millis によって異なります。
サイズの大きい新規メッセージまたはページング操作は専用スレッドで発生し、接続が必要です。これらの専用スレッドは、接続の準備ができるか、接続取得の期限が切れるまでキューに入れられ、その後失敗に終わります。
必要に応じてプール設定をカスタマイズし、環境内で設定済みのプールをテストできます。
10.3.2. メッセージングジャーナル JDBC 永続ストアの設定 リンクのコピーリンクがクリップボードにコピーされました!
以下の手順に従って、JDBC を使用してメッセージを永続化し、データをデータベースにバインドするように、JBoss EAP 7 メッセージングを設定します。
-
messaging-activemqサブシステムで使用するために、datasources サブシステムの datasource を設定します。データソースの作成と設定の方法の詳細は、JBoss EAP 設定ガイドの データソース管理 を参照してください。 messaging-activemqサブシステムを設定して新しいデータソースを使用します。/subsystem=messaging-activemq/server=default:write-attribute(name=journal-datasource,value="MessagingOracle12cDS")これにより、サーバー設定ファイルの
messaging-activemqサブシステムに以下の設定が作成されます。<server name="default"> <journal datasource="MessagingOracle12cDS"/> ... </server>
JBoss EAP メッセージングが、データベースを使用してメッセージングデータを格納するように設定されました。
10.3.3. メッセージングジャーナルテーブル名の設定 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 7 メッセージングは、個別の JDBC テーブルを使用してバインディング情報、メッセージ、大容量メッセージ、ページング情報を格納します。これらのテーブルの名前は、サーバー設定ファイルの messaging-activemq サブシステムにある server リソースの journal-bindings-table、journal-jms-bindings-table、journal-messages-table、journal-large-messages-table、および journal-page-store-table 属性を使用して設定できます。
以下は、テーブル名の制限のリストです。
-
JBoss EAP 7 メッセージングでは、TABLE_NAME + GENERATED_ID のパターンでページングテーブルの識別子を生成します。ここで GENERATED_ID は 20 文字まで可能です。Oracle Database 12c ではテーブル名の長さは最大 30 文字であるため、テーブル名を 10 文字に制限する必要があります。これを超えると、
ORA-00972: identifier is too longというエラーが表示される可能性があり、ページングが機能しなくなります。 - Oracle Database 12c の スキーマオブジェクトネーミング規則 に準拠しないテーブル名は、二重引用符で囲む必要があります。引用符付きの識別子は任意の文字で開始でき、任意の文字、句読点、スペースを含めることができます。ただし、引用符で囲まれていてもいなくても、識別子に二重引用符またはヌル文字 (\0) を含めることはできません。引用符で囲まれた識別子は、大文字と小文字が区別されることに注意してください。
- 複数の JBoss EAP サーバーインスタンスが同じデータベースを使用してメッセージを永続化し、データをバインドする場合、テーブル名はサーバーインスタンスごとに一意である必要があります。複数の JBoss EAP サーバーは同じテーブルにアクセスできません。
以下の例は、引用符付き識別子を使用して journal-page-store-table 名を設定する管理 CLI コマンドです。
/subsystem=messaging-activemq/server=default:write-attribute(name=journal-page-store-table,value="\"PAGE_DATA\"")
これにより、サーバー設定ファイルの messaging-activemq サブシステムに以下の設定が作成されます。
<server name="default">
<journal datasource="MessagingOracle12cDS" journal-page-store-table=""PAGED_DATA""/>
...
</server>
10.3.4. 管理対象ドメインでのメッセージングジャーナルの設定 リンクのコピーリンクがクリップボードにコピーされました!
前述の メッセージングジャーナルテーブル名の設定 で説明したように、JDBC を使用してメッセージを永続化してデータをデータベースにバインドする場合は複数の JBoss EAP サーバーが同じデータベーステーブルにアクセスすることはできません。管理対象ドメインの場合、サーバーグループのすべての JBoss EAP サーバーインスタンスは同じプロファイル設定を共有します。このため、メッセージングジャーナル名またはデータソースを設定する式を使用する必要があります。
すべてのサーバーが、同じデータベースを使用してメッセージングデータを格納するように設定されている場合、テーブル名はサーバーインスタンスごとに一意にする必要があります。以下の例は、名前が一意のノード識別子を含む式を使用して、サーバーグループの各サーバーに対して一意の journal-page-store-table テーブル名を作成する管理 CLI コマンドです。
/subsystem=messaging-activemq/server=default:write-attribute(name=journal-page-store-table,value="${env.NODE_ID}_page_store")
各サーバーインスタンスが異なるデータベースにアクセスする場合、式を使用して各サーバーのメッセージング設定が異なるデータソースに接続するようにできます。以下の管理 CLI コマンドでは、connection-url の DB_CONNECTION_URL 環境変数を使用して、異なるデータソースに接続します。
data-source add --name=messaging-journal --jndi-name=java:jboss/datasources/messaging-journal --driver-name=oracle12c --connection-url=${env.DB_CONNECTION_URL}
10.3.5. メッセージングジャーナルネットワークのタイムアウトの設定 リンクのコピーリンクがクリップボードにコピーされました!
JDBC コネクションがリクエストに応答するまでのデーターベースの待機時間の最大値 (ミリ秒単位) を設定できます。これは、ネットワークが停止するか、JBoss EAP メッセージングとデータベースの間の接続が何らかの理由が閉じられているイベントで役に立ちます。こうしたイベントが発生すると、タイムアウトになるまでクライアントはブロックされます。
journal-jdbc-network-timeout 属性を更新してタイムアウトの設定をします。デフォルト値は 20000 ミリ秒 (20 秒) です。
以下の例は、journal-jdbc-network-timeout 属性値を 10000 ミリ秒 (10 秒) に設定する管理 CLI コマンドです。
/subsystem=messaging-activemq/server=default:write-attribute(name=journal-jdbc-network-timeout,value=10000)
10.3.6. メッセージング JDBC 永続ストアの HA の設定 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP の messaging-activemq サブシステムでは、ブローカーがデータベースストアタイプで設定されている場合、JDBC HA 共有ストア機能をアクティブにします。その後、ブローカーは共有データベーステーブルを使用して、ライブサーバーおよびバックアップサーバーが共有 JDBC ジャーナルストアのアクションを確実に連携させます。
以下の属性を使用すると、JDBC 永続ストアの HA の設定が可能となります。
-
journal-node-manager-store-table: ノードマネージャーを格納する JDBC データベーステーブルの名前。 -
journal-jdbc-lock-expiration: キープアライブすることなく JDBC ロックが有効とみなされる期間。この属性値は秒単位で指定します。デフォルト値は、20秒です。 -
journal-jdbc-lock-renew-period: JDBC ロックのキープアライブサービスの時間。この属性値は秒単位で指定します。デフォルト値は、2秒です。
デフォルト値は、サーバーの ha-policy 属性と journal-datasource 属性の値に基づいて考慮されています。
後方互換性を保つために、各 Artemis 固有のシステムプロパティーを使用して値を指定することもできます。
-
brokerconfig.storeConfiguration.nodeManagerStoreTableName -
brokerconfig.storeConfiguration.jdbcLockExpirationMillis -
brokerconfig.storeConfiguration.jdbcLockRenewPeriodMillis
これらの Artemis 固有のシステムプロパティーは、設定すると、対応する属性のデフォルト値よりも優先されます。