저번 포스팅에 이어 본격적으로 Galera Cluster를 구성해보자.
Galera Cluster 생성
0. 사전 과정(모든 노드에 실행) - 선택
만약 나처럼 전 포스팅 과정들을 거친 후 갈레라 클러스터를 바로 구성하면 MariaDB가 중복 실행 되어 스토리지 락 문제가 발생되어 갈레라 클러스터가 정상적으로 구성되지 않는다.
따라서, 갈레라 클러스터를 구성해주기 전에 안전하게 미리 다음 내용들을 확인해주자.
먼저 기존 MariaDB 프로세스가 떠있는지 확인해준다.
ps aux | grep mariadbd
ps aux | grep mysqld
ps aux | grep galera
위와 같이 했을 때 나오는 해당 프로세스들을 kill -9 [PID] 명령어를 통해 종료시켜준다.
그리고 아래 명령어를 통해 남아있는 락 파일을 제거해준다.
sudo rm -f /var/lib/mysql/aria_log_control
sudo rm -f /var/lib/mysql/ibdata1.lock
cf. 락파일이란?
특정 리소스를 한 번에 하나의 프로세스만 사용하도록 제한하기 위한 잠금 장치다. MariaDB나 Galera 클러스터에서 락 파일은 주로 중복 실행 방지와 데이터 무결성 유지를 위해 사용된다.
또한 기존에 혹시라도 Galera Cluster를 구성한 적이 있다면 갈레라 클러스터 관련된 캐시들을 다음 명령어를 통해 삭제해준다. 만약 Glaera Cluster 구성 중 오류가 발생하여 다시 클러스터를 재구성하는 경우에도 아래 명령어들을 통해 캐시를 삭제해주고 재구성해주는 것이 오류가 발생하지 않는다.
# 상태 파일 및 캐시 삭제
sudo rm -f /var/lib/mysql/grastate.dat
sudo rm -rf /var/lib/mysql/galera.cache
sudo rm -rf /var/lib/mysql/gvwstate.dat
1. 첫번째 노드(galera_node1) 클러스터 부트스트랩
첫 번째 노드인 galera_node1 컨테이너에서 --wsrep-new-cluster 옵션을 사용하여 MariaDB를 시작한다. 참고로, 나는 지금 컨테이너 환경에서 galera cluster를 구성 중이므로 명령어가 상이할 수 있지만, 일반적인 서버 상황에서의 명령어들은 MariaDB 공식 홈페이지에 나와 있으므로 해당 사이트에서 확인하면 된다. (컨테이너 환경이 systemctl 명령어도 안먹히고 은근 일반 서버에 리눅스 올려서 사용하는 것과는 다른 부분들이 있다..)
아래 명령어를 통해 새로운 galera cluster를 구성해준다.
# galera_node1 내부에서 실행
mysqld --wsrep-new-cluster --user=mysql > /var/log/mysql.log 2>&1 &
- --wsrep-new-cluster: 최초 클러스터 시작 플래그
- --user=mysql: mysqld 프로세스를 mysql 사용자 권한으로 실행
- > /var/log/mysql.log 2>&1: 출력과 에러 로그를 /var/log/mysql.log에 저장
- &: 백그라운드 실행
cf. --user 옵션을 root로 설정하면 오류가 발생하므로 mysql로 설정해준다.
명령어를 실행한 후에는 ps -ef | grep mysqld 명령어를 통해 MariaDB 서비스가 잘 올라왔는지 확인해주자.

2. 두번째(galera_node2), 세번째 노드(galera_node3) 갈레라 클러스터 조인
마찬가지로 아래 명령어를 통해 1번에서 생성한 갈레라 클러스터에 galera_node2, galera_node3를 조인해준다.
# galera_node2, galera_node3에서 실행
mysqld --user=mysql > /var/log/mysql.log 2>&1 &
명령어 실행 후에는 아래와 같이 정상적으로 서비스가 실행되고 있는지 확인해준다.


Galera Cluster 구성 확인
위 과정들을 통해 Galera Cluster를 구성했으면 다음 명령어를 통해 정상적으로 구성이 됐는지 확인해준다.
# 모든 노드에서 실행
mysql -u root -p
SHOW STATUS WHERE Variable_name IN (
'wsrep_cluster_status',
'wsrep_cluster_size',
'wsrep_local_state_comment',
'wsrep_ready'
);
모든 컨테이너에서 다음과 같이 확인되면 정상적으로 구성 된 것이다.

Galera Cluster 상세 정보 확인
Galera Cluster에 대한 상세 정보는 MariaDB에 접속한 후 SHOW STATUS LIKE 'wsrep%'; 명령어를 통해 확인할 수 있다.
해당 명령어를 통해 출력되는 정보들에 대해 다음과 같이 간단히 정리해보았다.
클러스터 전반 정보
| 항목 | 설명 |
| wsrep_cluster_status | 클러스터 전체의 상태 (Primary면 정상) |
| wsrep_cluster_size | 클러스터에 참여 중인 노드 수 |
| wsrep_cluster_state_uuid | 클러스터 UUID (모든 노드가 같아야 정상) |
| wsrep_cluster_conf_id | 클러스터 구성 변경 횟수 (노드 추가/이탈 등) |
| wsrep_incoming_addresses | 연결된 노드들의 IP 목록 (AUTO로 뜨면 내부 DNS 해석 실패일 수 있음) |
| wsrep_connected | 클러스터와 연결됨 (ON이면 정상) |
| wsrep_ready | 노드가 클러스터에 참여해서 쿼리를 처리할 준비 완료 상태 |
현재 노드 상태 정보
| 항목 | 설명 |
| wsrep_local_state | 숫자 상태 코드 (4 = Synced) |
| wsrep_local_state_comment | 현재 노드의 상태 (Synced면 정상) |
| wsrep_local_commits | 이 노드에서 커밋된 트랜잭션 수 |
| wsrep_local_cert_failures | 인증 실패 수 (충돌 난 트랜잭션 수, 많으면 문제) |
| wsrep_local_bf_aborts | 백업 중단된 트랜잭션 수 (동시 쓰기 충돌로 인한 abort) |
클러스터 통신 및 흐름 제어
| 항목 | 설명 |
| wsrep_received | 다른 노드로부터 수신한 트랜잭션 수 |
| wsrep_replicated | 이 노드에서 다른 노드로 전파한 트랜잭션 수 |
| wsrep_local_send_queue, recv_queue | 내부 메시지 큐 상태 (0이면 양호) |
| wsrep_flow_control_active | 흐름 제어 활성 여부 (false면 OK) |
| wsrep_flow_control_paused | 클러스터가 멈춘 시간 비율 (0에 가까울수록 좋음) |
동작 특성 및 기능
| 설명 | 설명 |
| wsrep_provider_name | 사용 중인 Galera 엔진 (Galera) |
| wsrep_provider_version | Galera 라이브러리 버전 |
| wsrep_protocol_version | 클러스터 프로토콜 버전 |
| wsrep_provider_capabilities | Galera가 지원하는 기능들 (MULTI_MASTER, CAUSAL_READ, PARALLEL_APPLYING, STREAMING 등) |
| wsrep_applier_thread_count, rollbacker_thread_count | 트랜잭션 적용용 쓰레드 수 |
상태 확인 시 주로 보는 핵심 항목 10개
| 변수 | 의미 | 정상값 |
| wsrep_cluster_status | 클러스터 상태 | Primary |
| wsrep_cluster_size | 노드 수 | 기대 노드 수 (ex. 3) |
| wsrep_local_state_comment | 현재 노드 상태 | Synced |
| wsrep_ready | 쿼리 처리 가능 여부 | ON |
| wsrep_connected | 클러스터 연결 상태 | ON |
| wsrep_local_cert_failures | 충돌 횟수 | 0이면 이상적 |
| wsrep_local_bf_aborts | 트랜잭션 충돌로 인한 abort 수 | 0이면 좋음 |
| wsrep_replicated | 전파된 트랜잭션 수 | 증가 중이면 OK |
| wsrep_received | 수신 트랜잭션 수 | 증가 중이면 OK |
| wsrep_flow_control_active | 흐름 제어 여부 | false |
Galera Cluster 테스트
클러스터의 컨테이너들 간의 데이터 동기화가 정상적으로 이루어지는지 galera_node1의 MariaDB에 테스트 데이터를 넣어보고 galera_node2 MariaDB에서 테스트 데이터가 존재하는지 확인해본다. 또한 galera_node3에서 넣은 데이터가 galera_node1에서도 잘 보이는지도 확인해보자.
1. galera_node1 MariaDB에서 데이터베이스와 테이블을 생성한다.
# galera_node1 MariaDB에서 실행
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE messages (id INT AUTO_INCREMENT PRIMARY KEY, text VARCHAR(255));
INSERT INTO messages (text) VALUES ('Hello from node1!');

2. galera_node2에서 MariaDB에 연결하고 테스트 데이터베이스와 테이블을 확인한다.
# galera_node2 MariaDB에서 실행
SHOW DATABASES;
USE test_db;
SELECT * FROM messages;

3. galera_node3에서 MariaDB를 연결하고 데이터를 삽입해준다.
# galera_node3 MariaDB에서 실행
INSERT INTO messages (text) VALUES ('Hello from node3!');

4. galera_node1 MariaDB에서 3번에서 넣은 데이터를 확인해본다.
# galera_node1 MariaDB에서 실행
USE test_db;
SELECT * FROM messages;

위의 과정들을 통해 galera_node1, galera_node2, galera_node3의 MariaDB 간의 데이터 동기화가 잘 되고 있는 것을 확인할 수 있다.
드디어 Galera Cluster 구성 자체는 끝이 났다. 이제는 이 Galera Cluster를 어떻게 활용해야 고가용성을 구현하고 실제 운영 환경에서 어떻게 운용해야 할지에 대해 고민을 해봐야 한다. 다음 포스팅에서는 이번에 구축한 Galera Cluster를 통해 어떻게 고가용성을 실현시키고 실제 운용은 어떻게 할 수 있을지에 대해 얘기를 나눠보도록 하자.
