Featured image of post 16.7.1 복제 고급 설정 - 지연된 복제

16.7.1 복제 고급 설정 - 지연된 복제

Real MySQL 8.0

복제는 최대한 빠르게 동기화해서 소스 서버와 레플르키 서버 가느이 데이터를 동일한 상태로 만드는 것이 원래의 목적이다.

소스 서버와 레플리카 서버 간의 데이터 동기화 지연이 없으면 없을수록 레플리카 서버를 이용한 장애 복구가 용이해지며, 이러한 부분은 레플리카 서버를 서버스의 읽기 요청 처리 용도로 사용할 때도 매우 유용하다.

하지만 때로는 의도적으로 소스 서버와 레플리카 서버 간의 복제를 지연시켜야 할 때도 있다.

  • 개발자나 DBA가 소스 서버에서 실수로 중요한 테이블이나 데이터를 삭제하여 서비스를 멈추고 데이터를 복구해야 하는 경우
  • 이전 시점의 데이터 값에 대해 확인이 필요한 경우
  • 데이터 반영에 지연이 있을 때 어떻게 서비스가 동작하는지 테스트를 위한 시뮬레이션이 필요한 경우
1
2
3
4
5
/* 8.0.23 이전 */
CHANGE MASTER TO MASTE_DELAY=86400;

/* 8.0.23 이후 */
CHANGE REPLICATION SOURCE TO MASTE_DELAY=86400;

MySQL 8.0 개선점

MySQL의 지연된 복제 기능은 5.6 버전에서 처음 도입됐으며, 8.0 버전에서 바이너리 로그에 타임 스탬프가 추가되는 등 몇 가지 부분들이 개선되었다.

  • original_commit_timestamp(OCT)

    • 트랜잭션이 원본 소스 서버(트랜잭션이 시작된 소스 서버)에서 커밋된 시각으로, 밀리초 단위의 유닉스 타임스탬프 값으로 저장된다.
  • immediate_commit_timestamp(ICT)

    • 트랜잭션이 직계 소스 서버(바로 위 소스 서버)에서 커밋된 시각으로, 밀리초 단위의 유닉스 타임스탬프 값으로 저장된다.
  • OCT 값은 복제 구성에서 해당 트랜잭션이 복제되는 모든 레플리카 서버들이 동일한 값을 가지며, 원본 소스서버는 OCT 값과 ICT 값이 동일하다.

  • log_slave_updates 옵션이 활성화 되어있는 경우 ICT에는 레플리카 서버에서 복제된 트랜잭션이 커밋된 시점으로 값이 저장된다.

  • 두 타임 스탬프 값은 소스 서버의 바이너리 로그에 기록되어 레플리카 서버로 그대로 복제되어 릴레이 로그에 저장되는데, 레플리카 서버에서는 SOURCE_DELAY 옵션에 값이 지정되면 ICT를 참조하여 각 트랜잭션별로 실행을 지연시킬 것인지 결정한다.


MySQL 8.0 미만 버전의 지연된 복제에서는 이벤트 그룹(트랜잭션) 단위가 아닌 개별 이벤트 단위로 지연 실행 여부를 결정하였다.

이로 인해 동일한 트랜잭션 내의 이벤트들이라 하더라도 각 이벤트 사이에 지연 대기가 발생하였고, 지연 측정을 위한 기준 시각도 각 이벤트가 종료된 시각이 아닌 시작된 시각이 기준이었다.

원본 소스 서버의 바이너리 로그에 기록된 이벤트 시작 값이 레플리카 서버들로 그대로 복제되므로 최하위 계층의 레플리카 서버에서는 자신의 직계 소스 서버가 아닌 원본 소스 서버의 시각을 기준으로 지연이 계산되었으며, 체인 복제를 구성하는 서버들의 타임존이 서로 다른경우 지연 시간이 예상한 것과는 다른 값으로 계산되어 표시되었는데 타임 스탬프를 활용하게 되며 이러한 문제점이 사라졌다.


지연된 복제가 활성화되면 SHOW [REPLICA | SLAVE] STATUS 명령의 결과에서 레플리카 서버가 얼마나 지연되어 실행되고 있는지, 다음 트랜잭션을 실행할 때까지 얼마나 시간이 남았는지를 확인할 수 있다.

1
2
3
SHOW GLOBAL STATUS LIKE '%semi_sync_master%';

SHOW GLOBAL STATUS LIKE '%semi_sync_slave%';
  • 지연된 복제를 사용한다고 하더라도 소스 서버의 바이너리 로그는 즉시 레플리카 서버의 릴레이 로그 파일로 복사된다.
  • 따라서 소스 서버가 장애로 디스크의 데이터가 복구 불가능하다 하더라도 레플리카 서버의 릴레이 로그를 이용해서 복구한다면 지연된 복제를 사용하지 않는 복제와 같이 레플리카 서버로의 장애 복구가 가능하다.

복제를 지연되지 않도록 다시 설정하고 싶은 경우 다음 명령을 실행한다.

1
2
3
4
STOP [SLAVE | REPLICA] SQL_THREAD;
CHANEGE [MASTER | REPLICATION SOURCE] TO [MASTER_DELAY | SOURCE_DELAY]=0;
START [SLAVE | REPLICA] SQL_THREAD;
```