
엘라스틱서치를 활용한 수평 확장 가능한 광고 서버 만들기
두줄요약
복잡한 광고 타게팅 조회를 MySQL 조인에서 Elasticsearch inverted index 검색으로 전환했습니다. 단일 샤드·자동 레플리카 확장 구성으로 낮은 지연과 수평 확장을 확보했습니다.
문제 상황
- 광고 객체 조회 시 7개 테이블에 걸친 조인과 100개 이상의 타게팅 조건
- 읽기 요청이 쓰기 요청보다 압도적으로 많고, 변경 반영에는 짧은 지연 허용
해결 방법
- MySQL 정규화 데이터 대신 광고 송출용 문서를 Elasticsearch에 인덱싱
- 타게팅 조건을 inverted index의 집합 연산으로 처리
- 필터링과 스코어링 로직을 결합한 광고 우선순위 산정
구조와 흐름
- 활성 광고 중심의 단일 샤드와 노드별 레플리카 구성
auto_expand_replicas: 0-all로 노드 수에 맞춘 레플리카 확장_only_localsearch preference로 불필요한 노드 간 요청 방지
성능/운영 포인트
- P95 약 21ms 응답 시간과 painless script 기반 스코어링
- 데이터 크기 대비 CPU 바운드 특성에 맞춘 고성능 인스턴스 선택
- 오토스케일링 그룹과 ELB 기반의 수평 확장
