Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Elasticsearch 의 페이징 처리 방식 #168

Open
occidere opened this issue Mar 29, 2022 · 0 comments
Open

Elasticsearch 의 페이징 처리 방식 #168

occidere opened this issue Mar 29, 2022 · 0 comments
Assignees

Comments

@occidere
Copy link
Owner

occidere commented Mar 29, 2022

Elasticsearch 의 페이징 처리 방식 3가지

1. Random access with size & from params

  • 매번 검색할 때 마다 각 샤드에서 정렬한 다음 코디네이터 노드의 메모리에 전부 올린다음 요청 대상 필터링해 반환
  • 최대 윈도우 사이즈는 기본 10,000개
  • 랜덤 액세스가 필요한 경우가 아니면 cpu & memory 사용이 매우 많아 비효율적이여서 권장하지 않음
  • from+size 는 매번 메모리에 검색할 때 마다 다 올리는 것이지, 첫 검색 결과를 계속 스냅샷처럼 가지고 사용하진 않기 때문에 중간에 인덱스에 변경이 발생하면 검색 결과에 영향 줄 수 있음
    • ex) _id: 1~5 인 문서를 순서대로 검색할 때, 2번까지 검색했는데 3번이 갑자기 삭제되면, 3번 문서는 조회 안됨

2. Scroll API

  • deep scrolling 에 적합하지만 context 유지 비용이 큼
  • real time user request 엔 적합하지 않고 전체 dump / reindex 등에 사용
  • stateful 방식
  • 검색이 시작된 시점에서 context 를 유지하는 stateful 방식이기 때문에, 중간에 데이터가 변경되어도 최초 검색 시점의 스냅샷 결과를 가져올 수 있음
    • ex) _id: 1~5 인 문서를 id 순서대로 검색할 때, 2번까지 검색했는데 3번이 갑자기 삭제되어도 scroll api 는 스냅샷을 보고있기 때문에 3번 문서도 조회됨
  • random access 불가

3. Search After

  • live cursor 를 사용해서 정렬된 결과 중 특정 문서 다음부터 가져오는 식
  • stateless 방식
  • 따로 context 를 저장하지 않는 stateless 방식이기 때문에 페이징 조회 도중에 인덱스에 update/delete/refresh 등 write 작업이 발생하면 정렬 결과에 영향을 줄 수 있음
    • ex) _id: 1~5 인 문서를 순서대로 검색할 때, 2번까지 검색했는데 3번이 갑자기 삭제되면 search_after 는 stateless 기 때문에 3번 문서는 조회 안됨
  • 검색 시점의 스냅샷과 비슷한 개념인 Point In Time (pit) 를 사용해서 이 영향을 최소화 할 수 있으나 7.12+ 이상 버전에서만 사용 가능
  • random access 불가

References

@occidere occidere self-assigned this Mar 29, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant