Oracle DBでtnsnames.oraを使ってフェイルオーバー(もしくは負荷分散)を行う。

基本的にマニュアルの通りですが、Oracle DBの場合接続文字列を変えるだけでフェイルオーバー(もしくは負荷分散)を行えます。

docs.oracle.com

複数をどう切り替えるかというと、(FAILOVER=on)もしくは(LOAD_BALANCE=on)をつけるだけ。 どのサーバー間で切り替えるかを設定するのは、ServiceNameが同じ場合はADDRESS_LISTを使用してサーバーのアドレスを切り替えて、ServiceNameが違う場合はDESCRIPTION_LISTで切り替えます。

net_service_name= 
 (DESCRIPTION_LIST=
    (LOAD_BALANCE=on)
    (FAILOVER=off)
    (DESCRIPTION=(ADDRESS=~~~
    )
    (DESCRIPTION=(ADDRESS=~~~
net_service_name= 
(DESCRIPTION=
  (ADDRESS_LIST=
    (LOAD_BALANCE=on)
    (FAILOVER=off)
    (ADDRESS=~~~
    (ADDRESS=~~~
  )
  (SERVICE_NAME=service_name))
)

JDBCでtnsnames.oraを読み込む

接続文字列をJDBC接続文字列に直接書き込むかtnsnames.oraの場所を変数として渡してあげる必要があります。

-Doracle.net.tns_admin=TNS_NAMES_ORA_DIRECTORY

docs.oracle.com

使うべきなのか?

正直、使わない方が良いと思います。 正系のOracle DBが生きてるか死んでるかよくわからない場合に正しく動かないだろうというのと、結局監視側で一括して生死判定した方が良いよねぇということで、DNSサーバー立ててそこで切り替えた方がよさそう。

マニュアルには(FAILOVER=on)と(LOAD_BALANCE=on)の両方を有効にした場合の挙動として以下のような記述があります。 接続ごとに毎回この挙動が発生することが許せるなら使えばいいんじゃないかな。。。

クライアントは、ADDRESS_LISTを無作為に選択し、選択したADDRESS_LISTに障害がある場合、他方にフェイルオーバーするように指示されます。この指示は、LOAD_BALANCEパラメータとFAILOVERパラメータがonに設定されていることで示されます。

なんでもかんでもDBが機能持ってたほうが良かったという時代の名残なのかなぁ。