MySQL 바이너리 로그와 복제 아키텍처 완전 가이드

바이너리 로그(Binary Log) 개념 및 구조

바이너리 로그는 MySQL 데이터베이스에서 발생하는 모든 데이터 변경 사항을 기록하는 핵심 컴포넌트이다. 이 로그는 데이터베이스의 상태 변경을 실시간으로 추적하는 역할을 수행하며, INSERT, UPDATE, DELETE 같은 DML 문장과 CREATE, ALTER 같은 DDL 문장을 모두 포함한다.

주요 특성

  • 논리적 기록 방식: 실제 물리적 데이터 페이지 변경이 아닌 SQL 문장의 논리적 내용을 저장한다. 예를 들어 "UPDATE members SET point=100 WHERE idx=5"와 같은 문장이 그대로 기록된다.
  • 영구 저장소 활용: 바이너리 로그는 디스크에 파일 형태로 저장되며, MySQL 서버 재시작 후에도 유지된다. 저장 기간은 서버 설정에 따라 자유롭게 지정 가능하다.
  • 변경 이력 추적 가능: 바이너리 로그 파일을 분석하면 특정 시점의 데이터 상태를 정확하게 재현할 수 있다.

기본 활용 분야

복제 메커니즘: 마스터 데이터베이스에서 생성된 바이너리 로그는 슬레이브 데이터베이스로 전송되어相同的 데이터 동기화를を実現한다. 이것이 MySQL 고가용성 구성의 기본 원리이다.

복구 및 복원: 정기적인 백업과 바이너리 로그를 조합하면 특정 시점까지 데이터를 복원하는 것이 가능하다. 실수로 삭제된 데이터를 특정 시간으로 되돌릴 수 있다.

바이너리 로그 포맷 유형

포맷 유형 설명 실제 사용 예시
STATEMENT 실행된 SQL 문장을 그대로 기록 UPDATE orders SET created_at = NOW() WHERE status = 'pending';
ROW 행 단위로 변경 전후의 전체 데이터를 기록 order_idx=10인 주문의 total_amount가 50000에서 45000으로 변경됨을 전체 행 데이터와 함께 기록
MIXED 자동으로 STATEMENT 또는 ROW 선택 RANDOM() 함수 사용 시 자동으로 ROW 포맷으로 전환하여 일관성 보장

마스터-슬레이브 복제 아키텍처

데이터베이스 복제는 고가용성 확보, 읽기 부하 분산, 데이터 백업 등의 목적으로 필수적인 기술이다. 마스터 서버의 변경 사항을 하나 이상의 슬레이브 서버에 전파하여 데이터를 동기화하는 구조이다.

동작 원리

마스터 서버 역할: 모든 데이터 변경 작업(INSERT, UPDATE, DELETE, CREATE, ALTER 등)을 바이너리 로그에 순차적으로 기록한다. 별도의 Binlog Dump 스레드가 슬레이브로 로그 데이터를 전송한다.

슬레이브 서버 역할: I/O 스레드가 마스터에 연결하여 바이너리 로그를 수신하고, 이를 로컬 릴레이 로그에 저장한다. 이후 SQL 스레드가 릴레이 로그를 읽어와서 실제로 데이터 변경 작업을 재현한다.

구성 방법

마스터 서버 설정:

# server.cnf
[mysqld]
server_id = 100
log_bin = master-binlog
binlog_format = ROW
sync_binlog = 1

복제 전용 사용자 생성:

CREATE USER 'syncuser'@'%' IDENTIFIED BY 'SecurePass123!';
GRANT REPLICATION SLAVE ON *.* TO 'syncuser'@'%';
FLUSH PRIVILEGES;

슬레이브 서버 설정:

# server.cnf
[mysqld]
server_id = 200
relay_log = slave-relay-log
read_only = 1
super_read_only = 1

복제 연결 설정:

CHANGE MASTER TO
  MASTER_HOST = '192.168.1.10',
  MASTER_USER = 'syncuser',
  MASTER_PASSWORD = 'SecurePass123!',
  MASTER_LOG_FILE = 'master-binlog.000003',
  MASTER_LOG_POS = 123456;

START REPLICA;

복제 상태 확인:

SHOW REPLICA STATUS\G

GTID(Global Transaction Identifier)机制

GTID는 MySQL 5.6 이후 도입된 전역 트랜잭션 식별자로, 전통적인 바이너리 로그 기반 복제의 한계를 극복한다. 각 트랜잭션에 고유한 식별자를 부여하여 복제 관리를 단순화한다.

식별자 구성

GTID 포맷은 source_id:sequence_number 형태로 구성된다.

  • source_id: 서버의 고유 UUID 값 (server_uuid)
  • sequence_number: 해당 서버에서 실행된 트랜잭션 순번

예를 들어, 5A1C9E2B-4F3D-11E9-B001-00C044ABC123:10-25는 UUID가 5A1C9E2B...인 서버에서 10번째부터 25번째까지 실행된 트랜잭션을 의미한다.

전통적 복제 대비 장점

기존 복제의 문제점 GTID 기반 해결 방안
마스터 변경 시 바이너리 로그 위치 수동 지정 필요 트랜잭션 자동 추적으로 위치 정보 불필요
특정 트랜잭션의 슬레이브 반영 여부 확인 어려움 GTID集合으로 트랜잭션 상태 명확히 파악
복잡한 복제 토폴로지 관리困难 트랜잭션 흐름이 명확하여 любые拓扑结构 지원

GTID 활성화 설정

# server.cnf
[mysqld]
server_id = 100
log_bin = master-binlog
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON

설정 적용을 위해 MySQL 서비스를 재시작해야 한다:

sudo systemctl restart mysql

GTID 기반 복제 설정

CHANGE MASTER TO
  MASTER_HOST = '192.168.1.10',
  MASTER_USER = 'syncuser',
  MASTER_PASSWORD = 'SecurePass123!',
  MASTER_AUTO_POSITION = 1;

START REPLICA;

MASTER_AUTO_POSITION = 1을 설정하면 GTID 기반으로 자동으로 마스터의 바이너리 로그 위치를 판단하여 복제를 진행한다.

태그: MySQL database-replication binary-log gtid mysql-replication

6월 22일 23:29에 게시됨