예약 시스템에서 Master‐Replica와 분산 락 적용 중 발생한 문제 - fitpassTeam/fitpass GitHub Wiki
문제 상황
예약 시스템(Reservation)에서 동일한 자원을 여러 사용자가 동시에 예약하려는 경우가 발생하면서, **데이터 정합성(Data Consistency)**에 심각한 문제가 생기기 시작했습니다. 같은 시간대에 여러 명이 동일 자원을 예약할 수 있는 상황이 발생했던 것입니다.
이 문제를 해결하기 위해 다음과 같은 구조를 설계하고자 했습니다:
-
DB 구조를 Master-Replica 형태로 구성
-
Redisson 기반 분산 락(Redisson Distributed Lock) 적용
이러한 설계는 읽기 부하를 분산시키고 동시에 여러 요청이 발생하는 상황에서도 데이터 일관성을 보장하기 위한 전략이었습니다. 하지만 Master-Replica 환경을 직접 구성하고 적용하는 과정에서 여러 가지 예상하지 못한 문제가 발생했습니다.
문제 분석
Replica 설정 이슈 초기 설정 시, replica.cnf 파일을 아래와 같이 작성하였습니다:
[mysqld]
log_bin = mysql-bin
server_id = 11
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
default_authentication_plugin=mysql_native_password
여기서 server_id 값이 정상적으로 반영되지 않는 문제가 발생했습니다. Replica 서버에서 server_id가 Master와 동일하게 설정되는 현상이 발생했고, 이로 인해 레플리케이션이 정상적으로 동작하지 않는 상황이 있었습니다.
이 문제는 원인을 명확히 파악하기보다는 임시방편으로 server_id를 강제로 변경한 후, DB를 재시작하지 않고 적용하는 방식으로 처리했습니다. 이 과정에서 read_only 옵션이 영향을 준 것인지 여부도 명확히 파악하지 못한 채 지나갔습니다. 설정에 대한 이해 부족으로 인해 구성 자체가 불안정하게 진행되었습니다.
동기화는 되지만 데이터가 보이지 않는 문제 Replica DB에서 SHOW SLAVE STATUS를 통해 확인했을 때,
Slave_IO_Running: YES
Slave_SQL_Running: YES
두 값이 모두 YES로 출력되어 슬레이브 동기화가 정상적으로 작동 중인 것으로 보였습니다. 그러나 실제로는 Master DB에 존재하던 데이터가 Replica DB에는 존재하지 않거나, 새로운 데이터를 작성해도 정상 반영되지 않는 현상이 발생했습니다.
이는 Replica DB가 단순히 읽기용으로 작동하고 있음에도, 쓰기 작업이 시도되거나 실질적인 데이터 전파가 이루어지지 않는 상황이었습니다. Master-Replica 구조와 MySQL Replication에 대한 충분한 이해 없이 설정을 시도하면서, 구조적인 원리(예: binlog 포맷, GTID 설정, 권한 설정 등)에 대한 부분을 고려하지 못한 결과였습니다.
해결 방향 및 계획
현재는 일단 Redisson 기반 분산 락을 적용해 데이터 정합성 문제는 임시적으로 해결하였으나, Replica 구조의 핵심 목적이었던 읽기 분산이나 안정적인 확장성 확보까지는 도달하지 못했습니다.
이에 따라 다음과 같은 방향으로 대응하고자 합니다:
-
Master-Replica 구조에 대한 근본적인 학습 진행
-
MySQL replication 방식(Statement-based, Row-based, Mixed)
-
GTID 설정과 복제 안정성
-
read_only / super_read_only의 차이
-
Replication delay 발생 원인 및 대처 방안
-
실제 운영환경에서의 Master-Replica 설계 고려
-
단순 설정이 아닌, 모니터링/Failover까지 고려한 구조 설계
-
데이터 흐름을 명확히 파악한 후, 어떤 요청을 Master에 보내고 어떤 요청을 Replica로 보낼지 구분
-
분산 락 적용 시점 명확화
-
분산 락을 모든 동시성 문제의 해결책으로 보지 않고, 필요한 시점과 위치에만 최소한으로 적용
회고 및 교훈
이번 경험을 통해 단순히 기술적인 구조를 흉내 내듯 따라가는 방식이 아니라, 구조의 동작 원리를 먼저 이해하는 것이 훨씬 중요하다는 점을 다시 한번 느꼈습니다. Master-Replica 구조는 단순히 "읽기와 쓰기를 분리한다"는 개념 그 이상이며, 잘못된 설정은 오히려 데이터 불일치라는 더 큰 문제를 초래할 수 있습니다.
앞으로는 복잡한 구조를 도입하기 전, 핵심 원리와 동작 메커니즘에 대한 충분한 학습과 실험을 바탕으로 안정적으로 시스템을 설계하려 합니다.