단일 DB에서 읽기·쓰기 클러스터 분리 작업을 수행한 경험 중심
인턴 때 주문 서비스 DB가 트래픽이 늘면서 읽기 쿼리와 쓰기 트랜잭션이 같은 인스턴스를 쓰다 보니 둘 다 느려지는 문제가 있었습니다. 선임분이 읽기 전용 레플리카를 붙이는 작업을 진행하셨고, 저는 어떤 쿼리를 레플리카로 분기할지 코드 수준에서 정리하는 역할을 맡았습니다.
읽기 전용 쿼리 목록을 30개 정리하고 @Transactional(readOnly = true) 어노테이션을 붙이는 작업을 진행했습니다. 배포 후 메인 DB 쿼리 수가 약 40% 줄고 레플리카가 그만큼을 받아갔습니다. 실패했던 부분은 일부 조회 쿼리가 바로 이전 쓰기 결과를 참조해야 하는 케이스를 미리 파악하지 못한 것이었습니다. 레플리케이션 랙으로 데이터가 비어 보이는 버그가 2건 생겼고, 이 케이스들은 메인 DB로 강제 라우팅하도록 수정했습니다.
클러스터를 나누는 것보다 '어떤 쿼리가 강한 일관성이 필요한가'를 미리 정리하는 게 더 중요하다는 걸 그때 배웠습니다.