1. DB2 HADR高可用概述
High Availability Disaster Recovery (HADR)是數據庫級別的高可用性數據複製機制。一個HADR環境需要兩臺數據庫服務器:主數據庫服務器(primary)和備用數據庫服務器(standby)。當主數據庫中發生事務操作時,會同時將日誌文件通過TCP/IP協議傳送到備用數據庫服務器,然後備用數據庫對接受到的日誌文件進行重放(Replay),從而保持與主數據庫的一致性。當主數據庫發生故障時,備用數據庫服務器可以接管主數據庫服務器的事務處理。此時,備用數據庫服務器作爲新的主數據庫服務器進行數據庫的讀寫操作,而客戶端應用程序的數據庫連接可以通過自動客戶端重新路由(Automatic Client Reroute)機制轉移到新的主服務器。當原來的主數據庫服務器被修復後,又可以作爲新的備用數據庫服務器加入HADR。通過這種機制,DB2 UDB實現了數據庫的災難恢復和高可用性,最大限度的避免了數據丟失。
下圖爲DB2 HADR的工作原理圖:
2. 高可用之間切換
正常情況下,HADR通過日誌自動同步:
當主庫異常時,備庫進行接管後,應用連接65.33時,自動連接到65.34:
3. 環境信息
本期採用2臺虛擬服務。
主機 | IP地址 | 配置 | 備註 |
cluster1 | 192.31.65.21 | 4C,16G | HADR集羣 |
cluster2 | 192.31.65.22 | 4C,16G |
4. 集羣環境部署
根據原環境,進行部署。主要增加集羣配置。詳細如下:
1、安裝系統包
yum install openssh-clients
yum install redhat-lsb
yum install ksh
yum install libaio
rpm -ivh compat-libstdc++-33-3.2.3-69.el6.x86_64.rpm
yum install compat-libstdc++-33-3.2.3-69.el6.i686.rpm
2、創建組和用戶
groupadd -g 101 dasadm1
groupadd -g 102 db2iadm1
groupadd -g 103 db2fadm1
useradd -m -u 500 -d /home/dasusr1 -g dasadm1 dasusr1 -p db2admin
useradd -m -u 501 -d /home/db2admin -g db2iadm1 db2admin -p db2admin
useradd -m -u 502 -d /home/db2fenc1 -g db2fadm1 db2fenc1 -p db2admin
3、修改網絡
vi /etc/hosts
192.31.65.21 cluster1
192.31.65.22 cluster2
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=cluster1
4、安裝數據庫軟件
./db2_install -b /opt/ibm/db2/v9.5/ -p ESE
5、安裝實例
/opt/ibm/db2/v9.5/instance/db2icrt -s ESE -a server -u db2fenc1 db2admin
6、環境變量配置
db2set DB2_EXTENDED_OPTIMIZATION=ON
db2set DB2_DISABLE_FLUSH_LOG=ON
db2set AUTOSTART=YES
db2set DB2_STRIPED_CONTAINERS=ON
db2set DB2_HASH_JOIN=Y
db2set DB2COMM=tcpip
db2set DB2_PARALLEL_IO=*
db2set DB2CODEPAGE=1386
------------------------如下是HADR配置------------------------
1、環境變量修改
#指定HADR BUF大小,通常HADR BUF是 LOG BUF的4倍。
db2set DB2_HADR_BUF_SIZE=16384
db2set DB2_LOAD_COPY_NO_OVERRIDE=NONRECOVERABLE
db2set DB2_HADR_PEER_WAIT_LIMIT=10
db2set DB2COMM=tcpip
db2set DB2RSHCMD=/usr/bin/ssh
2、參數修改
db2 "UPDATE DB CFG FOR sample USING LOGINDEXBUILD ON" #開啓此功能,在索引的創建、重建和重組記錄完整的信息,可能需要更多時間和更多的日誌空間。會將索引傳遞到備庫進行創建。如果不開啓,當備庫接管時,索引將被置爲無效。
db2 "UPDATE DB CFG FOR sample USING INDEXREC RESTART" #完成接管操作之後,重建無效索引。
修改實例參數:
db2 update dbm cfg using SVCENAME 50001
3、備份數據庫:
db2 "backup db sample online to /home/db2admin"
4、將備份數據傳送到備節點。
5、恢復數據庫
db2 "RESTORE DATABASE sample FROM "/home/db2admin" TAKEN AT 20170511172554 REPLACE HISTORY FILE WITHOUT PROMPTING"
[db2admin@cluster2 ~]$ db2 "RESTORE DATABASE sample FROM "/home/db2admin" TAKEN AT 20170511172554 REPLACE HISTORY FILE WITHOUT PROMPTING"
DB20000I The RESTORE DATABASE command completed successfully.
6、配置客戶端自動路由。
在主數據庫服務器(cluster21)上:
db2 "UPDATE ALTERNATE SERVER FOR DATABASE sample USING HOSTNAME 192.31.65.22 PORT 50001" #配置備用數據庫。
在備用數據庫服務器上(cluster2):
db2 "UPDATE ALTERNATE SERVER FOR DATABASE sample USING HOSTNAME 192.31.65.21 PORT 50001" #配置備用數據庫。
7、配置HADR服務和偵聽端口
用vi編輯/etc/services文件(需要切換到root用戶),加入下面兩行:
DB2_HADR_1 55001/tcp
DB2_HADR_2 55002/tcp
注:這一步不是必須的,因爲在下面配置HADR_LOCAL_SVC和HADR_REMOTE_SVC數據庫參數的時候可以直接使用端口號來替代服務名。
8、修改HADR相關參數參數
--修改主用數據庫
db2 "UPDATE DB CFG FOR sample USING HADR_LOCAL_HOST cluster1 "
db2 "UPDATE DB CFG FOR sample USING HADR_LOCAL_SVC DB2_HADR_1 "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_HOST cluster2 "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_SVC DB2_HADR_2 "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_INST db2admin "
db2 "UPDATE DB CFG FOR sample USING HADR_SYNCMODE NEARSYNC "
db2 "UPDATE DB CFG FOR sample USING HADR_TIMEOUT 120"
db2 "CONNECT TO sample"
db2 "QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS "
db2 "UNQUIESCE DATABASE sample"
db2 "CONNECT RESET"
#SYNC:同步,寫入備用數據庫上的日誌文件時,方纔認爲日誌寫入是成功的;NEARSYNC:接近同步,在此方式中,僅當日志記錄已寫入主數據庫上的日誌文件,而且主數據庫已接收到來自備用系統的應答;ASYNC:異步,日誌傳遞給主系統主機的 TCP 層時,不等待備庫相應,就認爲成功;SUPERASYNC,超異步,寫入主庫日誌,即認爲成功。
--修改備用數據庫
db2 "UPDATE DB CFG FOR sample USING HADR_LOCAL_HOST cluster2 "
db2 "UPDATE DB CFG FOR sample USING HADR_LOCAL_SVC DB2_HADR_2 "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_HOST cluster1 "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_SVC DB2_HADR_1 "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_INST db2admin "
db2 "UPDATE DB CFG FOR sample USING HADR_SYNCMODE NEARSYNC "
db2 "UPDATE DB CFG FOR sample USING HADR_TIMEOUT 120 "
9、啓用HADR。
--首先啓用備用數據庫關係:
db2 "DEACTIVATE DATABASE sample"
db2 "START HADR ON DATABASE sample AS STANDBY"
--然後啓用主庫HADR狀態:
db2 "DEACTIVATE DATABASE sample"
db2 "START HADR ON DATABASE sample AS PRIMARY"
#需要關閉防火牆,否則報錯:“SQL1768N Unable to start HADR. Reason code = "7".”
[db2inst1@sg1 ~]$ db2 "start hadr on database sample as primary
"
DB20000I The START HADR ON DATABASE command completed successfully.
10、查看HADR狀態:
#查看狀態爲 peer:
[db2inst1@sg1 ~]$ db2pd -d sample -hadr
Database Partition 0 -- Database sample -- Active -- Up 0 days 00:01:43 -- Date 2017-05-02-19.23.09.352187
HADR Information:
Role State SyncMode HeartBeatsMissed LogGapRunAvg (bytes)
Primary Peer Nearsync 0 0
ConnectStatus ConnectTime Timeout
Connected Tue May 2 19:21:27 2017 (1493724087) 120
LocalHost LocalService
sg1 DB2_HADR_1
RemoteHost RemoteService RemoteInstance
sg2 DB2_HADR_2 db2inst1
PrimaryFile PrimaryPg PrimaryLSN
S0000005.LOG 0 0x0000000002EE0000
StandByFile StandByPg StandByLSN
S0000005.LOG 0 0x0000000002EE0000
-------------------------------
--在客戶端,嘗試連接
#
--編目節點
db2 catalog tcpip node cluster1 remote 192.31.65.21 server 50001
--編目數據庫
db2 "catalog db sample at node cluster1"