DB2의 HADR은 로그 기반으로 동작하고, DB2 ESE 버전에서 단일 노드에 대해서만 동작합니다.
DB2 HADR을 구성하고 테스트하기 위하여 Linux머신 2대를 아래와 같이 HADR로 구성하였습니다.
서버 구성
Blue01을 Primary로 구성하였고, Blue02를 Standby로 구성하였습니다.
그리고 두서버에 모두 상대서버를 Alertnate Server로 구성하여 클라이언트가 접속이 끊겼을때 상대 서버를 찾을
수 있도록 구성하였습니다.
- Primary 서버 (Blue01)
[db2hard@Blue01 ~]$ db2 list db directory
System Database Directory
Number of entries in the directory = 1
Database 1 entry:
Database alias = SAMPLE
Database name = SAMPLE
Local database directory = /home/db2hard
Database release level = a.00
Comment =
Directory entry type = Indirect
Catalog database partition number = 0
Alternate server hostname = Blue02
Alternate server port number = 51000
[db2hard@Blue01 ~]$ db2 get db cfg for sample |grep HADR
HADR database role = PRIMARY
HADR local host name (HADR_LOCAL_HOST) = Blue01
HADR local service name (HADR_LOCAL_SVC) = hard_services
HADR remote host name (HADR_REMOTE_HOST) = Blue02
HADR remote service name (HADR_REMOTE_SVC) = hard_services
HADR instance name of remote server (HADR_REMOTE_INST) = db2hard
HADR timeout value (HADR_TIMEOUT) = 120
HADR log write synchronization mode (HADR_SYNCMODE) = SYNC
- Standby 서버 (Blue02)
[db2hard@Blue02 ~]$ db2 list db directory
System Database Directory
Number of entries in the directory = 1
Database 1 entry:
Database alias = SAMPLE
Database name = SAMPLE
Local database directory = /home/db2hard
Database release level = a.00
Comment =
Directory entry type = Indirect
Catalog database partition number = 0
Alternate server hostname = Blue01
Alternate server port number = 51000
[db2hard@Blue02 ~]$ db2 get db cfg for sample |grep HADR
HADR database role = STANDBY
HADR local host name (HADR_LOCAL_HOST) = Blue02
HADR local service name (HADR_LOCAL_SVC) = hard_services
HADR remote host name (HADR_REMOTE_HOST) = Blue01
HADR remote service name (HADR_REMOTE_SVC) = hard_services
HADR instance name of remote server (HADR_REMOTE_INST) = db2hard
HADR timeout value (HADR_TIMEOUT) = 120
HADR log write synchronization mode (HADR_SYNCMODE) = SYNC
위의 설정정보에서 확인한것 같이 Blue01과 Blue02가 Peer상태로 정상 동작하고 있는 것을 확인할 수 있습니다.
클라이언트 연결 및 Query 실행
클라이언트는 테스트의 편의를 위하여 CLP를 사용하였습니다.
C:\Program Files\IBM\SQLLIB\BIN>db2 connect to hadr_sam user db2hard
db2hard의 현재 암호를 입력하십시오.
데이터베이스 연결 정보
데이터베이스 서버 = DB2/LINUX 8.2.7
SQL 권한 부여 ID = DB2HARD
로컬 데이터베이스 별명 = HADR_SAM
C:\Program Files\IBM\SQLLIB\BIN>db2 "select * from employee fetch first 1 rows o
nly"
EMPNO FIRSTNME MIDINIT LASTNAME WORKDEPT PHONENO HIREDATE JOB
EDLEVEL SEX BIRTHDATE SALARY BONUS COMM
------ ------------ ------- --------------- -------- ------- ---------- --------
------- --- ---------- ----------- ----------- -----------
000010 CHRISTINE I HAAS A00 3978 1965-01-01 PRES
18 F 1933-08-24 52750.00 1000.00 4220.00
1 레코드가 선택됨.
정상적으로 Primary서버(Blue01)에 정사적으로 로그인 되고, Query가 정상 수행 되었습니다.
Primary서버(Blue01) 이상발생
Primary서버(Blue01)에 이상을 발생시키기 위해 db2sysc 프로세스를 강제 종료합니다.
[db2hard@Blue01 ~]$ ps -ef |grep db2sysc
db2hard 19260 19259 0 01:34 ? 00:00:00 db2sysc 0
db2hard 2574 1166 0 11:24 pts/0 00:00:00 grep db2sysc
[db2hard@Blue01 ~]$ kill -9 19260
Primary서버(Blue01) 이상 발생 클라이언트 동일 Query 실행시 계속 대기합니다.
C:\Program Files\IBM\SQLLIB\BIN>db2 "select * from employee fetch first 1 rows o
nly"
클라이언트 대기 상태
Standby서버(Blue02) 상태 확인 및 인계작업 수행
Standby서버(Blue02) 인계작업 수행전에 우선 Standby서버의 HADR상태를 확인합니다.
HADR Status
Role = Standby
State = Remote catchup pending
Synchronization mode = Sync
Connection status = Disconnected, 03/03/2007 11:25:40.214866
Heartbeats missed = 0
Local host = Blue02
Local service = hard_services
Remote host = Blue01
Remote service = hard_services
Remote instance = db2hard
timeout(seconds) = 120
Primary log position(file, page, LSN) = S0000002.LOG, 37, 00000000017959D5
Standby log position(file, page, LSN) = S0000002.LOG, 37, 00000000017959D5
Log gap running average(bytes) = 0
Standby서버(Blue02)의 상태는 현재 Primary서버(Blue01)과 연결이 끊어져서 현재 Remote catchup Pending 상태입니다.
Primary서버와 Standby서버가 연결이 종료되었을 경우는 TAKEOVER작업에 BY FORCE 옵션을 사용하여 인계작업을 수행합니다.
[db2hard@Blue02 ~]$ db2 "TAKEOVER HADR on DATABASE SAMPLE BY FORCE"
DB20000I The TAKEOVER HADR on DATABASE command completed successfully.
정상적으로 TAKEOVER작업이 수행된 후에 클라이언트 Query 결과가 아래와 같이 출력됩니다.
C:\Program Files\IBM\SQLLIB\BIN>db2 "select * from employee fetch first 1 rows o
nly"
SQL30108N 연결이 실패했으나 다시 연결되었습니다. 호스트 이름 또는 IP 주소는
"Blue02"이고 서비스 이름 또는 포트 번호는 "51000"입니다. 특수 레지스터는 다시
시도되거나 시도되지 않을 수 있습니다(이유 코드 = "1"). SQLSTATE=08506
위와 같이 결과가 출력되면 다시 동일 Query 수행시 Blue02서버로 접속이 연결되어 정상적으로 Query가 실행됩니다.
C:\Program Files\IBM\SQLLIB\BIN>db2 "select * from employee fetch first 1 rows o
nly"
EMPNO FIRSTNME MIDINIT LASTNAME WORKDEPT PHONENO HIREDATE JOB
EDLEVEL SEX BIRTHDATE SALARY BONUS COMM
------ ------------ ------- --------------- -------- ------- ---------- --------
------- --- ---------- ----------- ----------- -----------
000010 CHRISTINE I HAAS A00 3978 1965-01-01 PRES
18 F 1933-08-24 52750.00 1000.00 4220.00
1 레코드가 선택됨.
그리고 Standby서버 역확을 수행했던 Blue02 서버에서 클라이언트의 연결을 확인할 수 있습니다.
[db2hard@Blue02 ~]$ db2 list applications
Auth Id Application Appl. Application Id DB # of
Name Handle Name Agents
-------- -------------- ---------- ------------------------------ -------- -----
DB2HARD db2bp.exe 844 C0A8018F.H60E.00BE83021856 SAMPLE 1
마지막으로 Blue02서버의 HADR의 상태 변경을 확인하면 됩니다.
HADR Status
Role = Primary
State = Disconnected
Synchronization mode = Sync
Connection status = Disconnected, 03/03/2007 11:25:40.214866
Heartbeats missed = 0
Local host = Blue02
Local service = hard_services
Remote host = Blue01
Remote service = hard_services
Remote instance = db2hard
timeout(seconds) = 120
Primary log position(file, page, LSN) = S0000002.LOG, 38, 0000000001796057
Standby log position(file, page, LSN) = S0000000.LOG, 0, 0000000000000000
Log gap running average(bytes) = 0
Standby역활로 실행되었던 Blue02서버가 현재 Primary서버의 이상으로 인계작업을 수행하여
Primary역활로 변경된 것을 확인할 수 있으며 상태는 Disconnected입니다.
- 현재상태로 계속해서 시스템의 운영이 가능합니다.
아래에 나오는 작업을 복구를 위한 작업입니다.
인계작업 완료후 복구 작업
Blue01 서버에서 DB2 Instance를 다시 시작하고 HADR을 Standby로 시작합니다.
[db2hard@Blue01 ~]$ db2start
03/03/2007 11:43:32 0 0 SQL1063N DB2START processing was successful.
SQL1063N DB2START processing was successful.
[db2hard@Blue01 ~]$ db2 "START HADR on DATABASE SAMPLE AS STANDBY"
SQL1766W The command completed successfully. However, LOGINDEXBUILD was not
enabled before HADR was started. SQLSTATE=00000
Primary 서버(Blue02) 상태 확인
HADR Status
Role = Primary
State = Peer
Synchronization mode = Sync
Connection status = Connected, 03/03/2007 11:45:02.582553
Heartbeats missed = 0
Local host = Blue02
Local service = hard_services
Remote host = Blue01
Remote service = hard_services
Remote instance = db2hard
timeout(seconds) = 120
Primary log position(file, page, LSN) = S0000002.LOG, 38, 0000000001796057
Standby log position(file, page, LSN) = S0000002.LOG, 38, 0000000001796057
Log gap running average(bytes) = 51912
Standby 서버(Blue01) 상태 확인
HADR Status
Role = Standby
State = Peer
Synchronization mode = Sync
Connection status = Connected, 03/03/2007 11:43:53.856276
Heartbeats missed = 0
Local host = Blue01
Local service = hard_services
Remote host = Blue02
Remote service = hard_services
Remote instance = db2hard
timeout(seconds) = 120
Primary log position(file, page, LSN) = S0000002.LOG, 38, 0000000001796057
Standby log position(file, page, LSN) = S0000002.LOG, 38, 0000000001796057
Log gap running average(bytes) = 33156
최초에 역활과 반대로 지금은 Blue02서버가 Primary 역활을 수행하고 있으며, Blue01서버가 Standby역확을 수행하고 있습니다. 그리고 상태도 Peer상태로 정상적으로 운영되고 있습니다.
현재 상태로 운여하다가 다시 Standby 서버(Blue01)에서 TAKEOVER 작업을 수행하여 원래의 구성으로 돌아갈 수 있습니다.
TAKEOVER 작업을 통한 역활 변경
[db2hard@Blue01 ~]$ db2 "TAKEOVER HADR on DATABASE SAMPLE"
DB20000I The TAKEOVER HADR on DATABASE command completed successfully.
Primary 서버(Blue01) 상태 확인
HADR Status
Role = Primary
State = Peer
Synchronization mode = Sync
Connection status = Connected, 03/03/2007 11:43:53.856276
Heartbeats missed = 0
Local host = Blue01
Local service = hard_services
Remote host = Blue02
Remote service = hard_services
Remote instance = db2hard
timeout(seconds) = 120
Primary log position(file, page, LSN) = S0000002.LOG, 38, 00000000017966C9
Standby log position(file, page, LSN) = S0000002.LOG, 38, 00000000017966C9
Log gap running average(bytes) = 872
Standby 서버(Blue02) 상태 확인
HADR Status
Role = Standby
State = Peer
Synchronization mode = Sync
Connection status = Connected, 03/03/2007 11:45:02.582553
Heartbeats missed = 0
Local host = Blue02
Local service = hard_services
Remote host = Blue01
Remote service = hard_services
Remote instance = db2hard
timeout(seconds) = 120
Primary log position(file, page, LSN) = S0000002.LOG, 38, 00000000017966C9
Standby log position(file, page, LSN) = S0000002.LOG, 38, 00000000017966C9
Log gap running average(bytes) = 820
처음 Test를 시작할 때의 상태로 복원 되었습니다.
Client 연결확인
[db2hard@Blue01 ~]$ db2 list applications
Auth Id Application Appl. Application Id DB # of
Name Handle Name Agents
-------- -------------- ---------- ------------------------------ -------- -----
DB2HARD db2bp.exe 19 C0A8018F.HC0E.00BE83023817 SAMPLE 1
클라이언트 연결도 Blue01서버로 다시 연결된것을 확인할 수 있습니다.
이상과 같이 DB2 HADR의 Primary서버의 문제발생시 Standby서버로의 인계작업 수행 및 복원 과정 그리고
클라이언트의 연결 변경과정을 확인하여 보았습니다.
그래도 문제가 있죠.. ㅋㅋㅋ 자동으로 인계작업을 발생했으면 좋으련만 Standby서버는 Rollforward 상태로
남아 있기 때문에 항상 TAKEOVER 작업을 수행해야만 접속이 가능하다는 문제가 있네요.
[db2hard@Blue02 ~]$ db2 get snapshot for database on sample
Database Snapshot
Database name = SAMPLE
Database path = /home/db2hard/db2hard/NODE0000/SQL00001/
Input database alias = SAMPLE
Database status = Rollforward
그래도 문제 발생시 시스템 전체를 다시 시작하거나 또는 DB2 Instance 다시 시작등과 같이 오랜시간 동안의 작업을 대신하여 빠른 시간에 TAKEOVER작업을 수행할 수 있다는 장점과 Client연결을 Alertnate Server기능을 사용하여 유지하고클라이언트 사용자의 접속을 유지할 수 있다는 장점은 좋은것 같습니다.