Searchable Snapshot

Searchable Snapshot

검색가능한 스냅샷 (7.10 ~)

콜드 티어(Cold Tier)는 데이터의 Replica(사본)를 저렴한 객체 저장소로 오프로드하여 저장 공간 비용을 최대 50%까지 줄일 수 있습니다. 프로즌 티어(Frozen Tier)는 한 걸음 더 나아가 데이터를 전부 저렴한 객체 저장소에 저장하면서도 모든 데이터를 검색 가능한 상태로 유지하고 자주 액세스하는 데이터를 빠르게 쿼리할 수 있도록 로컬 캐시를 제공합니다. 

S3와 같은 저렴한 객체 저장소에 있는 백업 데이터(스냅샷)를 바로 검색할 수 있게 되었습니다.

Cold Tier

콜드 티어(Cold Tier)는 웜 티어(Warm Tier)와 비교하면 저장 공간을 최대 50%까지 줄일 수 있습니다. Hot Tier와 Warm Tier에서는 Disk의 절반이 복제본(Replica) 샤드를 저장하는데 사용됩니다.  Replica는 빠른고 일관된 쿼리 성능과 시스템 장애 시 데이터 복원을 해주는 역할을 합니다. 

하지만 Cold Tier 데이터 읽기 전용이기 때문에 Replica를 S3에 스냅샷으로 저장됩니다. Cold Tier에서 로컬 노드 또는 디스크에 장애가 발생하는 경우 Searchable Snapshot을 사용하여 S3에 스냅샷으로 저장된 Replica(복제본) 인덱스를 통해 자동으로 복구합니다. 일반적인 스냅샷 복원에 걸리는 시간보다 훨씬 단축되어 처리 할 수 있습니다.

Frozen Tier

프로즌 티어(Frozen Tier)에서는 (감사 또는 보안 조사 등의 이유로) 의무적으로 보관해야 하는 데이터를 쌓아두기에 적절합니다. Frozen Tier는 한마디로 S3에 있는 데이터를 검색할 수 있습니다. 데이터에 엑세스 할때 리하이드레이션 할 필요가 없으며, 심지어 빠릅니다.

Searchable Snapshot은 Elastic Enterprise Search에도 유용합니다. 대 규모의 콘텐츠든, S3와 같은 객체 저장소에 안전하게 저장할 수 있는 회사의 과거 레코드를 검색하든, 큰 비용을 들이지 않고도 모든 아카이브된 콘텐츠와 과거의 콘텐츠를 검색 가능한 방식으로 저장할 수 있습니다.

Frozen Tier의 노드에는 특정 쿼리를 처리하기 위해 BLOB와 같은 저장소에서 다운로드한 인덱스 데이터의 일부만 캐시하는 LFU 캐시를 도입했습니다. 디스크의 캐시는 운영 체제의 페이지 캐시와 유사하게 작동하여 자주 요청되는 데이터에 대한 액세스 속도를 높입니다. Lucene 레벨의 읽기 요청은 이 로컬 캐시의 읽기 요청에 매핑됩니다. 캐시 누락이 발생하면 Lucene 파일의 더 큰 영역(16MB 청크)이 대용량 저장소에서 다운로드되어 검색에 사용할 수 있습니다. 다음에 Lucene이 파일의 동일한 영역에 액세스할 때 로컬 캐시에서 바로 제공됩니다.

노드 레벨 공유 캐시는 "가장 자주 사용하지 않는" 정책에 따라 매핑된 파일 영역을 제거합니다. @timestamp 필드처럼 범위를 나타내는 쿼리와 같이 Lucene 파일의 일부 영역이 계속해서 쿼리에 응답해야 하는 경우, 다른 데이터가 제거되는 동안 데이터가 캐시 상태로 유지됩니다.


이제 검색 할때 액세스 중인 파일의 영역을 다운로드해야 하지만, 사전계산된 인덱스 구조 세트를 기반으로 검색을 실행하기 때문에 검색할 데이터의 양도 줄어들고 속도도 빠릅니다. 이러한 샤드의 메모리 설치 공간을 더욱 줄이기 위해 Lucene 인덱스는 필요할 때, 즉 검색 요청이 있을 때만 열립니다. 



ILM + Searchable Snapshot

ILM(Index lifecycle management)을 구성하여 오래된 데이터를 자동으로 Frozen Tier로 이동하도록 설정할 수 있다.

아래 예제는 Hot phase에서 인덱스의 프라이머리 샤드 사이즈가 10gigabytes가 되면 Rollover되며, 생성된지 90일이 지난 데이터를 Frozen phase로 보내는 설정입니다.

Sample: carryshot

샘플로 사용한 데이터는 "캐리샷(Carryshot)"이라는 골프 스윙 녹화 어플로 사용자들이 해당 어플을 사용할 때마다 실시간으로 데이터가 엘라스틱서치에 인덱싱되는 실시간 데이터입니다. (정보제공 동의한 사람의 한에서 데이터 수집) 

데이터는 carry_event라는 Index에 저장됩니다.

테스트 환경을 위해 ILM에서 Hot phase: Rollover 설정을 10mb정도로 굉장히 낮게 하였습니다.

Frozen Phase

carry_event-000001 ~ carry_event-000022와 같은 형태는 rollover와 alias 기능을 사용하여 해당 인덱스가 적정 사이즈(또는 일수days)가 되었을 때 새로운 인덱스에 저장하게 설정을 해주었기 때문에 다음과 같은 형식으로 인덱스가 생성됩니다.

위에 사진을 보시면, Storage size가 0b인 인덱스는 index이름 앞에 partial-이라는 접두사가 붙습니다.

즉, 해당 인덱스들은 Frozen Phase에 스냅샷이 저장되어 현재 데이터 사이즈는 0으로 나타납니다. Frozen은 부분적으로 마운트되기 때문에 인덱스는 접두사 partial-가 붙습니다.

Frozen Phase로 옮겨진 인덱스 partial-carry_event-000001으로 쿼리를 날려보았습니다.

데이터 사이즈나 갯수가 많지 않지만 그래도 0.356ms 안에 데이터를 가져오는 것을 확인할 수 있었습니다. 

대시보드도 데이터를 잘 불러옴을 확인 할 수 있었습니다.

Cold Phase

Cold Phase 설정에서 Searchable snapshot을 비활성화하면 데이터 사이즈는 아무런 변화없이 Cold Phase로 이동됩니다.

Cold Phase 설정에서 Searchable snapshot을 활성화 하게 되면 위에 설명과 같이 Primary 샤드만 저장됨으로 현재 Primary 1개, Replica 1개가 설정되어 있는 상태에서는 50% 용량이 줄어든 것을 확인할 수 있습니다.

LinkedIn

ⓒ younabiya