엘라스틱 서치(Elasticsearch)에서 리뷰 데이터 저장 방식과 동기화 전략
1. 문제 발생
일반적인 정적 데이터는 CRUD와 함께 실시간으로 저장하는 것이 일반적이다. 그러나 프로젝트에서 리뷰 데이터를 Logstash를 통해 저장하는 방식을 선택하면서, MySQL에서 변경되는 데이터를 엘라스틱 서치와 어떻게 동기화할 것인지에 대한 고민이 필요했다.
2. 문제 원인
- 현재 코드에서 리뷰 데이터는 특정 상품의 감성 분석을 위해서만 사용된다.
- 리뷰 데이터는 실시간 갱신이 필요하지 않다. 주기적으로 감성 분석이 필요한 순간에만 동기화하면 된다.
- 제품(Product)의 경우 사용자 요청이 자주 발생하므로, 데이터가 변경될 때마다 갱신해야 한다. 그러나 리뷰 데이터는 인기 상품을 나열하는 특정 주기(예: 하루 한 번 갱신)마다 업데이트하면 충분하다.
- 따라서 MySQL에서 변경될 때마다 엘라스틱 서치에 동기화할 필요 없이, 정해진 주기에 맞춰 동기화하는 방식이 더 적합했다.
3. 문제 해결책 수립
해결 방법 비교
해결 방법 | 설명 | 장점 | 단점 |
CRUD 방식으로 실시간 동기화 | MySQL에서 변경될 때마다 Elasticsearch 갱신 | 데이터 최신성 유지 | 불필요한 연산 증가, 리소스 낭비 |
Logstash를 이용한 주기적 동기화 | 정해진 주기에만 동기화 수행 | 리소스 절약, 성능 최적화 | 실시간 반영 불가 |
Kafka 등 이벤트 기반 처리 | 변경 이벤트가 발생할 때만 동기화 | 최신성 유지, 비동기 처리 가능 | 추가 인프라 필요 |
4. 문제 해결: Logstash 기반 주기적 동기화 적용
(1) 리뷰 데이터는 주기적 갱신이 적합
- 인기 상품 추천을 위해 리뷰 데이터를 하루 한 번 감성 분석하는 구조이므로, MySQL에서 변경될 때마다 갱신할 필요가 없음.
- 불필요한 연산을 줄이고, 엘라스틱 서치의 리소스를 절약할 수 있음.
- 예를 들어, 인기 상품을 하루에 한 번 갱신한다면, 리뷰 데이터도 하루에 한 번 동기화하면 충분하다.
(2) Logstash의 데이터 삭제 처리 문제 해결
- Logstash는 기본적으로 데이터를 추가하는 방식으로 동작하기 때문에, MySQL에서 삭제된 데이터를 반영할 수 없음.
- 하지만 현재 프로젝트에서는 소프트 딜리트(Soft Delete) 방식을 사용하여 문제를 해결함.
- MySQL에서 리뷰 데이터를 삭제할 때, 실제로 데이터를 삭제하는 것이 아니라 is_deleted 플래그를 업데이트하는 방식.
- Logstash가 MySQL에서 데이터를 불러올 때, is_deleted 값이 반영되므로 정합성이 유지됨.
하드 딜리트 방식이었다면? MySQL에서 데이터가 삭제되면, Logstash는 해당 데이터를 감지하지 못해 엘라스틱 서치에 남아있게 됨. 그러나 소프트 딜리트 방식을 사용하면, MySQL에서 삭제된 데이터도 동기화 가능.
5. 결론
- 리뷰 데이터는 CRUD 기반 실시간 갱신이 필요하지 않으며, 주기적인 감성 분석 시점에만 동기화하는 것이 가장 효율적이다.
- Logstash 기반으로 리뷰 데이터를 동기화하되, 소프트 딜리트를 활용해 데이터 정합성을 유지한다.
- 이 방식은 불필요한 연산을 줄이고, 엘라스틱 서치의 리소스 사용을 최적화하는 데 효과적이다.
'트러블슈팅&기술선택' 카테고리의 다른 글
Elasticsearch의 형태소 분석 (0) | 2025.03.22 |
---|---|
MSA 분리 기준과 도입 전략 (0) | 2025.03.22 |
Elasticsearch와 트랜잭션 락 문제 해결 (0) | 2025.03.21 |
Elasticsearch의 보안 의사결정 (0) | 2025.03.20 |
Elasticsearch의 데이터는 어때야 하는가? (0) | 2025.03.20 |