1. 클러스터 일관성 모니터링
1.1 클러스터 UUID 확인
다음 명령어로 현재 노드가 올바른 클러스터에 속해 있는지 확인합니다:
mysql> SHOW STATUS LIKE 'wsrep_cluster_state_uuid';
클러스터 내 모든 노드에서 이 값이 동일해야 합니다. 값이 다르면 해당 노드가 클러스터에서 분리된 상태입니다.
1.2 클러스터 구성 변경 횟수 확인
mysql> SHOW STATUS LIKE 'wsrep_cluster_conf_id';
이 변수는 클러스터 멤버십 변경이 발생한 총 횟수를 나타냅니다. 모든 노드에서 값이 같아야 하며, 다를 경우 해당 노드가 클러스터에서 분리되었음을 의미합니다. 네트워크 연결 등을 점검하여 일관된 상태로 복구해야 합니다.
1.3 클러스터 노드 수 확인
mysql> SHOW STATUS LIKE 'wsrep_cluster_size';
클러스터에 연결된 노드의 총 개수를 표시합니다. 실제 환경에서는 최소 3개 이상의 홀수 노드로 구성하는 것이 권장됩니다(짝수는 스플릿 브레인 위험).
1.4 클러스터 상태 확인
mysql> SHOW STATUS LIKE 'wsrep_cluster_status';
값이 Primary여야 정상입니다. Primary가 아니라면 일부 노드가 사용 불가능하거나 스플릿 브레인이 발생했을 수 있습니다.
모든 노드가 Primary 상태가 아니라면 쿼럼 리셋이 필요하며, 불가능할 경우 수동 재시작이 필요합니다:
- 모든 노드 종료
- 각 노드를 재시작하며
wsrep_last_committed값을 기준으로 마스터 노드 결정
참고: 수동 재시작 시 캐시가 손실되어 IST(Incremental State Transfer)를 사용할 수 없습니다.
2. 노드 상태 모니터링
2.1 SQL 쿼리 가능 여부 확인
mysql> SHOW STATUS LIKE 'wsrep_ready';
ON이면 정상, OFF이면 wsrep_connected 값을 추가로 확인해야 합니다.
2.2 클러스터 연결 상태 확인
mysql> SHOW STATUS LIKE 'wsrep_connected';
값이 OFF이면 노드가 클러스터에 연결되지 않은 것입니다. 이는 주로 wsrep_cluster_address 또는 wsrep_cluster_name 설정 오류 때문이며, 에러 로그를 통해 원인을 진단할 수 있습니다.
2.3 노드의 상세 상태 확인
mysql> SHOW STATUS LIKE 'wsrep_local_state_comment';
노드가 Primary 컴포넌트에 속할 때 일반적인 상태값:
JoiningWaiting for SSTJoinedSynced(정상 동기화 완료)Donor
wsrep_ready가 OFF이고 상태가 Joining, Waiting for SST, Joined 중 하나라면 동기화가 진행 중입니다. Initialized는 노드가 Primary 컴포넌트에 속하지 않음을 의미합니다.
3. 복제 성능 및 상태 확인
3.1 Flow Control 영향 확인
mysql> SHOW STATUS LIKE 'wsrep_flow_control_paused';
값이 0.0에 가까울수록 좋습니다. Slave 지연으로 인해 전체 클러스터 성능이 저하되는 정도를 나타냅니다. 개선 방법:
wsrep_slave_threads값 증가- 복제가 느린 노드를 클러스터에서 제거
wsrep_slave_threads 설정 시 wsrep_cert_deps_distance 값을 참고하여 이 값을 크게 초과하지 않도록 합니다.
3.2 네트워크 성능 진단
mysql> SHOW STATUS LIKE 'wsrep_local_send_queue_avg';
이 값이 높으면 네트워크 연결이 병목일 가능성이 있습니다. 물리 계층이나 OS 설정에서 원인을 찾아야 합니다.
4. 전체 wsrep 상태 변수 조회
mysql> SHOW STATUS LIKE '%wsrep%';
다음은 주요 상태 변수들의 예시 출력입니다:
+------------------------------------------+-------------------------------------------------------+
| Variable_name | Value |
+------------------------------------------+-------------------------------------------------------+
| wsrep_local_state_uuid | e8149a5c-636a-11e5-8b4b-67b16bb666a4 |
| wsrep_protocol_version | 7 |
| wsrep_last_committed | 526498 |
| wsrep_replicated | 526498 |
| wsrep_replicated_bytes | 238196578 |
| wsrep_repl_keys | 1926403 |
| wsrep_repl_keys_bytes | 27520685 |
| wsrep_repl_data_bytes | 176980021 |
| wsrep_repl_other_bytes | 0 |
| wsrep_received | 7970 |
| wsrep_received_bytes | 64791 |
| wsrep_local_commits | 526357 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_replays | 0 |
| wsrep_local_send_queue | 0 |
| wsrep_local_send_queue_max | 2 |
| wsrep_local_send_queue_min | 0 |
| wsrep_local_send_queue_avg | 0.000041 |
| wsrep_local_recv_queue | 0 |
| wsrep_local_recv_queue_max | 4 |
| wsrep_local_recv_queue_min | 0 |
| wsrep_local_recv_queue_avg | 0.034504 |
| wsrep_local_cached_downto | 1 |
| wsrep_flow_control_paused_ns | 22690449177 |
| wsrep_flow_control_paused | 0.000005 |
| wsrep_flow_control_sent | 0 |
| wsrep_flow_control_recv | 371 |
| wsrep_cert_deps_distance | 74.734609 |
| wsrep_apply_oooe | 0.000000 |
| wsrep_apply_oool | 0.000000 |
| wsrep_apply_window | 1.000000 |
| wsrep_commit_oooe | 0.000000 |
| wsrep_commit_oool | 0.000000 |
| wsrep_commit_window | 1.000000 |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| wsrep_cert_index_size | 43 |
| wsrep_cert_bucket_count | 126282 |
| wsrep_gcache_pool_size | 261431296 |
| wsrep_causal_reads | 0 |
| wsrep_cert_interval | 0.000002 |
| wsrep_incoming_addresses | 10.130.7.5:3306,,10.130.7.4:3306 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0/0/0/0/0 |
| wsrep_evs_state | OPERATIONAL |
| wsrep_gcomm_uuid | e813b31f-636a-11e5-90c7-0f6d378e1dfb |
| wsrep_cluster_conf_id | 5 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | e8149a5c-636a-11e5-8b4b-67b16bb666a4 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 2 |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <info@codership.com> |
| wsrep_provider_version | 3.11(rXXXX) |
| wsrep_ready | ON |
+------------------------------------------+-------------------------------------------------------+
58 rows in set (0.12 sec)
출력 결과는 약 60개의 변수이며, 핵심 변수는 세 가지 범주로 나눌 수 있습니다:
- 클러스터 무결성:
wsrep_cluster_state_uuid,wsrep_cluster_conf_id,wsrep_cluster_size,wsrep_cluster_status - 노드 상태:
wsrep_ready,wsrep_connected,wsrep_local_state_comment - 복제 성능:
wsrep_local_recv_queue_avg,wsrep_flow_control_paused,wsrep_cert_deps_distance
5. wsrep 관련 주요 변수 설명
| 변수명 | 설명 |
|---|---|
| wsrep_local_state_uuid | 노드에 저장된 UUID 상태 |
| wsrep_protocol_version | 사용 중인 wsrep 프로토콜 버전 |
| wsrep_last_committed | 마지막으로 커밋된 트랜잭션 시퀀스 번호 |
| wsrep_replicated | 다른 노드로 전송된 writeset 총 개수 |
| wsrep_replicated_bytes | 다른 노드로 전송된 writeset 총 바이트 수 |
| wsrep_repl_keys | 복제된 키 총 개수 |
| wsrep_repl_keys_bytes | 복제된 키 총 바이트 수 |
| wsrep_repl_data_bytes | 복제된 데이터 총 바이트 수 |
| wsrep_repl_other_bytes | 기타 복제 데이터 총 바이트 수 |
| wsrep_received | 다른 노드에서 수신한 writeset 총 개수 |
| wsrep_received_bytes | 다른 노드에서 수신한 writeset 총 바이트 수 |
| wsrep_local_commits | 해당 노드에서 커밋된 writeset 총 개수 |
| wsrep_local_cert_failures | 인증 테스트에 실패한 writeset 개수 |
| wsrep_local_replays | 비대칭 잠금 정밀도로 인해 재생된 트랜잭션 수 |
| wsrep_local_send_queue | 현재 전송 대기열 길이 (전송 대기 writeset 수) |
| wsrep_local_send_queue_avg | 네트워크 병목 징후. 값이 높으면 네트워크 병목 가능성 |
| wsrep_local_recv_queue | 현재 수신 대기열 길이 (처리 대기 writeset 수) |
| wsrep_local_recv_queue_avg | Slave 트랜잭션 대기열 평균 길이. Slave 병목 징후 |
| wsrep_local_cached_downto | gcache 최소 시퀀스 번호. IST/SST 판단 기준. 0이면 gcache에 writeset 없음 |
| wsrep_flow_control_paused_ns | 복제 중단 시간 (나노초) |
| wsrep_flow_control_paused | Slave 지연으로 인한 클러스터 느려짐 정도 (0~1). 0에 가까울수록 좋음. 1이면 복제 완전 중단. wsrep_slave_threads 최적화로 개선 가능 |
| wsrep_flow_control_sent | 해당 노드가 복제를 중단한 횟수 |
| wsrep_flow_control_recv | 해당 노드가 복제 중단을 요청받은 횟수 |
| wsrep_cert_deps_distance | 병렬로 처리 가능한 트랜잭션 수. wsrep_slave_threads는 이 값을 크게 초과하지 않아야 함 |
| wsrep_apply_oooe | writeset이 순서에 맞지 않게(out-of-order) 적용된 빈도 |
| wsrep_apply_oool | 큰 시퀀스값 writeset이 작은 시퀀스값보다 더 자주 적용된 빈도 |
| wsrep_apply_window | 동시에 사용된 최대/최소 시퀀스값의 평균 차이 |
| wsrep_commit_oooe | 트랜잭션이 대기열을 벗어난(비순차 커밋) 빈도 |
| wsrep_commit_window | 동시에 커밋된 최대/최소 시퀀스값의 평균 차이 |
| wsrep_local_state | Galera 상태값. 1: Joining, 2: Donor/Desynced, 3: Joined, 4: Synced |
| wsrep_local_state_comment | Galera 상태 설명. wsrep_connected=ON, wsrep_ready=OFF일 때 원인 확인 가능 |
| wsrep_cert_index_size | 인증 인덱스의 엔트리 수 |
| wsrep_cert_bucket_count | 해시 테이블 내 인증 인덱스 셀 수 |
| wsrep_gcache_pool_size | gcache용 페이지 풀 또는 동적 할당된 바이트 수 |
| wsrep_causal_reads | 처리된 writeset 수 |
| wsrep_incoming_addresses | 클러스터 노드 주소 (쉼표로 구분) |
| wsrep_evs_delayed | 클러스터에서 제외된 UUID |
| wsrep_evs_evict_list | 지연이 있는 노드 목록 |
| wsrep_evs_repl_latency | 클러스터 노드 간 통신 복제 지연 정보 |
| wsrep_evs_state | EVS 프로토콜 상태 |
| wsrep_gcomm_uuid | Galera view ID. 클러스터 UUID와는 다르며 gvwstate.dat에서 확인 가능 |
| wsrep_cluster_conf_id | 클러스터 멤버십 변경 횟수. 정상이면 모든 노드에서 동일. 다르면 임시 파티셔닝 발생 |
| wsrep_cluster_size | 클러스터 내 노드 수. 예상 수와 일치하면 모든 노드 연결됨 |
| wsrep_cluster_state_uuid | 클러스터 UUID. 모든 노드에서 동일해야 함. 다르면 해당 노드가 클러스터에 미연결 |
| wsrep_cluster_status | 클러스터 노드 상태. Primary가 아니면 파티셔닝 또는 스플릿 브레인 발생 가능. 가능한 값: Primary, Non-Primary, Disconnected |
| wsrep_connected | 노드가 클러스터에 연결되었는지 여부. OFF면 wsrep_ready도 OFF이며 설정 오류 가능성 |
| wsrep_local_bf_aborts | 다른 노드 트랜잭션에 의해 중단된 로컬 실행 트랜잭션 수 |
| wsrep_local_index | 클러스터 내 노드 인덱스 |
| wsrep_provider_name | wsrep 제공자 이름 |
| wsrep_provider_vendor | wsrep 공급업체 |
| wsrep_provider_version | wsrep 제공자 버전 |
| wsrep_ready | 노드 쿼리 수용 가능 여부. ON이면 SQL 부하 수용, OFF면 wsrep_connected 확인 필요 |
6. 클러스터 모니터링 스크립트 확장
wsrep_notify_cmd 파라미터를 통해 명령어 스크립트를 호출하여 모니터링을 확장할 수 있습니다.
7. 주의사항
- 3개 미만의 노드에서 데이터베이스를 종료하지 마세요. 재부팅이 필요할 수 있습니다.
- 클러스터 구축 후 모든 노드를 종료해야 한다면, 재시작 시 반드시 재부팅(rebootstrap)이 필요합니다.
- MyISAM 등 비트랜잭션 테이블의 경우 DDL만 동기화되고 DML은 동기화되지 않습니다.
예: MyISAM 테이블 생성 후 데이터를 삽입하면 다른 노드에는 테이블만 생성되고 데이터는 없습니다(0행).
8. 복제 성능 상세 진단
8.1 수신 대기열 평균 확인
mysql> SHOW STATUS LIKE 'wsrep_local_recv_queue_avg';
값이 0보다 크면 노드가 수신한 writeset을 적시에 적용하지 못하고 있음을 의미합니다. 최대/최소값도 함께 확인할 수 있습니다:
mysql> SHOW STATUS LIKE 'wsrep_local_recv_queue_min';
mysql> SHOW STATUS LIKE 'wsrep_local_recv_queue_max';
8.2 Flow Control 일시 정지율 측정
mysql> FLUSH STATUS;
-- 일정 시간 대기 후
mysql> SHOW STATUS LIKE 'wsrep_flow_control_paused';
이 값은 해당 기간 동안 복제가 중단된 시간의 비율(백분율)을 나타냅니다. 예: 0.18은 18%의 시간 동안 복제가 중단되었음을 의미합니다. 0이 아닌 값이 지속되면 wsrep_slave_threads 값을 늘려야 할 수 있습니다.
8.3 병렬 적용 가능성 평가
mysql> SHOW STATUS LIKE 'wsrep_cert_deps_distance';
이 값을 참고하여 wsrep_slave_threads 파라미터를 설정합니다. wsrep_slave_threads는 이 값을 크게 초과하지 않아야 합니다.
8.4 전송 대기열 분석 (네트워크 병목 진단)
mysql> SHOW STATUS LIKE 'wsrep_local_send_queue_avg';
값이 0보다 크면 노드가 writeset 전송을 따라가지 못하고 있음을 의미합니다. 하드웨어, OS 설정 등 다양한 원인이 있을 수 있습니다.