본문으로 건너뛰기

Replication

1 Replecation

  • 데이터베이스의 데이터가 갈수록 대용량화돼 가는 것을 생각하면 확장성은 DBMS에서 아주 중요한 요소이다
  • MySQL의 복제는 레플리케이션이라고도 하는데, 복제는 2대 이상의 MySQL 서버가 동일한 데이터를 담도록 실시간으로 동기화 하는 기술이다.
  • 복제에는 INSERT나 UPDATE와 같은 쿼리를 이용해 데이터를 변경할 수 있는 MySQL서버(마스터)와 SELECT 쿼리로 데이터를 읽기만 할 수있는 MySQL서버(슬레이브)로 나뉜다.
  • 서버의 복제에서는 머스터는 반드시 1개이며 슬레이브는 1개 이상으로 구성될 수 있다.

2 마스터

  • INSERT나 UPDATE와 같은 쿼리를 이용해 데이터를 변경할 수 있는 MySQL서버를 마스터라고 한다
  • MySQL의 바이너리 로그가 활성화되면 어떤 MySQL 서버든 마스터가 될 수 있다.
  • 애플리케이션의 입장에서 본다면 마스터 장비는 주로 데이터가 생성 및 변경, 삭제되는 주체(시작점)이라고 볼 수 있다.
  • 일반적으로 복제에 참여하는 여러 서버 가운데 변경이 허용되는 서버는 마스터로 한정할 때가 많다.
  • 그렇지 않은 경우 복제되는 데이터의 일관성을 보장하기 어렵기 때문이다.
  • 슬레이브 서버에서 변경 내역을 요청하면 마스터 장비 는 그 바이너리 로그를 읽어 슬레이브로 넘긴다.
  • 마스터 장비의 프로세스 가운데 "Bimlog dump"라는 스레드가 이 일을 전담하는 스레드다.

3 슬레이브

  • SELECT 쿼리로 데이터를 읽기만 할 수있는 MySQL서버를 슬레이브라고 한다
  • 데이터(바이너리 로그)를 받아 올 마스터 장비의 정보(IP주소와 포트 정보 및 접속 계정)을 가지고 있는 경우 슬레이브가 된다. (마스터나 슬레이브라고 해서 별도의 빌드 옵션이 필요하거나 프로그램을 별도로 설치해야 하는 것은 아니다.)
  • 마스터 서버가 바이너리 로그를 가지고 있다면 슬레이브 서버는 릴레이 로그를 가지고 있다.
  • 슬레이브 서버의 I/O 스레드는 마스터 서버에 접속해 변경 내역을 요청하고 받아 온 변경 내역을 릴레이 로그에 기록한다.
  • 그리고 슬레이브 서버의 SQL 스레드가 릴레이 로그에 기록된 변경 내역을 재실행함으로써 슬레이브의 데이터를 마스터와 동일한 상태로 유지한다.
  • I/O 스레드와 SQL 스레드는 마스터 MySQL에서는 가동되지 않으며, 복제가 설정된 슬레이브 MySQL 서버에서 자동적으로 기동하는 스레드다.

4 주의사항

4.1 슬레이브는 하나의 마스터만 설정 가능

  • 슬레이브는 하느의 마스터만 가질 수 있다
  • 하나의 마스터에 N개의 슬레이브가 일반적인 형태이다

4.2 마스터와 슬레이브의 데이터 동기화를 위해 슬레이브는 읽기 전용으로 설정

  • 마스터와 슬레이브로 복제가 구성된 상태에서는 데이터는 마스터로 접속해서 변경해야한다
  • 실수로 일부 데이터를 슬레이브에서 실행한다면 데이터 동기화에 상당한 노력이 필요하다
  • 따라서 사용자 실수를 막기위해 슬레이브는 읽기 전용 (read_only)으로 설정하는 것이 일반적

4.3 복제가 불필요한 경우에는 바이너리 로그를 중지

  • 바이너리 로그 작성을 위해 많은 자원을 소모한다
  • 바이너리 로그를 안정적으로 기록하기 위해 갭 락(Gap lock)을 유지하고, 매번 트랜잭션 이 커밋될 때 마다 데이터를 변경시킨 쿼리 문장을 바이너리 로그에 기록해야 한다.
  • 바이너리 로그를 기록하는 작업은 AutoCommit이 활성화 된 MySQL 서버에서 심각한 부하로 나타날 때가 많다.

4.4 바이너리 로그와 트랜잭션 격리 수준

  • 바이너리 로그 파일은 어떤 내용이 기록되냐느에 따라 STATEMENT 포맷 방식과 ROW 포맷 방식이 있다.
  • STATEMENT 방식은 바이너리 로그 파일에 마스터에서 실행되는 쿼리 문장을 기록하는 방식이며, ROW 포맷은 마스터에서 실행된 쿼리에 의해 변경된 레코드 값을 기록하는 방식이다.

참고