[MySQL] Replication (2) - Replication은 어떻게 동작하는가

지난번 글에서는 replication이 무엇인지 알아보았다. 이번에는 MySQL replication이 어떻게 동작하는지 살펴볼 것이다.

replication은 다음과 같은 순서로 진행된다.

  1. 마스터 데이터베이스가 binary log를 만들어 이벤트를 기록한다.
  2. 각 슬레이브는 어떤 이벤트까지 저장되어 있는지를 기억하고 있다.
  3. 슬레이브의 IO thread를 통해서 마스터에 이벤트를 요청하고 받는다.
  4. 마스터는 이벤트를 요청받으면 binlog dump thread를 통해서 클라이언트에게 이벤트를 전송한다.
  5. IO thread는 전송받은 덤프 로그를 이용하여 relay log를 만든다.
  6. SQL thread는 relay log를 읽어서 이벤트를 다시 실행하여 슬레이브에 데이터를 복사한다.

각각을 자세히 설명하면 다음과 같다.

binary log

MySQL은 데이터 혹은 스키마를 변경하는 이벤트들을 저장할 수 있다. 이 이벤트들이 저장된 것을 binary log라고 부른다. binary log의 주목적은 데이터를 복구하는 것이다. 아카이브된 데이터가 있고, 아카이브 된 다음에 들어온 이벤트를 기록한 binary log가 있으면, 원하는 시점으로 데이터를 복구할 수 있다. 데이터베이스를 변경하는 모든 이벤트가 저장되어 있으므로 이를 슬레이브에서 다시 실행하는 것만으로도 복사된 데이터베이스가 만들어진다.

binlog dump thread

replication을 위해서는 마스터에 저장된 binary log를 슬레이브로 전송해야 한다. 이를 위해 마스터에서는 스레드를 만드는데 이를 binlog dump thread라고 부른다. binlog dump thread가 하는 일은 단순하다. 슬레이브가 이벤트를 요청하면 binary log에 락을 걸고, event를 읽어 슬레이브로 이벤트를 전송한다. 이때, binary log를 너무 긴 시간 락하지 않기 위해서 슬레이브에 전송하기 전에 binary log를 읽고 바로 락을 해제한다.

마스터는 슬레이브에 대한 정보를 전혀 가지고 있지 않다. 슬레이브가 있는지 없는지, 몇 개의 슬레이브가 붙어있는지, 각 슬레이브가 어디까지 데이터를 복사했는지, 보내야 할 이벤트가 있는지 전혀 모른다. 그저 슬레이브가 이벤트를 요청하면 그에 해당하는 이벤트를 보내줄 뿐이다. 덕분에 마스터는 큰 부하 없이 데이터를 복사할 수 있다.

binlog dump thread는 슬레이브가 마스터에 컨넥트할 때 생성되지만, 여러 개의 슬레이브가 붙어도 단 하나의 스레드만 생성된다.

I/O thread

슬레이브는 마스터에 없는 2개의 스레드가 있다. 그중 하나가 I/O thread다. 각 슬레이브는 자신이 어디까지 데이터를 복사했는지 기억하고 있다. I/O thread는 슬레이브가 마지막으로 읽었던 이벤트를 기억하고 있다가, 마스터에게 다음 이벤트를 전송해 달라고 요청한다. 마스터의 binlog dump thread가 이벤트를 보내주면 이것을 Relay log에 저장한다. 따라서 I/O thread가 정지된 상황에서 마스터의 binary log가 지워지면, 슬레이브는 마스터의 데이터를 복제할 수 없다.

Relay log

슬레이브는 I/O thread를 통해서 받은 이벤트를 로컬에 있는 file에 저장한다. 이를 relay log라고 부른다. 보통 relay log는 SQL thread가 이벤트를 읽고 나면 지운다. 따라서 어느 정도 이상의 크기가 되지 않는다. 하지만 SQL thread가 멈추어 있으면 relay log는 계속해서 크기가 커지게 된다. 그렇게 되면 I/O thread는 자동으로 새 relay log 파일을 만들어, 파일이 너무 커지는 것을 막는다.

SQL thread

SQL thread는 I/O thread가 만든 relay log를 읽어 실행을 시키고, relay log를 지운다. SQL을 실행시키는 스레드와 마스터로부터 값을 복사해오는 스레드가 분리되어 있다는 것은 매우 중요한 특징이다.

보통 MySQL의 데이터를 백업하여 아카이브를 만드는 것은 mysqldump를 이용한다. 하지만 mysqldump는 MySQL이 쿼리를 실행하고 있을 때 실행되면 데이터가 깨지는 문제가 발생한다. 하지만 replication을 이용하면, 슬레이브의 SQL thread만 정지시키면 되기 때문에 안전하게 백업을 만들 수 있다.


댓글

이 블로그의 인기 게시물

[C++] enum class - 안전하고 쓰기 쉬운 enum

Log Aggregator 비교 - Scribe, Flume, Fluentd, logstash

RAII는 무엇인가

[Python] cache 데코레이터로 최적화하기

[Web] SpeechSynthesis - TTS API