문제 발생
프런트 클라이언트로부터 데이터 업데이트 요청을 받았고 DB에 업데이트를 정상적으로 처리했다. DB 업데이트 완료 이벤트를 다른 서버가 인지하고 업데이트 데이터를 조회했더니 간혈적으로 업데이트 이전 데이터가 조회는 현상이 있었다.
이 현상으로 인하여 데이터 무결성에 대한 문제를 인식하게 되었다.
클라이언트는 A서버에게 value를 20으로 업데이트 요청을 했고 A서버는 db에 데이터를 정상적으로 commit 했다.
A서버는 B서버에게 데이터가 업데이트 완료된 상태를 알렸고 B서버는 value 값을 조회했는데 업데이트 이전 value값 10이 조회되었다.
원인 파악
DB 서버는 Master와 Slave로 되어 있고 Insert, Update, Delete는 Master(Write) 서버로 요청을 하게 되고 Select는 Slave(Read) 서버로 요청될 수 있도록 구성되어 있다.
Master 서버에 데이터 변경이 발생되면 바이너리 로그를 Slave 서버에 전달하여 데이터 동기화를 진행하게 되는데 이때 동기화가 완료되는 시간보다 B서버의 조회시간이 더 빨리 발생하게 되면 문제가 발생되었다.
MySql Master, Slave 구조
리플리케이션 문제라고 예상했고 실제로 DBA 엔지니어에게 DB 서버 로그 오픈 요청 후 확인 결과 위의 문제를 확인하게 되었다.
해결방안
Data가 연속적인 Write and Read를 해야 하는 서비스는 Slave Server에서 Master Server로 조회할 수 있도록 변경하였다.
첫 트랜잭션 readOnly 속성 설정 따라 salveDataSource, masterDataSource가 결정되고 동일한 트랜잭션에서는 설정된 readOnly 속성은 변경되지 않는다.
만약에 동일한 트랜잭션이 아닌 다른 트랜잭션을 교차하게 되면 교차된 트랜잭션의 readOnly 설정에 따라 DataSoure가 결정되므로 readOnly 속성이 어떻게 설정이 되었고 트랜잭션이 흐름 파악 후 readOnly 설정을 해야 한다.
트랜잭션 readOnly 속성
readOnly | MySql Server |
false | Slave Server |
true | Master Server |
'Troubleshooting' 카테고리의 다른 글
[JPA] N+1 문제 (1) | 2022.11.12 |
---|---|
[Elastic Search] maximum shards open 에러 (0) | 2022.11.08 |
[Elastic Search] Rejecting mapping update to... (0) | 2022.11.07 |
댓글