MySQL Group Replication(MGR) 운영 및 유지보수 가이드

MGR 클러스터 관리 개요

MySQL Group Replication(MGR) 환경을 운영하다 보면 유지보수를 위해 주 노드를 변경하거나, 노드를 추가/삭제해야 하는 상황이 발생합니다. 본 가이드에서는 SQL 문을 이용한 수동 관리 방식과 MySQL Shell을 이용한 자동화 관리 방식을 나누어 설명합니다.

먼저 관리 대상이 되는 3개 노드의 상태를 확인하는 쿼리입니다.

SELECT MEMBER_HOST, MEMBER_PORT, MEMBER_STATE, MEMBER_ROLE 
FROM performance_schema.replication_group_members;

-- 출력 예시
-- +--------------+-------------+--------------+-------------+
-- | MEMBER_HOST  | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE |
-- +--------------+-------------+--------------+-------------+
-- | 192.168.1.10 |        3306 | ONLINE       | PRIMARY     |
-- | 192.168.1.11 |        3306 | ONLINE       | SECONDARY   |
-- | 192.168.1.12 |        3306 | ONLINE       | SECONDARY   |
-- +--------------+-------------+--------------+-------------+

1. Primary 노드 전환 (Switchover)

특정 노드의 하드웨어 점검이나 OS 업데이트가 필요할 때 Primary 역할을 다른 노드로 이전할 수 있습니다.

UDF를 이용한 전환 (SQL 방식)

MySQL 8.0부터는 group_replication_set_as_primary() 함수를 사용하여 특정 노드를 Primary로 지정할 수 있습니다.

-- 대상 노드의 UUID를 인자로 전달
SELECT group_replication_set_as_primary('e3b5e432-6a2c-11ec-88c2-00155d064000');

MySQL Shell을 이용한 전환

MySQL Shell에서는 setPrimaryInstance() 메서드를 사용하며, 주소를 기반으로 지정할 수 있어 편리합니다.

var cluster = dba.getCluster();
cluster.setPrimaryInstance('192.168.1.11:3306');

2. 단일 주 노드(Single-Primary) 및 다중 주 노드(Multi-Primary) 모드 변경

MGR의 운영 모드를 동적으로 전환할 수 있습니다.

SQL 방식

-- 다중 주 노드 모드로 전환
SELECT group_replication_switch_to_multi_primary_mode();

-- 단일 주 노드 모드로 전환 (특정 UUID 지정 가능)
SELECT group_replication_switch_to_single_primary_mode('e3b5e432-6a2c-11ec-88c2-00155d064000');

MySQL Shell 방식

var cluster = dba.getCluster();
cluster.switchToMultiPrimaryMode();
cluster.switchToSinglePrimaryMode('192.168.1.10:3306');

3. 신규 노드 확장

클러스터의 가용성을 높이기 위해 새로운 노드를 추가하는 과정입니다.

수동 추가 절차

신규 노드에서 MySQL 설정을 마치고 MGR 전용 계정을 생성한 뒤, 기존 데이터를 동기화해야 합니다. 대용량 데이터의 경우 Clone Plugin을 사용하는 것이 효율적입니다.

-- 신규 노드(192.168.1.13)에서 실행
SET GLOBAL clone_valid_donor_list='192.168.1.11:3306';
STOP GROUP_REPLICATION;
SET GLOBAL super_read_only=0;
CLONE INSTANCE FROM 'repl_user'@'192.168.1.11':3306 IDENTIFIED BY 'password';

-- 재시작 후 MGR 시작
START GROUP_REPLICATION;

MySQL Shell을 이용한 추가

Shell을 사용하면 데이터 복제(Provisioning) 방식을 자동으로 선택하여 진행합니다.

var cluster = dba.getCluster();
cluster.addInstance('mgr_user@192.168.1.13:3306');

4. 노드 제거

클러스터에서 노드를 안전하게 제외하는 방법입니다.

수동 방식

단순히 STOP GROUP_REPLICATION을 실행하면 노드가 클러스터를 떠나게 됩니다. 완전히 영구 제외하려면 복제 설정을 초기화합니다.

STOP GROUP_REPLICATION;
RESET MASTER;
RESET SLAVE ALL; -- MySQL 8.0.22+ 에서는 RESET REPLICA ALL 사용

MySQL Shell 방식

var cluster = dba.getCluster();
cluster.removeInstance('192.168.1.13:3306');

5. 장애 노드 재가입

네트워크 단절이나 프로세스 크래시로 이탈한 노드는 기본적으로 자동 재시도를 거치지만, 수동으로 다시 연결해야 할 때가 있습니다.

-- SQL 방식
START GROUP_REPLICATION;

-- MySQL Shell 방식
var cluster = dba.getCluster();
cluster.rejoinInstance('192.168.1.13:3306');

6. 클러스터 전체 재시작

모든 노드가 중단된 'Complete Outage' 상황에서는 첫 번째 노드를 부트스트랩 모드로 실행해야 합니다.

-- 수동 방식 (첫 번째 노드에서만 실행)
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

-- 이후 다른 노드들은 일반 실행
START GROUP_REPLICATION;

MySQL Shell을 사용하면 rebootClusterFromCompleteOutage() 명령어로 메타데이터를 확인하여 가장 적합한 노드를 Primary로 선출하고 클러스터를 자동 복구할 수 있습니다.

태그: MySQL MGR GroupReplication DatabaseAdministration HighAvailability

7월 7일 17:48에 게시됨