[MySQL] GTID 란?

hwwwa·2024년 10월 1일
0

GTID 란?

Global Transaction IDentifiers. 원본 서버에서 커밋된 트랜잭션과 연결된 식별자

GTID = server_uuid:transaction_id
  • server_uuid: 트랜잭션이 최초로 실행된 서버의 고유 식별자(UUID).
  • transaction_id: 해당 서버에서 실행된 트랜잭션의 일련 번호.

gtid_mode 옵션

시스템 변수 gtid_mode 로 GTID를 활성화/비활성화 가능. MySQL 5.6 이상 사용 가능

  1. OFF
    • GTID 기반 복제 비활성화
    • 전통적인 복제 방식인 바이너리 로그 파일 및 로그 포지션을 기반으로 한 복제
  2. OFF_PERMISSIVE
    • GTID가 비활성화되어 있지만, GTID로 트랜잭션을 수행하는 서버로부터 복제를 허용
    • GTID 및 비-GTID 기반 트랜잭션이 혼재되어 있을 수 있음
    • 트랜잭션은 전통적인 방식으로 복제되지만, GTID 기반 복제를 사용하는 슬레이브 서버와 호환됨
  3. ON_PERMISSIVE
    • GTID 기반 복제가 활성화되지만, GTID 없이도 트랜잭션 허용
    • GTID 기반 복제와 전통적인 복제가 혼합되어 작동할 수 있습니다.
    • GTID로 기록된 트랜잭션과 그렇지 않은 트랜잭션 모두 복제 가능
  4. ON
    • GTID 기반 복제를 완전히 활성화
    • 모든 트랜잭션이 GTID를 통해 관리되고, 복제도 GTID를 기반으로 이루어짐

GTID 모드의 특징 및 장점

  1. 복제의 일관성
    • GTID는 모든 트랜잭션에 대해 전역적으로 고유한 식별자를 부여하여, 복제의 일관성과 신뢰성을 높임
    • Slave 서버가 GTID를 사용하여 정확히 어떤 트랜잭션이 복제되었는지 알 수 있음
  2. 자동 복구
    • Slave 서버가 GTID를 사용하여 손실된 트랜잭션을 자동 감지 및 복구 가능하므로 복제 설정 및 관리가 간편함
  3. 마스터-슬레이브 전환이 쉬움
    • GTID 기반 복제 사용 시 복제 위치를 수동으로 지정할 필요 없이 새로운 마스터로 전환 가능
  4. 트랜잭션 기반 복제
    • GTID 사용 시 트랜잭션 단위로 복제가 이루어지므로, 복제 간 충돌 방지 및 데이터 일관성을 유지 가능

GTID 모드 주의점

  1. GTID 가 없는 트랜잭션을 포함하는 빈로그는 GTID가 활성화된 서버에서 사용할 수 없음

  2. GTID 복제 구성에서 CREATE TABLE .. SELECT 구문을 사용하는 경우

    • binlog 포맷이 statement 이면 하나의 트랜잭션으로 기록되지만, row형식으로 사용되면 두 개의 GTID와 함께 두 개의 트랜잭션으로 기록됨

    • 마스터가 statement 형식, 슬레이브가 row면 슬레이브는 트랜잭션을 바르게 사용할 수 없음

    • MySQL 8.0.21 부터는 CTAS 사용 가능

      mysql> create table tb_test_ctas as select * from tb_test;
      ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.
      mysql> create table tb_test_like like tb_test;
      Query OK, 0 rows affected (0.01 sec)
      mysql> insert into tb_test_like 
          -> select * from tb_test;
      Query OK, 8130 rows affected (0.32 sec)
      Records: 8130  Duplicates: 0  Warnings: 0
  3. 임시 테이블 (CREATE TEMPORARYE TABLE, DROP TEMPORARY TABLE)

    mysql> create temporary table v (a varchar(1));
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> drop temporary table v;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql>  create temporary table v (a varchar(1));
    ERROR 1787 (HY000): Statement violates GTID consistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context.  These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions.

GTID 활성화

GTID 모드 호환성

Slave \ MasterOFFOFF_PERMISSIVEON_PERMISSIVEON
OFFYYNN
OFF_PERMISSIVEYYYY
ON_PERMISSIVEYYYY
ONNNYY
  • 단계별 전환 필요
    • OFF -> OFF_PERMISSIVE -> ON_PERMISSIVE -> ON
    • Slave와 Master 간의 호환성을 유지하여 트랜잭션이 올바르게 복제되도록 보장하기 위함
    • 데이터 불일치나 복제 중단과 같은 문제가 발생하지 않도록 하여 데이터 무결성을 유지
# gtid_mode 값이 OFF 인 상태에서 ON 으로 변경하기 위한 과정
SET GLOBAL enforce_gtid_consistency = WARN;
SET GLOBAL enforce_gtid_consistency = ON;
SET GLOBAL gtid_mode = OFF_PERMISSIVE;
SET GLOBAL gtid_mode = ON_PERMISSIVE;
SET GLOBAL gtid_mode = ON;

# my.cnf에 추가
enforce_gtid_consistency=ON
gtid_mode=ON

gtid_next 값과의 호환성

  • gtid_next 가 AUTOMATIC 이면서 binary log 를 사용하지 않는 경우, GTID 가 생성되지 않음
gtid_next = AUTOMATIC
(binary log on)
gtid_next = AUTOMATIC
(binary log off)
gtid_next = AUTOMATIC:<TAG>gtid_next = ANONYMOUSgtid_next = <UUID>:<NUMBER>gtid_next = <UUID>:<TAG>:<NUMBER>
gtid_mode = OFFANONYMOUSANONYMOUSErrorANONYMOUSErrorError
gtid_mode = 
OFF_PERMISSIVE
ANONYMOUSANONYMOUSErrorANONYMOUS<UUID>:<NUMBER><UUID>:<TAG>:<NUMBER>
gtid_mode = 
ON_PERMISSIVE
New GTIDANONYMOUSNew GTIDANONYMOUS<UUID>:<NUMBER><UUID>:<TAG>:<NUMBER>
gtid_mode = ONNew GTIDANONYMOUSNew GTIDError<UUID>:<NUMBER><UUID>:<TAG>:<NUMBER>
# gtid_next는 세션 변수. NHNCloud RDS 기본값은 AUTOMATIC
SET gtid_next = 'AUTOMATIC';


테스트 내용은 다음 포스트에!

0개의 댓글