엘라스틱 서치(Elasticsearch)와 트랜잭션 락 문제 해결

1. 문제 발생

내가 담당한 상품과 주문 데이터는 정합성을 유지하기 위해 락이 필요했다. 기존에는 MySQL만 사용했기 때문에 MySQL의 트랜잭션 락을 활용하면 됐다. 하지만 추가로 엘라스틱 서치를 검색 엔진으로 도입하면서, 엘라스틱 서치의 데이터 동기화 과정에서 락이 필요한 문제가 발생했다.

 

2. 문제 원인

  • MySQL은 트랜잭션을 지원하지만, 엘라스틱 서치는 ACID 트랜잭션을 지원하지 않는다.
  • MySQL에서 데이터를 업데이트한 후, 엘라스틱 서치에도 동일한 데이터를 업데이트해야 하는데, 이 과정에서 동기화 지연이 발생할 수 있다.
  • 만약 MySQL에는 데이터가 업데이트되었지만, 엘라스틱 서치에 즉시 반영되지 않으면 데이터 불일치(Inconsistency) 문제가 발생할 수 있다.
  • 이를 방지하기 위해서는 MySQL의 트랜잭션에 엘라스틱 서치의 CRUD 작업도 포함하는 방식이 필요했다.

 

3. 문제 해결책 수립

해결 방법 비교

해결 방법 설명 장점 단점
MySQL 트랜잭션만 사용 MySQL에서만 락을 걸고 엘라스틱 서치는 비동기 처리 구현이 간단함 데이터 일관성 문제 발생 가능
엘라스틱 서치 락 구현 엘라스틱 서치 내에서 락을 설정하여 트랜잭션처럼 동작 검색 엔진 단에서 동기화 가능 성능 저하 및 트랜잭션 완전 보장이 어려움
MySQL 트랜잭션 내에 엘라스틱 서치 CRUD 포함 MySQL 트랜잭션이 진행될 때 엘라스틱 서치도 동기화 수행 데이터 정합성 유지 가능 일부 요청 속도 저하 가능

 

4. 문제 해결: MySQL 트랜잭션 락에 엘라스틱 서치 CRUD 포함

가장 안정적인 방법은 MySQL 트랜잭션 내에서 엘라스틱 서치의 CRUD(Create, Read, Update, Delete) 작업도 포함시키는 것이었다.

  • MySQL에서 트랜잭션을 시작하고, 해당 데이터에 대한 변경 사항을 반영하는 동안 엘라스틱 서치에도 동시에 업데이트 수행
  • MySQL에서 커밋이 완료되면, 엘라스틱 서치에서도 색인을 갱신하여 데이터 일관성을 유지
  • 트랜잭션이 롤백되면, 엘라스틱 서치 업데이트도 취소하도록 구현
  • 이벤트 기반 동기화를 추가하여, 변경된 데이터를 트리거로 활용해 엘라스틱 서치를 최신 상태로 유지

결론: MySQL과 엘라스틱 서치의 동기화를 위해 MySQL 트랜잭션 내부에서 엘라스틱 서치의 CRUD 작업을 함께 수행하는 방식을 선택했다. 이를 통해 데이터 일관성을 유지하면서도 성능 저하를 최소화할 수 있다.

+ Recent posts