DB

[MySQL] (복제구조3️⃣) GTID 기반 복제 완전 이해하기

인생아 2025. 7. 16. 22:11
반응형

MySQL 복제에서 최근 가장 많이 쓰이는 방식이 바로 GTID 기반 복제다.
GTID(Global Transaction ID)는 각 트랜잭션에 고유 식별자를 부여해
복제 위치를 자동으로 관리할 수 있게 해준다.
기존처럼 binlog 파일명 + 포지션을 수동으로 지정할 필요가 없고,
장애 복구, 자동화 구성, 마스터 전환 작업이 훨씬 수월하다.

✅ GTID란?

  • Global Transaction Identifier
  • 각 트랜잭션에 대해 전역 고유 ID를 부여함
  • GTID는 다음과 같은 형태로 구성됨
UUID:트랜잭션번호  
예: 3E11FA47-71CA-11E1-9E33-C80AA9429562:32

이 고유 ID를 통해 Master와 Slave는 복제된 트랜잭션 여부를 명확히 판단할 수 있다.

반응형

🔁 기존 복제 방식 vs GTID 방식

항목 전통적 방식 GTID 기반 복제
복제 위치 추적 binlog 파일명 + 위치 수동 설정 GTID 기반 자동 추적
장애 복구 복잡하고 수동 작업 필요 자동 추적으로 간단함
마스터 전환 수동 재설정 필요 AUTO_POSITION=1로 쉽게 처리
운영 안정성 binlog 삭제 시 복제 실패 가능 비교적 안정적

기존 방식은 설정 정확도에 따라 복제 누락, 중복 적용, 복잡한 복구가 발생하기 쉬운 반면
GTID는 운영 자동화에 최적화된 구조라고 볼 수 있다.

🛠️ GTID 복제 설정 방법

① Master, Slave 공통 설정 (my.cnf)

[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
enforce-gtid-consistency = ON
gtid_mode = ON
  • enforce-gtid-consistency는 반드시 ON
  • gtid_mode는 ON 또는 ON_PERMISSIVE (업그레이드 시)

설정 변경 후 MySQL 재시작

sudo systemctl restart mysql

② Master에서 복제 계정 생성

CREATE USER 'repl'@'%' IDENTIFIED BY 'replpass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

③ Slave에서 복제 연결 설정

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST = 'Master_IP',
  SOURCE_USER = 'repl',
  SOURCE_PASSWORD = 'replpass',
  AUTO_POSITION = 1;
  • GTID를 사용하므로 SOURCE_LOG_FILE, POSITION 불필요
  • AUTO_POSITION = 1 옵션이 핵심

복제 시작

START REPLICA;

상태 확인

SHOW REPLICA STATUS\G

Retrieved_Gtid_Set, Executed_Gtid_Set이 출력되면 GTID가 정상 작동 중이다.

반응형

📦 GTID 관련 주요 명령어

SELECT @@GLOBAL.gtid_mode;
SELECT @@GLOBAL.gtid_executed;
SHOW MASTER STATUS;
  • gtid_mode: 현재 서버의 GTID 설정 상태
  • gtid_executed: 현재까지 실행된 GTID 목록
  • SHOW MASTER STATUS: GTID 복제 기준 위치 확인 가능

🧠 GTID 복제 실무 장점

  • 마스터 장애 시 Failover가 간단해짐
  • 자동화 도구(PMM, Orchestrator 등)와 호환성 좋음
  • 복제 중단 후 재시작 시에도 GTID 기준으로 정확하게 이어짐
  • 여러 개의 Slave 구성 시에도 동기화 상태 추적이 쉬움

⚠️ 주의할 점

  • GTID를 활성화한 이후에는 비GTID 방식으로 되돌릴 수 없음
  • enforce-gtid-consistency = ON 상태에서는 일부 제약이 있음
    (예: CREATE TEMPORARY TABLE, UPDATE ... LIMIT 등)
  • 서버 간 시간 차이, binlog 보존 설정 등은 여전히 관리 필요
  • 반드시 binlog_format = ROW 설정 권장

📘 공식 문서 참고

https://dev.mysql.com/doc/refman/8.0/en/replication-gtids.html

반응형