[Real MySQL 8.0 2] 16.2 복제 - 복제 아키텍처
복제 아키텍처
MySQL 서버에서 발생하는 모든 변경 사항은 별도의 로그 파일에 순서대로 기록되는데, 이를 바이너리 로그(Binary Log)라고 한다. 바이너리 로그에는 데이터의 변경 내역뿐만 아니라 데이터베이스나 테이블의 구조 변경과 계정이나 권한의 변경 정보까지 모두 저장된다. 바이너리 로그에 기록된 각 변경 정보들을 이벤트(Event)라고도 한다. MySQL의 복제는 이 바이너리 로그를 기반으로 구현됐는데, 소스 서버에서 생성된 바이너리 로그가 레플리카 서버로 전송되고 레플리카 서버에서는 해당 내용을 로컬 디스크에 저장한 뒤 자신이 가진 데이터에 반영함으로써 소스 서버와 레플리카 서버 간에 데이터 동기화가 이뤄진다. 레플리카 서버에서 소스 서버의 바이너리 로그를 읽어 들여 따로 로컬 디스크에 저장해둔 파일을 릴레이 로그(Relay Log)라 한다.
MySQL의 복제는 세 개의 스레드에 의해 작동하는데, 이 세 스레드 중 하나는 소스 서버에 존재하며, 나머지 두 개의 스레드는 레플리카 서버에 존재한다.
1. 바이너리 로그 덤프 스레드(Binary Log Dump Thread)
레플리카 서버는 데이터 동기화를 위해 소스 서버에 접속해 바이너리 로그 정보를 요청한다. 소스 서버에서는 레플리카 서버가 연결될 때 내부적으로 바이너리 로그 덤프 스레드를 생성해서 바이너리 로그의 내용을 레플리카 서버로 전송한다. 바이너리 로그 덤프 스레드는 레플리카 서버로 보낼 각 이벤트를 읽을 때 일시적으로 바이너리 로그에 잠금을 수행하며, 이벤트를 읽고난 후에는 바로 잠금을 해제한다. 이 스레드는 소스 서버에서 SHOW PROCESSLIST 명령을 통해 확인할 수 있다.
2. 레플리케이션 I/O 스레드(Replication I/O Thread)
복제가 시작되면 레플리카 서버는 I/O 스레드를 생성하고, 복제가 멈추면 I/O 스레드는 종료된다. I/O 스레드는 소스 서버의 바이너리 로그 덤프 스레드로부터 바이너리 로그 이벤트를 가져와 로컬 서버의 파일(릴레이 로그)로 저장하는 역할을 담당한다. 소스 서버의 바이너리 로그를 읽어서 파일로 쓰는 역할만 하기 때문에 “I/O” 스레드라고 명명된 것이다. 이 스레드의 상태는 MySQL의 복제 현황을 보여주는 SHOW REPLICA STATUS 또는 SHOW SLAVE STATUS 명령의 결과에서 Replica_IO_Running 또는 Slave_IO_running 컬럼에 표시된 값을 통해 확인할 수 있다.
3. 레플리케이션 SQL 스레드(Replication SQL Thread)
레플리케이션 I/O 스레드가 소스 서버로부터 가져온 바이너리 로그 이벤트들을 로컬 파일로 기록하는 역할이라면, 레플리케이션 SQL 스레드는 I/O 스레드에 의해 작성된 릴레이 로그 파일의 이벤트들을 읽고 실행한다. SQL 스레드로 I/O 스레드와 마찬가지로 SHOW REPLICA STATUS 또는 SHOW SLAVE STATUS 명령을 통해 스레드의 상태를 확인할 수 있으며, Replica_IO_Running 또는 Slave_IO_running 컬럼에 SQL 스레드의 현재 상태가 표시된다.
레플리카 서버에서 레플리케이션 I/O 스레드와 SQL 스레드는 서로 독립적으로 동작해서 만약 SQL 스레드에서 이벤트를 적용하는 게 느리더라도 I/O 스레드는 그것과 무관하게 정상적으로 빠르게 소스 서버로부터 이벤트를 읽어올 수 있다.
4. 릴레이 로그(Relay Log)
레플리케이션 I/O 스레드에 의해 작성되는 파일로, 소스 서버의 바이너리 로그에서 읽어온 이벤트(트랜잭션) 정보가 저장된다. 릴레이 로그는 바이너리 로그와 마찬가지로 현재 존재하는 릴레이 로그 파일들의 목록이 담긴 인덱스 파일과 실제 이벤트 정보가 저장돼 있는 로그 파일들로 구성된다. 릴레이 로그에 저장된 트랜잭션 이벤트들은 레플리케이션 SQL 스레드에 의해 레플리카 서버에 적용된다.
5. 커넥션 메타데이터(Connection Metadata)
커넥션 메타데이터는 레플리케이션 I/O 스레드에서 소스 서버에 연결할 때 사용하는 DB 계정 정보 및 현재 읽고 있는 소스 서버의 바이너리 파일명과 파일 내 위치 값 등이 담겨 있으며, 이러한 정보는 기본적으로 mysql.slave_master_info 테이블에 저장된다.
6. 어플라이어 메타데이터(Applier Metadata)
레플리케이션 SQL 스레드에서 릴레이 로그에 저장된 소스 서버의 이벤트들을 레플리카 서버에 적용(Replay)하는 컴포넌트를 어플라이어(Applier)라고 한다. 어플라이어 메타데이터는 최근 적용된 이벤트에 대해 해당 이벤트가 저장돼 있는 릴레이 로그 파일명과 파일 내 위치 정보 등을 담고 있으며, 레플리케이션 SQL 스레드는 이 정보들을 바탕으로 레플리카 서버에 나머지 이벤트들을 적용한다. 이 정보는 기본적으로 mysql.slave_relay_log_info 테이블에 저장된다.
커넥션 메타데이터와 어플라이어 메타데이터는 MySQL의 시스템 변수인 master_info_repository와 relay_log_info_repository를 통해 어떤 형태로 관리할지 설정할 수 있으며, 설정 가능한 값으로는 FILE과 TABLE 두 가지가 있다. 이 두 시스템 변수는 MySQL 8.0.2 버전부터 기본값이 TABLE로 변경됐으며, 향후 FILE 타입은 제거(Deprecated)될 예정이다.
Ref
- Real MySQL 8.0 2 - p.431 ~ p.433