はじめに
以下のようにHADR構成のデータベースがある場合、クライアント側が接続先を変更せずともTAKEOVER時にスタンバイ側に切り替わるクライアント・リルート機能をを確認しました。
環境情報
- DB2 v11.5
- RHEL 7
サーバ側での事前確認
プライマリー側のデータベースにて"Alternate server hostname"と"Alternate server port number"を指定することでスタンバイ側の情報をクライアント側に伝達できるようにしておきます。
$ db2 "UPDATE ALTERNATE SERVER FOR DATABASE SAMPLE USING > HOSTNAME testserver2 > PORT 51000 > "
この状態でクライアント側からプライマリーに接続すると以下のようにDBの情報が確認できます。
$ db2 LIST DB DIRECTORY System Database Directory Number of entries in the directory = 1 Database 1 entry: Database alias = TEST Database name = SAMPLE Node name = TEST1 Database release level = 15.00 Comment = Directory entry type = Remote Authentication = SERVER Catalog database partition number = -1 Alternate server hostname = testserver2 Alternate server port number = 51000
HADRの切り替えを行う
スタンバイ側にて切り替えを行った後に
$ db2 "TAKEOVER HADR ON DATABASE SAMPLE"
クライアント側からデータベースに照会をかけると以下のメッセージが出力されます。これはコネクションプール使用時に接続が切れた際に出るもので、このメッセージが出たタイミングで正常に再接続が行われます。
$ db2 "select * from sales" SQL30108N A connection failed in an automatic client reroute environment. The transaction was rolled back. Host name or IP address: "testserver2". Service name or port number: "51000". Reason code: "1". Connection failure code: "2". Underlying error: "*". SQLSTATE=08506
確認としてnetstatを見るとスタンバイ側と接続が確立していて
$ netstat -an Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State ... tcp 0 0 X.X.X.X:51162 Y.Y.Y.Y:51000 ESTABLISHED
同じコマンドで照会をかけると今度は正しい結果が表示されます。
$ db2 "select * from sales" SALES_DATE SALES_PERSON REGION SALES ---------- --------------- --------------- ----------- ...
終わりに
TAKEOVERだけでは通信はプライマリー側との通信が切れるのみで
tcp 1 0 ...:51162 ...:51000 CLOSE_WAIT
データベースに再接続にいくタイミングでESTABLISHEDとなります。よってHADR時の初回接続を正常にするためにはアプリケーション側にて再接続を行う機構を入れる等の対応が考えられます。
以上、ご参考になれば幸いです。