1. 알고자 하는 것
- 데이터베이스에서 대용량 데이터를 처리하기 위한 가용성(Availability)과 확장성(Scalability)
- MySQL에서의 복제(Replication)
- 복제(Replication) 시 고려해야 할 주의사항
- Statement 포맷 방식과 Row 포맷 방식
2. 알게된 것
데이터베이스에서 대용량 데이터를 처리하기 위한 가용성(Availability)과 확장성(Scalability)
- 서비스 사용자의 수가 늘어나고, 서비스 아키텍처가 커짐에 따라 그에 따른 데이터는 기하급수적으로 많아진다.
- 이렇게 많아지는 데이터를 기존 하나의 데이터베이스만으로 관리하기 힘들다.
- 많은 데이터를 하나의 데이터베이스에서 다루게 되면 그에 따른 트래픽을 모두 하나의 데이터베이스가 감당해야 한다.
- 수많은 요청에 대해 하나의 데이터베이스가 처리하게 된다면 그 데이터베이스는 하나의 장애가 전체 서비스의 장애로 이어지는 단일 장애점(SPOF, Single Point Of Failure)이 되어 가용성까지 해치게 된다.
- 즉, 서비스가 커질수록 대용량 데이터를 다룰 수 있는 기법이 필요하다.
- 수많은 요청에 대해서도 장애 없이 원활하게 동작할 수 있는 가용성(Availability)을 보장할 수 있어야 한다.
- 수많은 데이터를 재설계없이 유연하게 저장하고 관리할 수 있는 확장성(Scalability)을 보장할 수 있어야 한다.
MySQL에서의 복제(Replication)
- MySQL에서 가용성과 확장성을 높일 수 있는 기법 중에는 복제(Replication)라는 것이 존재한다.
- 복제(Replication)는 2대 이상의 MySQL 서버를 Master-Slave 구조로 구성하여 데이터를 동기화한다.
- Master 서버는 데이터의 저장/수정/삭제에 대한 요청만을 담당한다.
- Slave 서버는 데이터의 조회에 대한 요청만을 담당한다.
- Master 서버는 데이터 변경 사항을 Binary Log에 기록한다.
- Slave 서버는 주기적으로 Master 서버의 Binary Log를 읽어와 I/O Thread를 통해 Relay Log에 기록한다.
- Relay Log에 저장된 변경 사항을 Replay를 통해 Slave 서버에 동기화한다.
- 데이터 변경과 데이터 조회에 대한 트래픽을 나누어 담당함으로써 트래픽 과부하로 인한 장애를 줄일 수 있다.
- 하나의 Master 서버에 여러 대의 Slave 서버를 구성할 수 있어, 높은 확장성을 제공한다.
- 또한, Master 서버 장애 시 Slave 서버를 Master 서버로 승격시켜 높은 가용성을 제공한다.
복제(Replication) 시 고려해야 할 주의사항
- 하나의 Slave 서버는 하나의 Master 서버만을 둘 수 있다.
- 하나의 Master 서버는 여러 대의 Slave 서버를 둘 수 있다.
- 사용자 실수 및 애플리케이션 오류로 인해 Slave 서버에 데이터 변경 작업을 수행해 데이터 동기화에 문제가 발생하지 않도록 Slave 서버는 Read-Only로 설정한다.
- Slave 서버의 사양은 Master 서버와 동일한 사양이 적합하다.
- Binary Log에 기록된 수많은 데이터 변경 작업을 Slave 서버는 하나의 Thread만으로 처리하므로 이를 감당할 수 있는 사양이 필요하다.
- 복제가 불필요한 경우에는 Binary Log의 기록을 중지한다.
- Binary Log를 안전하게 동기화하여 기록하기 위해 갭 락(Gap Lock)을 유지하는 등의 많은 자원을 소모한다.
Statement 포맷 방식과 Row 포맷 방식
- Binary Log를 기록하는 방식에는 Statement 포맷 방식과 MySQL 5.1부터 추가로 제공되는 Row 포맷 방식이 존재한다.
- Statement 포맷 방식은 Binary Log에 수행된 SQL 쿼리를 기록해 해당 쿼리를 Replay 하는 방식이다.
- 데이터의 변경이 많은 쿼리라도 SQL 쿼리 하나만이 Slave 서버로 전달되므로 네트워크 트래픽이 적다.
- 쿼리를 수행하기 때문에 Master 서버와 Slave 서버 간 데이터 동기화를 위해 REPEATABLE READ(반복 가능한 읽기) 수준을 유지해야 하므로 Lock으로 인해 복제 지연이 발생할 수 있다.
- Row 포맷 방식은 Binary Log에 데이터의 변경 레코드를 기록해 해당 변경 레코드를 Replay 하는 방식이다.
- 데이터의 변경이 많을수록 변경 사항이 모두 레코드 형식으로 Slave 서버로 전달되므로 네트워크 트래픽이 많다.
- 변경 사항 자체가 레코드로 기록되어 있어 즉시 적용되므로 READ-COMMITTED 수준에서도 동작해 복제 지연에서 효율적이다.
3. 정리
- 서비스가 커질수록 대용량 데이터에 대한 대응이 필요하다.
- 대용량 데이터에 대해서는 높은 가용성과 확장성을 필요로 한다.
- Master-Slave 구조로 각 역할 별 트래픽을 분산하고, Binary/Relay Log를 통해 데이터를 동기화 할 수 있는 복제(Replication)를 통해 가용성과 확장성을 높일 수 있다.
- 데이터 동기화, 시스템 사양, 서비스의 상황을 적절히 고려하여 복제의 효율을 최적화 할 수 있도록 한다.
Reference
'Database' 카테고리의 다른 글
[Real MySQL, 6장 - 실행계획] type 컬럼 분석 (1) | 2023.12.19 |
---|---|
[MySQL] GROUP_CONCAT으로 grouping 한 결과를 한줄로 출력하기 (4) | 2023.11.19 |
[Real MySQL, 4장 - 트랜잭션과 잠금] MySQL에서의 트랜잭션 (0) | 2023.10.05 |
[Real MySQL, 3장 - 아키텍처] MySQL 엔진, 스토리지 엔진 (0) | 2023.09.13 |