기존에 운영 DB와 엘라스틱서치를 동기화하는 방식은 특정 주기로 로그스태시에서 모든 일기 데이터를 조회하는 방식으로 구현되어 있었습니다.
조회 간격이 커질수록 사용자가 이후 자신이 작성한 글을 조회할 수 없거나 수정/삭제 데이터를 갱신받을 수 없는 등 사용자 경험이 떨어지기 때문에 최대한 짧은 주기(1~3초) 정도로 스케줄링을 설정해야했습니다.
단, 해당 방식은 DB 데이터가 많아질 수록 메모리에 올려야 하는 데이터도 많아질 뿐더러, 사용자에게 불편함을 주지 않기 위해서 짧은 주기로 데이터 동기화를 진행했기 때문에 거의 매초 데이터 조회, 변환, 역색인 등의 작업이 실행되어 CPU 사용률이 너무 높아져 검색 서버가 버틸 수 없는 문제가 발생했습니다.
위 문제를 해결하기 위해서는 DB와 엘라스틱서치를 동기화하는 과정에서 원하는 테이블에 변경이 발생했을 때 모든 데이터가 아닌 변경된 데이터만 조회할 수 있는 방식이 필요했습니다.
해당 조건에 맞는 해결책을 찾던 중 CDC(Changed Data Capture)라는 설계 패턴을 발견했고 요구사항과도 일치해 해당 방식으로 구현을 진행했습니다.
CDC(Changed Data Capture)는 변경된 데이터를 판별 및 추적하는데 사용되는 소프트웨어 설계 패턴입니다.
CDC는 처리해야 하는 데이터의 양을 줄여 데이터베이스 부하를 줄이고, 불필요한 배치 작업도 제거할 수 있습니다.
Timestamps on rows 방식은 변경 시점을 기록하는 타임스탬프 옵션을 생성해 해당 값이 마지막으로 DB를 확인한 시점과 다른 데이터를 감지하거나, 특정 값을 비교해 데이터가 변경되었는지 확인하는 방법입니다.