nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

JBoss ASのデータソースフェイルオーバ

JBoss Advent Calendar 2011の11日目のエントリです。

もしデータ複製(レプリケーション)しているデータベースサーバが2台以上あり、利用している1台にアクセスできなくなったら2台目にアクセスするようにしたい、というフェイルオーバ要件がある場合、JBossのデータソースフェイルオーバ機能が利用できます。

JBossのデータソースフェイルオーバ機能の設定は非常に単純で、以下のように接続URLを要素で指定した区切り文字で区切って並べれば良いだけです。

<connection-url>jdbc:postgresql://nodeXXX:5432/foo|jdbc:postgresql://nodeYYY:5432/foo</connection-url>
<url-delimiter>|</url-delimiter>

上記ではnodeXXXとnodeYYYという2つのデータベースサーバを指定しています。

データソースフェイルオーバを設定していても、最初の動作は通常のデータソースとほぼ変わりありません。まずは最初に指定されているデータベースnodeXXXへ接続を試行します。データソースフェイルオーバでは「プライマリ接続先」という概念があり、この時点ではnodeXXXがプライマリ接続先となります。プライマリ接続先に接続できなかった場合、プライマリ接続先の次の接続URLへフェイルオーバし、接続を試行します。上記の例ではnodeYYYであり、プライマリ接続先がnodeYYYとなります。さらにnodeYYYに接続できなくなった場合はまたnodeXXXへ接続を試行します。もしプライマリ接続先への接続障害発生時に、すべてのフェイルオーバ先の接続先にも試行したけど繋がらない=全滅というシナリオの場合は通常のデータソースの接続失敗と同じく例外が発生します。

残念ながらnodeXXXとnodeYYYへ交互にアクセスを分散させる、というようなロードバランス機能はサポートしていません。しかし、それほど難しい機能ではないはずなので、たとえば普通にデータソースを複数定義しておき、アプリケーション側で複数のデータソースを状況によって使い分ける(ロードバランスやフェイルオーバ)ようなコードは比較的簡単に簡単に書けるでしょう。JBoss ASのデータソースフェイルオーバで提供されている以上のデータソースアクセス要件などがある場合はそのようなクラスを書けば良いと思います。