리플리케이션이란 여러 개의 DB를 권한에 따라 수직적인 구조(Master-Slave)로 구축하는 방식이다.
리플리케이션에서 Master Node는 쓰기 작업 만을 처리하며 Slave Node는 읽기 작업 만을 처리한다. 리플리케이션은 비동기 방식으로 노드들 간의 데이터를 동기화하는데, 자세한 처리 방법은 아래와 같다.
![]()
위의 그림은 MySQL의 Replication 방식에 대한 그림이며 자세한 처리 순서는 아래와 같다.
1.Master 노드에 쓰기 트랜잭션이 수행된다.
2.Master 노드는 데이터를 저장하고 트랜잭션에 대한 로그를 파일에 기록한다.(BIN LOG)
3.Slave 노드의 IO Thread는 Master 노드의 로그 파일(BIN LOG)를 파일(Replay Log)에 복사한다.
4.Slave 노드의 SQL Thread는 파일(Replay Log)를 한 줄씩 읽으며 데이터를 저장한다.
리플리케이션은 Master와 Slave간의 데이터 무결성 검사(데이터가 일치하는지)를 하지 않는 비동기방식으로 데이터를 동기화한다. 이러한 구조에 의해 리플리케이션 방식은 다음과 같은 장점과 단점을 갖고 있다.
DB 요청의 60~80% 정도가 읽기 작업이기 때문에 Replication만으로도 충분히 성능을 높일 수 있다.
비동기 방식으로 운영되어 지연 시간이 거의 없다.
노드들 간의 데이터 동기화가 보장되지 않아 일관성있는 데이터를 얻지 못할 수 있다.
Master 노드가 다운되면 복구 및 대처가 까다롭다.
클러스터링이란 여러 개의 DB를 수평적인 구조로 구축하는 방식이다.
클러스터링은 분산 환경을 구성하여 Single point of failure와 같은 문제를 해결할 수 있는 Fail Over 시스템을 구축하기 위해서 사용된다. 클러스터링은 동기 방식으로 노드들 간의 데이터를 동기화하는데, 자세한 처리 방법은 아래와 같다.
![]()
위의 그림은 MySQL의 Clustering 방식 中 Galera 방식에 대한 그림이며 자세한 처리 순서는 아래와 같다.
1개의 노드에 쓰기 트랜잭션이 수행되고, COMMIT을 실행한다.
실제 디스크에 내용을 쓰기 전에 다른 노드로 데이터의 복제를 요청한다.
다른 노드에서 복제 요청을 수락했다는 신호(OK)를 보내고, 디스크에 쓰기를 시작한다.
다른 노드로부터 신호(OK)를 받으면 실제 디스크에 데이터를 저장한다.
클러스터링은 DB들 간의 데이터 무결성 검사(데이터가 일치하는지)를 하는 동기방식으로 데이터를 동기화한다. 이러한 구조에 의해 클러스터링 방식은 다음과 같은 장점과 단점을 갖고 있다.
노드들 간의 데이터를 동기화하여 항상 일관성있는 데이터를 얻을 수 있다.
1개의 노드가 죽어도 다른 노드가 살아 있어 시스템을 계속 장애없이 운영할 수 있다.
여러 노드들 간의 데이터를 동기화하는 시간이 필요하므로 Replication에 비해 쓰기 성능이 떨어진다.
장애가 전파된 경우 처리가 까다로우며, 데이터 동기화에 의해 스케일링에 한계가 있다.
클러스터링을 구현하는 방법으로는 또 Active-Active와 Active-Standby가 있다. Active-Active는 클러스터를 항상 가동하여 가용가능한 상태로 두는 구성 방식이고, Active-Standby는 일부 클러스터는 가동하고, 일부 클러스터는 대기 상태로 구성하는 방식이다. 상황에 따라 알맞은 구조를 선택하면 된다.
데이터베이스 서버가 동작하지 않게 되면 전체 서비스가 동작할 수 없는 점을 해결하기 위해 Clustering을 통하여 서버를 한 대가 아닌 두 대로 구성하게 된다. 서버가 두대인 상황을 간략하게 표현하면 아래와 같은 구조다. 이때 DB서버는 서로 다른 인스턴스에서 동작한다.
![]()
이 경우 같은 데이터베이스 서버 두 대를 하나로 묶어 운영하고 있다. 이때 두 서버의 상태가 모두 Active인 상태다. 이렇게 되면 서버 한 대가 죽게 되더라도 하나의 서버가 동작하고 있어서 서비스에 큰 문제가 발생하지 않는다. 다른 서버가 동작하는 동안 복구를 하여 서비스의 중단이 없도록 할 수 있다. 또한 이렇게 구성함으로써 하나의 데이터베이스 서버에 가해지던 부하가 두 개로 나눠져 지므로 CPU와 Memory도 부하가 줄어들게 된다.
이렇게 구성하면 무조건 좋은점만 있을까? 여러 개의 서버가 하나의 스토리지를 공유함으로써 병목현상이 발생할 수 있다. 이러한 문제점을 해결하기 위해 하나의 서버는 Active 상태 다른 하나는 Stand-by 상태로 두는 방법이 있다.
Active 상태의 서버에 문제가 생겼을 때 Fail over를 하여 Stand-by 서버를 Active로 전환하여 문제에 대응 할 수 있다. 비용적인 부분에서는 별다른 차이가 없을 수 있지만 한 대로 서버가 운영되기 때문에 병목현상을 해결 할 수있다.
![]()
하지만 Active & Stand-by에도 문제점이 있다. Fail over가 발생하는 시간 동안에는 서비스가 중단될 수 밖에 없다. 또한 결론적으로 한 대로 운영하기 때문에 효율은 Active & Active의 1/2 정도가 된다.
굿