Elasticsearch 리드·아키텍트 기술면접
새 면접Q. 대규모 Elasticsearch 클러스터를 설계할 때 샤드 수를 결정하는 기준과 원칙을 설명해주세요. 특히 over-sharding과 under-sharding의 트레이드오프와 힙 메모리와의 관계를 포함해서 답변해주세요.
샤드당 적정 크기, 노드당 샤드 수, 힙 메모리 사용량의 관계를 고려해보세요.
샤드 수 결정 시 가장 중요한 원칙은 샤드당 크기를 10~50GB로 유지하고, 노드당 샤드 수를 힙 메모리 1GB당 20개 이하로 제한하는 것입니다. Over-sharding은 각 샤드의 메타데이터가 마스터 노드의 힙 메모리를 과도하게 사용하고, 검색 시 많은 샤드를 조회해야 하므로 오버헤드가 증가합니다. Under-sharding은 개별 샤드가 너무 커져서 복구 시간이 길어지고, 장애 시 영향 범위가 커지며, 리밸런싱의 유연성이 떨어집니다. 일반적으로 데이터 증가율을 고려하여 6개월~1년 후 예상 크기를 기준으로 샤드 수를 결정하며, 시계열 데이터의 경우 ILM을 통해 주기적으로 새 인덱스를 생성하여 샤드 크기를 관리합니다. 프로덕션 환경에서는 모니터링을 통해 샤드당 평균 검색 시간, 인덱싱 처리량, 힙 사용률을 지속적으로 추적하고 필요시 reindex를 통해 샤드 구조를 재조정합니다.
- • 샤드당 10~50GB, 노드당 힙 1GB당 20개 샤드 이하 유지
- • Over-sharding은 메타데이터 오버헤드와 검색 성능 저하 유발
- • Under-sharding은 복구 시간 증가와 리밸런싱 유연성 저하
- • 시계열 데이터는 ILM으로 주기적 인덱스 생성 관리
수십 TB 규모의 로그 데이터를 저장하는 시스템에서 샤드 전략 실패로 인한 클러스터 불안정을 예방하고 최적의 검색 성능을 유지할 때 필수적입니다.
Hot-Warm-Cold 아키텍처를 도입할 때 각 티어별 샤드 전략은 어떻게 달라져야 할까요?
Q. Elasticsearch의 검색 성능을 결정하는 주요 단계인 Query Phase와 Fetch Phase의 동작 원리를 설명하고, 대량의 결과를 페이징할 때 발생하는 Deep Pagination 문제와 이를 해결하는 방법들을 비교 설명해주세요.
Coordinate 노드의 역할과 Search After, Scroll API의 차이를 중심으로 생각해보세요.
검색은 Query Phase와 Fetch Phase 두 단계로 진행됩니다. Query Phase에서는 coordinate 노드가 모든 관련 샤드에 쿼리를 보내고, 각 샤드는 매칭된 문서의 ID와 정렬 값만 반환합니다. Coordinate 노드는 이를 병합하여 상위 N개를 선정한 후, Fetch Phase에서 해당 문서의 실제 내용을 가져옵니다. Deep Pagination 문제는 from+size가 클 때 각 샤드가 그만큼의 결과를 메모리에 유지해야 하므로, 10,000번째 페이지를 요청하면 모든 샤드에서 10,000개씩 정렬해야 하는 문제입니다. 해결 방법으로 Search After는 이전 결과의 정렬 값을 기준으로 다음 페이지를 가져오므로 메모리 효율적이며 실시간 검색에 적합합니다. Scroll API는 스냅샷을 생성하여 일관된 결과를 보장하지만 컨텍스트를 유지해야 하므로 대량 배치 작업에 적합하고, Point in Time API는 Scroll의 개선 버전으로 더 유연한 컨텍스트 관리를 제공합니다. 일반 사용자 페이징에는 Search After를, 전체 데이터 추출에는 PIT + Search After 조합을 권장합니다.
- • Query Phase는 ID와 정렬값만, Fetch Phase는 실제 문서 내용 조회
- • Deep Pagination은 모든 샤드에서 from+size만큼 정렬해야 하는 메모리 문제
- • Search After는 메모리 효율적이고 실시간 검색에 적합
- • Scroll/PIT는 일관된 결과 보장하며 대량 배치 작업에 사용
전자상거래 사이트에서 수천만 개의 상품을 검색하고 페이징할 때 사용자 경험과 서버 리소스를 동시에 최적화할 때 적용됩니다.
수억 건의 데이터에서 복잡한 집계(aggregation)를 수행할 때 성능을 최적화하는 전략은 무엇인가요?
Q. Elasticsearch의 인덱싱 성능에 영향을 주는 Refresh, Flush, Merge 작업의 차이와 내부 동작 원리를 설명하고, 대량 데이터 인덱싱 시 최적화 전략을 제시해주세요.
Lucene 세그먼트와 트랜잭션 로그의 관계, 그리고 bulk API 설정을 고려해보세요.
Refresh는 메모리의 인덱스 버퍼를 디스크의 새로운 Lucene 세그먼트로 작성하여 검색 가능하게 만드는 작업으로, 기본 1초마다 실행되며 실시간 검색성을 제공하지만 빈번한 실행은 성능을 저하시킵니다. Flush는 메모리의 세그먼트를 디스크에 fsync하고 트랜잭션 로그를 비우는 작업으로, 장애 복구 시점을 확정하며 기본 30분 또는 translog 크기 기준으로 실행됩니다. Merge는 작은 세그먼트들을 큰 세그먼트로 병합하여 검색 효율을 높이고 삭제된 문서를 물리적으로 제거하는 백그라운드 작업입니다. 대량 인덱싱 최적화를 위해서는 refresh_interval을 -1로 설정하여 비활성화하고, replica 수를 0으로 줄인 후 인덱싱 완료 후 복구하며, bulk API의 크기를 5~15MB로 조정하고, translog durability를 async로 설정합니다. 또한 index.merge.scheduler.max_thread_count를 조정하여 merge 성능을 최적화하고, 인덱싱 완료 후 force merge로 세그먼트를 통합하여 검색 성능을 향상시킵니다.
- • Refresh는 검색 가능하게, Flush는 영속화, Merge는 세그먼트 통합
- • 대량 인덱싱 시 refresh_interval -1, replica 0으로 설정
- • Bulk API 크기 5~15MB, translog async 모드 사용
- • 완료 후 force merge로 세그먼트 최적화
하루 수억 건의 로그를 인덱싱하면서도 실시간 검색을 제공해야 하는 모니터링 시스템에서 인덱싱 처리량과 검색 성능의 균형을 맞출 때 적용됩니다.
실시간 검색 요구사항과 대량 인덱싱을 동시에 처리해야 하는 경우 어떤 아키텍처를 제안하시겠습니까?
Q. Elasticsearch의 Dynamic Mapping과 Explicit Mapping의 장단점을 비교하고, 프로덕션 환경에서 권장되는 매핑 전략과 mapping explosion 문제를 예방하는 방법을 설명해주세요.
필드 수 제한, nested/object 타입, dynamic templates의 활용을 고려해보세요.
Dynamic Mapping은 개발 초기 단계에서 빠른 프로토타이핑이 가능하지만, 의도하지 않은 타입으로 필드가 생성되거나 mapping explosion이 발생할 위험이 있습니다. Explicit Mapping은 스키마를 명확히 정의하여 데이터 품질을 보장하고 성능을 최적화할 수 있으며, 프로덕션 환경에서 필수적입니다. Mapping explosion은 동적으로 생성되는 필드가 무제한 증가하여 클러스터 상태 크기가 비대해지고 성능이 저하되는 문제로, index.mapping.total_fields.limit(기본 1000)을 적절히 설정하여 예방합니다. 예방 전략으로는 dynamic을 strict로 설정하여 정의되지 않은 필드를 거부하거나, dynamic templates를 활용하여 패턴 기반으로 타입을 제어하고, 가변적인 키-값 데이터는 flattened 타입이나 nested 타입을 사용하여 필드 수를 제한합니다. 또한 불필요한 필드는 enabled: false로 인덱싱을 비활성화하고, 검색이 필요없는 필드는 index: false로 설정하여 리소스를 절약합니다.
- • Dynamic Mapping은 편리하지만 mapping explosion 위험
- • Explicit Mapping으로 스키마 제어와 성능 최적화
- • dynamic strict 모드와 total_fields.limit 설정으로 예방
- • Flattened, nested 타입과 dynamic templates 활용
사용자가 임의의 메타데이터를 추가할 수 있는 SaaS 플랫폼에서 무제한 필드 생성으로 인한 클러스터 장애를 예방할 때 필수적입니다.
Multi-field 타입을 언제 사용해야 하며, text와 keyword를 함께 정의하는 것의 트레이드오프는 무엇인가요?
Q. Elasticsearch 클러스터에서 Split Brain 문제가 발생하는 원인과 메커니즘을 설명하고, discovery.zen.minimum_master_nodes(7.x 이전)와 cluster.initial_master_nodes(7.x 이후)의 역할과 차이를 설명해주세요.
쿼럼 기반 선출과 네트워크 파티션 상황을 고려해보세요.
Split Brain은 네트워크 파티션으로 클러스터가 분리되어 각각 독립적인 마스터를 선출하고 서로 다른 상태로 동작하는 문제로, 데이터 불일치와 손실을 초래합니다. 이는 마스터 선출 시 과반수 합의 없이 진행될 때 발생하며, 각 파티션이 독립적으로 인덱스를 수정하면 나중에 병합이 불가능합니다. 7.x 이전 버전에서는 discovery.zen.minimum_master_nodes를 (master_eligible_nodes / 2) + 1로 설정하여 과반수 쿼럼을 강제했으며, 이 값 미만의 노드만 있는 파티션은 마스터를 선출할 수 없어 Split Brain을 예방했습니다. 7.x 이후에는 cluster.initial_master_nodes로 초기 부트스트랩 시 마스터 후보를 명시하고, 이후에는 자동으로 쿼럼 기반 선출이 적용되어 설정 관리가 단순해졌습니다. 프로덕션에서는 마스터 전용 노드를 3개 또는 5개의 홀수로 구성하고, 네트워크 안정성을 확보하며, 정기적인 클러스터 상태 모니터링을 통해 파티션 징후를 조기 감지해야 합니다.
- • Split Brain은 네트워크 파티션으로 여러 마스터가 선출되는 문제
- • 과반수 쿼럼 없이 선출 진행 시 발생하며 데이터 불일치 초래
- • 7.x 이전은 minimum_master_nodes로 수동 설정, 7.x 이후는 자동 쿼럼
- • 마스터 노드 홀수 구성과 네트워크 안정성 확보 필수
멀티 데이터센터 환경에서 네트워크 장애 시 클러스터 전체가 다운되거나 데이터 불일치가 발생하는 것을 예방할 때 필수적입니다.
마스터 노드와 데이터 노드의 역할을 분리하는 것의 장단점과, 어떤 규모에서 분리를 권장하시나요?
Q. Elasticsearch의 Query Context와 Filter Context의 차이를 설명하고, 실무에서 쿼리 성능을 최적화하기 위해 둘을 어떻게 조합해야 하는지 설명해주세요. 특히 캐싱 메커니즘과의 관계를 포함해주세요.
스코어링 계산 여부와 query cache의 동작 방식을 생각해보세요.
Query Context는 문서가 쿼리와 얼마나 잘 매칭되는지 relevance score를 계산하며, match, term 등의 쿼리가 bool의 must, should 절에서 실행될 때 적용됩니다. Filter Context는 문서의 포함 여부만 판단하고 스코어를 계산하지 않으며, bool의 filter, must_not 절이나 constant_score 내부에서 실행됩니다. Filter Context는 스코어 계산이 없어 더 빠르고, 결과가 자동으로 캐싱되어 반복 쿼리 시 성능이 크게 향상됩니다. 실무에서는 정확한 매칭 조건(날짜 범위, 상태값, 카테고리 등)은 filter로 처리하여 캐싱 효과를 얻고, 텍스트 검색이나 관련도가 중요한 부분만 query로 처리합니다. 예를 들어 상품 검색 시 재고 있음, 가격 범위, 카테고리는 filter로, 검색 키워드는 must로 구성하여 성능과 정확도를 동시에 확보합니다. Query cache는 샤드 레벨에서 동작하며 전체 쿼리 결과가 아닌 각 세그먼트별 비트셋을 캐싱하므로, 자주 사용되는 필터 조건일수록 효과가 큽니다.
- • Query Context는 스코어 계산, Filter Context는 boolean 판단만
- • Filter는 캐싱되어 반복 쿼리 시 성능 향상
- • 정확한 조건은 filter, 관련도 중요한 부분은 query 사용
- • Query cache는 세그먼트별 비트셋 캐싱
전자상거래에서 수백만 개의 상품을 필터링하고 검색할 때 응답 시간을 1초 이내로 유지하면서 정확한 결과를 제공할 때 적용됩니다.
대량의 term 값을 검색할 때 terms 쿼리와 terms lookup의 차이와 사용 시나리오는 무엇인가요?
Q. Elasticsearch 클러스터의 용량 계획(Capacity Planning)을 수립할 때 고려해야 할 주요 요소들을 설명하고, 노드 타입별 리소스 할당 전략과 스케일 아웃 vs 스케일 업의 의사결정 기준을 제시해주세요.
힙 메모리, 디스크 I/O, CPU 사용 패턴과 데이터 노드, 마스터 노드의 역할 차이를 고려해보세요.
용량 계획의 핵심 요소는 데이터 볼륨, 인덱싱 처리량, 쿼리 복잡도, 보관 기간, SLA 요구사항이며, 이를 기반으로 필요한 노드 수와 스펙을 산정합니다. 데이터 노드는 힙 메모리를 최대 31GB(compressed oops 한계)로 제한하고 전체 메모리의 50%를 힙에, 나머지를 OS 파일 캐시에 할당하며, 디스크는 SSD를 권장하고 전체 용량의 85%를 임계치로 설정합니다. 마스터 노드는 CPU와 메모리가 중요하며 디스크는 최소한으로, 코디네이팅 노드는 집계 쿼리가 많으면 메모리를 크게 할당합니다. 스케일 아웃은 처리량과 가용성이 중요할 때 적합하며 샤드를 분산하여 병렬 처리를 높이고, 스케일 업은 개별 쿼리 성능과 대용량 집계가 중요할 때 적합하지만 단일 장애점 위험이 있습니다. 일반적으로 Elasticsearch는 스케일 아웃에 최적화되어 있으므로, 중간 스펙의 노드를 여러 대 구성하는 것을 권장하며, 핫 데이터는 고성능 노드에, 웜/콜드 데이터는 저사양 노드에 배치하는 티어드 아키텍처를 적용합니다. 모니터링을 통해 CPU 80%, 힙 75%, 디스크 70% 도달 시 확장을 고려해야 합니다.
- • 힙 메모리 최대 31GB, 전체 메모리의 50%를 힙에 할당
- • 데이터 노드는 SSD와 OS 캐시, 마스터 노드는 CPU/메모리 중심
- • 스케일 아웃은 처리량, 스케일 업은 개별 쿼리 성능에 유리
- • 중간 스펙 다수 노드 구성과 티어드 아키텍처 권장
연간 데이터 증가율이 300%인 서비스에서 장애 없이 클러스터를 확장하고, 비용 효율적인 인프라를 유지할 때 적용됩니다.
클러스터가 Yellow 상태로 전환되었을 때 원인을 진단하고 해결하는 절차를 단계별로 설명해주세요.
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!