[MariaDB] Galera 클러스터 구축6: 노드 강제 종료 시 복제와 Quorum 동작 이해
MariaDB Galera 클러스터를 운영하다 보면 노드 장애는 피할 수 없는 상황입니다. 정상적인 종료와 갑작스러운 전원 차단, 두 상황에서 클러스터가 어떻게 반응하는지 궁금하지 않으신가요?
이전 포스팅에서는 노드를 정상적으로 종료했을 때의 복제 과정을 다뤘습니다. 이번에는 예기치 못한 노드 장애 상황에서 Galera 클러스터가 어떻게 동작하는지, 그리고 핵심 개념인 Quorum이 무엇인지 실제 테스트를 통해 알아보겠습니다.
실습 환경 준비
테스트를 위한 환경 구성은 다음과 같습니다:
- 클러스터 구성: 3개 노드 (
mariadb1
,mariadb2
,mariadb3
) - 테스트 테이블:
inventory.products
- 시나리오: 노드 강제 종료 → Quorum 상실 → 복구 과정
1단계: 클러스터 상태 점검
먼저 모든 노드가 정상적으로 클러스터에 참여하고 있는지 확인해보겠습니다.
mysql> SHOW STATUS LIKE 'wsrep_cluster_size'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+
좋습니다! 3개 노드가 모두 정상 상태네요. 이제 테스트용 데이터를 하나 추가해보겠습니다.
mysql> INSERT INTO products VALUES (7, 'Desk Lamp', 15); Query OK, 1 row affected (0.01 sec)
다른 노드들에서도 데이터가 정상적으로 복제되었는지 확인해보세요. 모든 노드에서 동일한 데이터를 조회할 수 있을 것입니다.
2단계: 첫 번째 노드 강제 종료 테스트
이제 본격적인 테스트를 시작해보겠습니다. mariadb1
노드를 정상적인 shutdown 명령어가 아닌 강제 전원 차단 방식으로 종료해보겠습니다.
VM 환경에서 전원 강제 차단 (예: VirtualBox에서 '전원 끄기' 선택)
나머지 노드에서 클러스터 상태를 확인해보면:
mysql> SHOW STATUS LIKE 'wsrep_cluster_size'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+
클러스터 크기가 3에서 2로 줄어들었습니다. 이 상태에서 새로운 데이터를 삽입해볼까요?
mysql> INSERT INTO products VALUES (8, 'USB Hub', 25); Query OK, 1 row affected (0.02 sec)
놀랍게도 아무 문제없이 데이터가 삽입되고 복제됩니다! 바로 Quorum(과반수) 때문입니다. 3노드 중 2노드가 남아있어 과반수 조건을 만족하므로 클러스터가 정상 작동하는 것입니다.
3단계: Quorum 상실 실험 - 진짜 문제는 지금부터
이번에는 mariadb3
노드도 강제로 종료해보겠습니다. 그러면 mariadb2
노드 하나만 남게 됩니다.
# mariadb3 노드 강제 전원 차단
이제 mariadb2
에서 간단한 조회 쿼리를 실행해보겠습니다:
mysql> SELECT * FROM products; ERROR 1047 (08S01): WSREP has not yet prepared node for application use
조회조차 안 됩니다! 이것이 바로 Quorum 상실의 결과입니다.
Galera 클러스터는 과반수 원칙을 엄격하게 따릅니다. 3노드 클러스터에서 노드가 1개만 남으면 과반수(2개 이상)를 만족하지 못해 읽기와 쓰기 모두 차단됩니다. 이는 데이터 일관성을 보장하기 위한 안전장치입니다. 다만, 이는 비정상적인 상황에 해당하며, 노드가 정상적으로 종료된 경우에는 남은 단일 노드로도 Primary Component를 유지할 수 있습니다.
정상 종료 vs 강제 종료: 무엇이 다를까?
MariaDB Galera에서 노드 종료 방식에 따른 차이점을 정리해보겠습니다:
정상 종료 (systemctl stop mariadb
)
- 노드가 클러스터에 이탈 예정을 미리 알림
- 다른 노드들이 예상된 상황으로 인식
- Quorum을 유지하는 한 서비스 중단 없음
- 재시작 시 변경분만 동기화 (IST: Incremental State Transfer)
강제 종료 (전원 차단, 네트워크 단절)
- 클러스터가 예기치 못한 노드 손실로 인식
- 다른 노드들이 장애 상황으로 판단
- Quorum 상실 시 전체 서비스 중단
- 재시작 시 전체 데이터 재동기화 가능성 (SST: State Snapshot Transfer)
핵심 포인트: 정상 종료는 "계획된 유지보수"이고, 강제 종료는 "예상치 못한 장애"로 취급됩니다.
4단계: 클러스터 복구 과정
이제 노드들을 하나씩 복구해보겠습니다. 먼저 mariadb3
부터 시작하겠습니다.
$ sudo systemctl start mariadb
클러스터 상태를 확인해보면:
mysql> SHOW STATUS LIKE 'wsrep_cluster_size'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+
드디어 2노드로 복구되었습니다! 이제 쿼리도 정상적으로 실행됩니다:
mysql> SELECT * FROM products; +----+-------------+-------+ | id | name | price | +----+-------------+-------+ | 7 | Desk Lamp | 15 | | 8 | USB Hub | 25 | +----+-------------+-------+
새로운 데이터도 삽입해보겠습니다:
mysql> INSERT INTO products VALUES (9, 'External HDD', 40); Query OK, 1 row affected (0.01 sec)
마지막으로 mariadb1
도 재시작하겠습니다:
$ sudo systemctl start mariadb
모든 노드에서 데이터를 확인해보면:
mysql> SELECT * FROM products; +----+-------------+-------+ | id | name | price | +----+-------------+-------+ | 7 | Desk Lamp | 15 | | 8 | USB Hub | 25 | | 9 | External HDD| 40 | +----+-------------+-------+
장애 발생 후에도 모든 데이터가 정상적으로 복제되어 있습니다.
핵심 정리: Quorum과 클러스터 안정성
이번 실습을 통해 확인한 중요한 개념들을 정리해보겠습니다:
Quorum의 중요성
- Galera는 과반수 노드가 있어야만 정상 동작
- 과반수 미달 시 읽기/쓰기 모두 차단
- 데이터 일관성 보장을 위한 핵심 메커니즘
장애 대응 원칙
- 계획된 점검: 항상 정상 종료 명령어 사용
- 예상치 못한 장애: Quorum 유지 여부가 서비스 지속성 결정
- 복구 과정: 노드 재시작 시 자동 데이터 동기화
운영 시 고려사항
- 3노드 클러스터에서는 최대 1개 노드까지 장애 허용
- 5노드 클러스터에서는 최대 2개 노드까지 장애 허용
- 노드 수가 홀수인 것이 Quorum 계산에 유리
마무리
MariaDB Galera 클러스터는 매우 견고한 고가용성 솔루션이지만, Quorum 개념을 제대로 이해하지 못하면 예상치 못한 서비스 중단을 경험할 수 있습니다.
특히 운영 환경에서는 노드 점검 시 반드시 정상 종료 절차를 따르고, 전체 클러스터의 노드 수와 장애 허용 범위를 미리 계산해두는 것이 중요합니다.
관련 포스팅
- [MariaDB] Galera 클러스터 구축1: RHEL 8.8 기반 노드 3대 준비
- [MariaDB] Galera 클러스터 구축2: MariaDB 10.6 3대 설치
- [MariaDB] Galera 클러스터 구축3: Garela Cluster 환경 설정
- [MariaDB] Galera 클러스터 구축4: 복제 테스트 및 데이터 동기화 확인
- [MariaDB] Galera 클러스터 구축5: 노드 중지와 재시작 시 데이터 복제 동작 확인
댓글
댓글 쓰기