4. Altibase Heartbeat 동작#
이장은 Altibase Heartbeat의 동작을 상세히 설명한다. Altibase Heartbeat가 장애를 판단하는 기준이 무엇인지, 장애를 감지한 후의 Failover는 어떻게 이루어지는지 살펴본다.
aheartbeat의 상태#
aheartbeat는 자신의 상태와 다른 aheartbeat의 상태를 각각 정의한다.
우선 aheartbeat 자신은 실행 상태에 따라 아래의 세가지 중 하나의 상태를 가진다.
-
Ready: aheartbeat 실행 전 상태
-
Run: aheartbeat가 실행되어 정상적으로 동작중인 상태
-
Error: 해당 노드에 장애가 발생한 상태
또한 aheartbeat는 다른 노드에 존재하는 aheartbeat의 상태를 아래 세가지 상태 중 하나로 정의한다.
-
Ready: 상대 노드의 aheartbeat와 최초 handshake를 하기 전
-
Run: 상대 노드의 aheartbeat와 성공적으로 handshake한 후 정상적으로 연결되는 상태
-
Error: 이전까지 Run 상태로 감지되던 상대 노드 aheartbeat에 접속이 불가능한 경우
한 상태에서 다른 상태로 전이되는 과정은 아래 그림과 같이 이루어진다.
[그림 4-1] aheartbeat 상태 전이
각각의 상태 전이는 아래 표와 같은 상황에서 발생한다.
[표 4-1] 상태 전이
상태 전이 | 설명 |
---|---|
(1) | aheartbeat 시작후 handshake 성공 |
(2) | 장애로 인해 aheartbeat 종료 |
(3) | 장애 후 aheartbeat 재시작후 handshake 재성공 |
(4) | aheartbeat 정상 종료 |
장애 판단#
이 절은 Altibase Heartbeat가 장애를 감지하기 위해 취하는 동작과 장애를 판단하는 기준은 무엇인지 살펴본다.
Altibase Heartbeat는 아래의 순서대로 감시를 진행하며, 세 가지 대상에 접속해서 장애를 감지한다. 또한 아래 표는 각 감시 대상 별로 접속이 불가능할 때 어떤 노드(로컬 또는 리모트 노드)에 장애가 발생한 것으로 판단하는지도 보여준다.
[표 4-2] 장애 판단
순서 | 감시 대상 | 노드 장애 판단 |
---|---|---|
1 | 0번 aheartbeat | 로컬 노드에 장애 발생 |
2 | 로컬 노드의 Altibase 서버 | 로컬 노드에 장애 발생 |
3 | 리모트 노드의 aheartbeat | 리모트 노드에 장애 발생 |
로컬 노드의 장애#
각 노드의 aheartbeat들이 위 표의 1번 또는 2번에서 장애를 감지하는 경우 로컬 노드에 장애가 발생한 것으로 판단한다.
각 노드의 aheartbeat들은 가장 먼저 외부 공용망에 존재하는 0번 aheartbeat를 감시하며 접속이 불가능할 때 로컬 노드에 장애가 발생한 것으로 판단하다. 이 경우 로컬 노드에 존재하는 Altibase 서버 자체의 장애 여부와는 상관없으며, Altibase 서버와 클라이언트간의 네트워크 장애로 인해 서비스가 불가능하다고 판단한다.
0 번 aheartbeat로의 접속이 정상이거나, 0번 aheartbeat가 없을 때에는 각 노드의 aheartbeat들은 로컬 노드에 존재하는 Altibase 서버를 감시하며 이에 접속이 불가능할 때 데이터베이스 장애로 판단한다. 이 경우 데이터베이스 자체 장애로 인해 서비스가 불가능하다고 판단한다.
위의 두 감시 대상에서 장애가 발생한 것을 인지하면, aheartbeat는 로컬 노드 failover 수행 파일을 시작하고 스스로 종료한다.
리모트 노드의 장애#
각 노드의 aheartbeat들이 위 표의 3번에서 장애를 감지하는 경우 리모트 노드에 장애가 발생한 것으로 판단한다. 즉, RUN 상태로 파악된 다른 노드의 aheartbeat에 접속이 불가능하다면 그 노드에 장애가 발생한 것으로 판단하고 리모트 노드 failover 수행 파일을 시작한다.
참고: 로컬 노드에 장애가 발생하면 그 노드의 aheartbeat는 스스로 종료하기 때문에, 다른 노드의 aheartbeat들은 그 노드의 aheartbeat에 접속할 수 없다. 따라서 리모트 노드의 Altibase 서버에 장애가 발생한 것으로 판단한다.
0번 aheartbeat의 역할#
0번 aheartbeat가 분산 데이터베이스 환경에서 하는 역할과 특징은 아래와 같다.
-
0번 aheartbeat는 자기 노드의 Altibase 서버를 감시하지 않는다.
-
ID가 0이 아닌 노드의 aheartbeat가 0번 aheartbeat에 접속하는 것으로 외부망과 단절되었는지 여부를 파악할 수 있다. 외부망과 단절되었다는 것은 클라이언트와 접속이 끊어졌다는 것을 의미한다.
아래는 분산 데이터베이스 환경에서 0번 aheartbeat가 구축되었는지 여부에 따라 장애 감지 결과가 어떻게 달라지는지 살펴본다.
0번 aheartbeat가 없을 때#
aheartbeat가 내부망 안에서만 구축된 분산 데이터베이스 환경에서 네트워크 연결에 장애가 발생한 경우를 가정해 보자.
[그림 4-2] 내부망과 외부망 사이의 네트워크 장애 발생
위 그림에서처럼 노드 A와 외부망 사이에서 네트워크에 장애가 발생하는 경우, 노드 A의 aheartbeat는 클라이언트에 서비스를 할 수 없는 상황이다. 하지만 네트워크 장애를 감지하지 못하여 aheartbeat가 계속 동작한다. 이로 인해 노드 B의 aheartbeat 역시 노드 A의 데이터베이스 서비스에 문제가 발생한 것을 감지할 수 없고, 노드 A를 failover 하지 않는다.
0번 aheartbeat가 있을 때#
aheartbeat가 외부망에 존재하는 분산 데이터베이스 환경에서 네트워크 연결에 장애가 발생한 경우를 가정해 보자.
[그림 4-3] 내부망과 외부망 사이의 네트워크 장애 발생
위 그림에서처럼 노드 A와 외부망 사이에 네트워크에 장애가 발생하는 경우, 노드 A의 aheartbeat는 0번 aheartbeat에 접속이 불가능하다. 따라서 노드 A의 aheartbeat는 로컬 노드에 장애가 발생한 것으로 판단하여, 스스로 종료하고 다른 노드에서 본인의 장애를 감지할 수 있도록 한다. 결국 노드 B의 aheartbeat는 노드 A의 aheartbeat에 접속을 할 수 없으므로 노드 A를 failover하기 위해 리모트 노드 failover 수행 파일을 실행한다.
위의 두 예시에서 보듯이 0번 aheartbeat가 있다면 내부망과 외부망 사이에 발생하는 네트워크 장애까지 감지할 수 있으므로 무정지 데이터베이스 서비스를 더욱 강화할 수 있다.
Failover와 Failback#
Failover#
DBA가 좀 더 효율적으로 failover를 수행하기 위하여, aheartbeat는 장애를 감지하면 다음 2개의 인자와 함께 failover 수행 파일을 실행한다.
인자 | 설명 |
---|---|
첫 번째 인자 | 장애가 일어난 노드의 개수 |
두 번째 인자 | 장애가 일어난 노드의 ID들. 공백으로 구분하여 오름차순으로 지정. |
예를 들어 ID가 각각 1, 2, 3, 4, 5인 다섯 개의 노드에 Altibase 서버와 aheartbeat가 실행 중인 분산 환경에서, ID가 3인 노드의 Altibase 서버에 장애가 발생했다고 가정하자. ID가 3인 노드의 aheartbeat가 자기 노드의 Altibase 서버에 장애를 감지하면, 아래와 같이 로컬 노드 failover 스크립트를 실행하고 자신은 종료한다.
altibaseFailureEvent.sh 1 3
그리고 나머지 노드의 aheartbeat들은 ID가 3인 노드의 aheartbeat가 종료된 것을 감지한 후 아래와 같이 리모트 노드 failover 스크립트를 실행한다.
remoteNodeFailureEvent.sh 1 3
ID 3 노드의 장애 상황에서 또다시 ID 1인 노드의 Altibase 서버에 장애가 발생하면 아래와 같은 인자와 함께 failover 스크립트를 실행한다.
altibaseFailureEvent.sh 2 1 3
remoteNodeFailureEvent.sh 2 1 3
즉, 두 개의 서버에 장애가 발생했으며 그 ID는 1과 3이라는 것을 의미한다.
Failback#
장애가 발생한 노드가 복구된 후의 failback은 사용자가 수동으로 수행해야 한다.
로깅#
Altibase Heartbeat는 동작 중에 아래와 같은 정보를 로그 파일에 기록한다.
-
aheartbeat 시작 정보
-
Altibase 서버로의 접속 실패 정보
-
다른 노드로 접속 시작 정보
-
Altibase 서버 및 다른 노드의 aheartbeat 장애 상황 정보
-
각 노드의 aheartbeat 상태 변화 정보
로그 파일은 $ALTI_HBP_HOME/log/aheartbeat.log로 고정되어 있다.
로그 정보의 출력 형식은 다음과 같다.
[YYYY-MM-DD HH:MM:SS T-<threadID>] Log Body