<aside> 이번에 STO 거래소를 구현하면서 코인 체결 시 빈번한 IO 때문에 읽기 성능 저하로 데이터베이스를 이중화 하여 읽기와 쓰기 작업을 분산 처리하고 또 데이터 안정성을 확보하였습니다.
거래소 뿐만 아니라 어떤 애플리케이션에서도 가용성 향상, 읽기 성능 향상, 데이터 복구 및 백업, 부하 분산, 데이터 안정성 및 보호 작업이 필요하다고 여긴다면 도입을 고려해 보는 것도 좋을 것 같습니다.
</aside>
데이터베이스 복제(Database Replication)이 어떻게 진행이 되는지 간단히 살펴보고, docker를 통해서 master db와 slave db를 생성한 뒤 master에서 insert 하면 slave에 데이터가 복제되는 것까지 확인해 보도록 하겠습니다.
기본적인 동작 흐름은 다음과 같습니다.
+---------------------+ +---------------------+
| Master Database | | Slave Database |
| | | |
| +-----------+ | | +-----------+ |
| | Data | | | | Data | |
| | Changes | | | | Replicated| |
| +-----------+ | | +-----------+ |
| | | | ^ |
| v | | | |
| +------------+ | | +------------+ |
| | Change | | | | Change | |
| | Logs |------------> | Logs | |
| +------------+ | | +------------+ |
+---------------------+ +---------------------+
Master 변경 사항 발생
사용자나 응용 프로그램이 데이터베이스에 새로운 데이터를 삽입, 갱신 또는 삭제하는 등의 변경 작업을 수행합니다.
변경 로그 생성
Master 데이터베이스는 변경 사항을 로그로 기록합니다. 이 변경 로그에는 수행된 SQL 쿼리나 트랜잭션 정보 등이 포함됩니다.
로컬 적용 또는 전송
Master 데이터베이스는 변경 로그를 이용하여 Slave 데이터베이스에 변경 사항을 전송합니다.
일부 시스템에서는 Master에서 변경이 발생할 때마다 실시간으로 변경을 Slave에 적용하는 방식이 있고, 일부 시스템에서는 주기적으로 변경 로그를 Slave에 전송하고 Slave는 해당 로그를 처리하여 업데이트를 수행하는 방식도 있습니다.
Slave 변경 사항 적용
Slave는 Master로부터 전송된 변경 로그를 받아 자신의 데이터베이스에 변경 사항을 적용합니다.
동기화 확인
Slave는 변경 로그를 받고 적용하는 동안 Master와의 동기화를 유지합니다. 동기화가 유지되면 Slave는 Master와 같은 상태를 유지하게 됩니다.
Mysql로 한번 데이터베이스 복제를 진행해 보도록 하겠습니다.
version: '3'
services:
mysql-master:
image: mysql:latest
command: --server-id=1 --log-bin=mysql-bin --gtid-mode=ON --enforce-gtid-consistency=true
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: mydatabase
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- "13306:3306" # 여기서 13306은 호스트 포트, 3306은 컨테이너 포트
mysql-slave:
image: mysql:latest
command: --server-id=2 --log-bin=mysql-bin --gtid-mode=ON --enforce-gtid-consistency=true
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: mydatabase
MYSQL_USER: user
MYSQL_PASSWORD: password
depends_on:
- mysql-master
ports:
- "14306:3306" # 여기서 14306은 호스트 포트, 3306은 컨테이너 포트
서버에 docker compose를 설치하고 위의 docker-compose.yml 파일을 생성합니다.
설명
Master는 insert, update, delete를 진행합니다.