-
복제 ( Replication )Technique/RDBMS 2016. 5. 17. 22:14반응형
복제는 2대 이상의 MySQL 서버가 동일한 데이터를 담도록 실시간으로 동기화 하는 기술이다. 일반적으로 MySQL의 복제에는 INSERT나 UPDATE와 같은 쿼리를 이용해 데이터를 변경할 수 있는 MySQL 서버와 SELECT 쿼리로 데이터를 읽기만 할 수 있는 MySQL 서버로 나뉜다.
MySQL 에서는 쓰기와 읽기의 역할로 구분해, 전자를 마스터( Master ) 라고하고 후자를 슬레이브 ( Slave ) 라고 하는데, 일반적으로 MySQL 서버의 복제에서는 마스터는 반드시 1개이며 슬레이브는 1개 잇아으로 구성할 수 있다.
하나의 MySQL이 일반적으로는 마스터 또는 슬레이브 가운데 하나의 역할만을 수행하지만, 때로는 MySQL 서버 하나가 마스터이면서 슬레이브 역할까지 수행하도록 설정하는 것도 가능하다. 또한 마스터용 MySQL 프로그램과 슬레이브용 MySQL 프로그램이 정해져 있는 것은 더더욱 아니다. 마스터나 슬레이브라는 것은 단지 그 서버의 역할 모델을 지칭하는 것일 뿐이다.
마스터 ( Master )
기술적으로는 MySQL의 바이너리 로그가 활성화 되면 어떤 MySQL 서버든 마스터가 될 수 있다. 애플리케이션의 입장에서 본다면 마스터 장비는 주로 데이터가 생성 및 변경, 삭제되는 주체라고 볼 수 있다. 일발적으로 MySQL 복제를 구성하는 경우 복제에 참여하는 여러 서버 가운데 변경이 허용이 되는 서버는 마스터로 한정할 떄가 많다. 그렇지 않은 경우 복제되는 데이터의 일관성을 보장하기 어렵기 떄문이다.
마스터 서버에서 실행되는 DML과 DDL 가운데 데이터의 구조나 내용을 변경하는 모든 쿼리 문양은 바이너리 로그에 기록한다. 슬레이브 서버에서 변경 내욕을 요청하면 마스터 장비는 그 바이너리 로그를 읽어 슬레이브로 넘긴다.
슬레이브 ( Slave )
데이터 ( 바이너리 로그 ) 를 받아 올 마스터 장비의 정보를 가지고 있는 경우 슬레이브가 된다. 마스터 서버가 바이너리 로그를 가지고 있다면 슬레이브 서버는 릴레이 로그를 가지고 있다. 일반적으로 마스터와 슬레이브의 데이터를 동일한 상태로 유지하기 위해 슬레이브 서버는 읽기전용의 read_only 파라미터를 설정할 때가 많다. 슬레이브 서버의 I/O 스레드는 마스터 서버에 접속해 변경 내역을 요청하고, 받아 온 변경 내역을 릴레이 로그에 기록한다. 슬레이브 서버의 SQL 스레드가 릴레이 로그에 기록된 변경 내역을 재실행 함으로써 슬레이브의 데이터를 마스터와동일한 상태로 유지한다.
주의 사항
슬레이브는 하나의 마스터만 설정 가능
이 제약이 없다면 다양한 모습의 구성으로 데이터를 복제할 수 있으나 MySQL 에서는 하나의 마스터만 가질 수 있는 제약이 있다.
마스터와 슬레이브의 데이터 동기화를 위해 슬레이브는 읽기 전용으로 설정
사용자의 실수나, 애플리케이션의 오류로 인해 일부 변경 작업은 맛터에서 실행되고 일부는 슬레이브에서 실행되고 있엇다면 데이터의 동기화에 상당한 노력이 필요할지도 모른다. 이런 실수를 막기위해 read_only설정으로 하는게 일반적이다.
슬레이브 서버용 장비는 마스터와 동일한 사양이 적합
마스터 서버에서 수많은 동시 사용자가 실행한 데이터 변경 쿼리 문장이 슬레이브 서버에서는 하나의 스레드로 모두 처리돼야한다. 그래서 변경이 매우 잦은 MySQL 서버일수록 마스터 서버의 사양보다 슬레이브 서버의 사양이 더 좋아야 마스터에서 동시에 여러 개의 스레드로 실행된 쿼리가 슬레이브에서 지연되지 않고 하나의 스레드로 처리될 수 있다.
복제가 불필요한 경우에는 바이너리 로그 중지
바이너리 로그를 안정적으로 기록하기 위해 갭 락을 유지하고 매번 트랜잭션이 커밋될 때마다 데이터를 변경시킨 쿼리 문장을 바이너리 로그에 기록해야 한다. 바이너리 로그를 기록하는 작업은 AutoCommit이 활성화된 MySQL 서버에서 더 심각한 부하로 나타날 때가 많다. 특히 트랜잭션을 지원하지 않는 MyISAM 테이블은 항상 AutoCommit 모드로 작동하기 때문에 InnoDB 테이블보다 바이너리 로그를 기록하는 데 더 많은 자원을 사용하게 된다.
바이너리 로그와 트랜잭션 격리 수준
바이너리 로그는 어떤 내용이 기록되느냐에 따라 STATEMENT 포맷 방식과 ROW 포맷 방식이 있다.
STATEMENT 방식은 바이너리 로그 파일에 마스터에서 실행되는 쿼리 문장을 기록하는 방식
ROW 포맷은 마스터에서 실행된 쿼리에 의해 변경된 레코드 값을 기록하는 방식이다.
격리수준을 주의해야한다.
반응형'Technique > RDBMS' 카테고리의 다른 글
MEMORY 스토리지 엔진 아키텍처 (0) 2016.05.19 MyISAM 스토리지 엔진 아키텍처 (0) 2016.05.19 플러그인 스토리지 엔진 모델 (0) 2016.05.16 메모리 할당 및 사용 구조 (0) 2016.05.16 MySQL 스레딩 구조 (0) 2016.05.16