복제(Replication)란?
- 한 서버에서 다른 서버로 데이터가 동기화 되는 것을 의미
- 원본 데이터를 가진 서버를 소스 서버(Source), 복제된 데이터를 가진 서버를 레플리카 서버(Replica)라고 한다.
데이터베이스 복제 과정
- 소스 서버의 바이너리 로그를 기반으로 복제한다.
- 바이너리 로그란? MySQL 서버에서 발생하는 모든 변경사항(이벤트)이 순서대로 기록되는 로그 파일.
- 데이터베이스 변경 내역, 데이터베이스나 테이블의 구조 변경, 계정이나 권한 변경 등이 기록된다.
- 복제 순서
- 소스 서버의 바이너리 로그 덤프 스레드는 바이너리 로그를 레플리카 서버로 전송한다.
- 레플리카 서버의 레플리케이션 I/O 스레드는 소스 서버의 바이너리 로그 덤프 스레드로부터 바이너리 로그 이벤트를 가져와 로컬 서버의 파일(릴레이 로그)로 저장
- 레플리카 서버의 레플리케이션 SQL 스레드는 릴레이 로그 파일의 이벤트들을 읽고 실행하여 데이터 파일에 반영
데이터베이스 복제 방식의 종류
- 복제를 시작할 때 레플리카 서버는 소스 서버에게 소스 서버의 어느 이벤트까지 적용했는지 알려주고 그 이후의 바이너리 로그 이벤트를 가져온다.
- 따라서 소스 서버에서 발생한 각 이벤트에 대한 식별이 필요하다.
- 복제 방식은 소스 서버의 바이너리 로그에 기록된 변경 내역(이벤트)들을 어떻게 식별하는지에 따라 2가지로 구분된다.
- 바이너리 로그 파일 위치 기반 복제
- 글로벌 트랜잭션 ID(GTID) 기반 복제
바이너리 로그 파일 위치 기반 복제
- 이벤트를 소스 서버의 바이너리 로그 파일명 + 파일 내에서의 위치 값(File Offset)의 조합으로 식별
- 바이너리 로그에는 이벤트가 최초로 발생한 MySQL 서버의 server_id 값이 포함되어 있다.
- 레플리카 서버의 server_id가 이벤트의 server_id와 동일한 경우, 레플리카 서버에서는 해당 이벤트를 적용하지 않는다. 자신의 서버에서 발생한 이벤트로 간주하기 때문이다.
- 따라서, 복제의 구성원이 되는 모든 MySQL 서버는 고유한 server_id를 가지도록 설정해야한다.
- server_id는 MySQL 설정 파일(my.cnf)에서 설정할 수 있다.
- 기존 바이너리 로그 파일 위치 기반 복제의 문제점
- 이벤트를 식별하는 기준이 되는 바이너리 로그 파일명은 소스 서버에 저장된 파일명이고, 파일 내 위치 값 또한 소스 서버에 저장된 파일 내에서의 위치 값이다.
- 동일한 이벤트가 레플리카 서버에서도 동일한 파일명의 동일한 위치에 저장된다는 보장이 없으므로, 서버마다 동일한 이벤트에 대해 서로 다른 식별 값을 가지게 된다.
- 소스 서버 장애로 인해 레플리카 서버 1이 소스 서버로 승격되는 경우를 생각해보자. 이런 경우를 대비하여 레플리카 서버 1의 log_slave_updates 시스템 변수를 설정하면 복제에 의한 데이터 변경도 자신의 바이너리 로그에 기록하게 된다. 그런데 레플리카 서버 1에서 저장하는 바이너리 로그 파일명과 파일 내 위치 값은 기존 소스 서버와 다르다. 같은 이벤트에 대해서 바이너리 로그를 기록하더라도 기존 소스 서버와 레플리카 서버 1에서 식별하는 값(파일명+위치)이 달라진다. 레플리카 서버 2는 기존 소스 서버에 저장된 파일명+위치로 이벤트를 식별하므로, 새로운 소스 서버(레플리카 서버 1)의 이벤트 식별자와 불일치하게 된다.
- 이는 복제 토폴로지를 변경하기 어렵게 만든다.
글로벌 트랜잭션 ID(GTID) 기반 복제
- 위에서 살펴본 문제를 해결하기 위해, MySQL 5.6 버전에서 처음 도입되었다.
- 복제에 참여한 전체 MySQL 서버들에서 고유한 이벤트 식별 값을 가지도록 각 이벤트에 고유한 식별 값인 글로벌 트랜잭션 아이디(GTID)를 부여한다.
- GTID는 소스 아이디와 트랜잭션 아이디 값의 조합으로 생성되며, 콜론(:)으로 구분되어 표시된다.
- 예시) [source_id]:[transaction_id]
- 소스 아이디: 트랜잭션이 발생한 소스 서버를 식별하기 위한 값. server_uuid 시스템 변수 사용.
- 트랜잭션 아이디: 커밋된 트랜잭션 순서대로 부여되는 값. 1부터 1씩 단조 증가하는 형태.
'데이터베이스 > MySQL' 카테고리의 다른 글
[MySQL] 쿼리 성능 확인하기 - Performance 스키마 & Sys 스키마 (0) | 2024.04.05 |
---|---|
[MySQL] InnoDB 클러스터 (0) | 2024.03.29 |
[MySQL] DATETIME vs. TIMESTAMP (1) | 2024.03.15 |
[MySQL] 파티셔닝 종류 정리 (0) | 2024.03.08 |
[MySQL] 온라인 DDL (2) | 2024.03.01 |