[2.6] DB replication

Always·2025년 2월 8일
1

매일메일

목록 보기
35/69

db replication

데이터베이스에서 부하 문제, 그리고 데드락 문제는 사용자가 경험하는 서비스에 문제를 일으키므로, 치명적이다. 이를 위해서 master-slave구조의 복사된 db를 이용해서, sql문을 두개 이상의 db에서 수행하게 할 수 있는데, 이것을 db replication이라고 한다. 복제한 db를 가지고 있다면, 여러 db사이의 동기화는 필수적이다. 이 동기화는 Mysql에서는 Binary Log를 기반으로 이 과정이 이루어진다.

출처: https://nesoy.github.io/articles/2018-02/Database-Replication
db replication울 통해서 괴부하를 줄일 수 있다. 위의 구조에서 slave db에서 select문에 대한 연산을 따로 수행하는데, 이는 select문의 연산이 full table scan을 이용하기 때문에 연산의 속도가 느리며, 다른 연산이 기다리게 되어서 병목 현상의 원인이 될수 있어서 그렇다.

Binary log

기본적으로 binary log를 통해서 master db와 slave db의 동기화가 일어난다.

출처: http://cloudrain21.com/mysql-replication
mysql은 크게 row,statement,Mixed방식을 통해서 두 서버의 정보를 동기화한다.

row

이 경우 각 행별 모든 내용을 정확히 기록한다. Binray log형태로 master db의 모든 행을 다 적어두고, 이를 이용해서, slave db를 변경한다. 당연하게도 모든 행을 다 기록해두니까 데이터의 일관성을 칼같이 지킬수 있다.
하지만 모든 정보를 다 저장해두니, 저장공간에 부담이 될 수 밖에 없다.

Statement

statement는 말그래도 구문, 즉 sql문을 저장해두는 것이다. 정확히는 데이터의 변경을 일으킨 sql문을 저장해두고, 이를 바탕으로 slave db를 수정하는 것이다.
row방식에 비해서 저장공간의 부담은 적으나, 만약 sql문이 그 때 그 때 달라지는 비확정적 sql쿼리문의 경우, 데이터베이스 일관성이 보장되지 않는다.
예를 들어서 sql Update table set date_table=NOW()... 이런 구문이 있다고 해보자.
현재 시간은 master db에 들어갈 때와, slave db에서 수정될 때 차이가 생기므로, 이 때문에 두 db사이의 db일관성이 깨지는 것이다.

Mixed

mysql은 위 두가지 방식을 모두 채택하는 mixed방식을 채택한다. 위처럼 비확정적 sql문이 실행될 경우에는!

row를, 그외에는 statement방식을 활용해서, 저장공간의 비효율성 문제와, 데이터 일관성 문제를 해결한다.

복제 과정

먼저 웹 어플리케이션 서버에서 변경 쿼리가 실행되면, binary log에 기록된다. 그 후 binray log를 Master스레드에서 Replica 서버의 IO 쓰레드로 전송한다.
replica 서버의 io 쓰레드는 읽은 log를 relay log에 저장하고, relay log를 기반으로 Replica 서버의 db에 변경사항을 적용한다.
이 과정이 매우 빠른 시간에 적용되기에, 원본과 복제 버거 간의 데이터 일관성이 잘 유지될 수 있다고한다.

물론 이런 과정이 번거롭게 느껴지고, 하나의 db를 더쓰는 것이기에 비용 효율성은 떨어질 수도 있을 수 있다. 하지만 사용자의 데이터가 많고, select문을 많이 수행하는 비즈니스라면,사용자의 사용 경험 개선을 위한 병목현상을 줄이기 위해서 relication을 사용하는 것을 고려해볼 수 있을 것 같다.

profile
🐶개발 블로그

0개의 댓글