문제 상황
어플리케이션에서 모든 비즈니스 로직이 정상 동작하지 않는 문제가 발생했다. 대표적으로, 결제 로직에서 소진 되어야 하는 한도가 초과 했음에도 불구하고 계속 소진되고 있던 것이었닼
원인
MariaDB의 Slave Node에서정합성 오류가 발생하고 있었다.
SHOW SLAVE STATUS;
알고보니 팀의 개발자 분께서 배포중에 Primary DB에 추가 해야하는 값을 Slave DB에 Insert 해버리신 것이었다. 그런데 그럼 데이터 정합성 문제가 없을거 같은데..? 알고보니 Slave DB와 primary DB 두군데 전부 insert 하셨다고 한다.
따라서 해당 작업 이후의 쓰기 작업 데이터는 Primary DB에만 업데이트가 되고, Secondary DB는 복사를 하고 있지 않은 상황인 것이다. 어플리케이션이 읽기 작업을 Slave에서 수행하고 있으므로 이미 수행한 쓰기 작업이 읽기 작업에는 반영이 되고 있지 않았던 것이다.
해결 방안
Slave Node에 있는 데이터를 지우고 Slave 동기화를 재시작 하였다. 또 개발자별로 계정을 분리하였고, 권한 설정을 통해 slave node에는 insert가 되지 않도록 하였다. (Slave Node가 read-only로 되어 있었음에도 불구하고, DB 계정을 root 계정을 사용히여 insert가 되고 있었던 것이 문제 중 하나.)
의문
현재 Grafana 매트릭으로 Replica Lag이 300 이상일 때 슬렉 알람을 울리도록 해두었다. 왜 슬렉 알람이 울리지 않았는가?
의문 해결 및 조치
확인 결과 Slave Node에 장애가 발생하여 아예 매트릭이 쌓이고 있지 않았다. 연결이 끊겼다고 보는것이 타당했던 것이다. 따라서 Grafana 알람에 Node 갯수를 체크하는 알람을 추가하였다.