(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Db2】HADR構成のDBでクライアントリルートの動きを確認する

スポンサーリンク

はじめに

以下のように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時の初回接続を正常にするためにはアプリケーション側にて再接続を行う機構を入れる等の対応が考えられます。

以上、ご参考になれば幸いです。