기록하는 습관

Elasticsearch (2) - index 최적화 방법 본문

개발/Elasticsearch

Elasticsearch (2) - index 최적화 방법

로그뉴 2022. 3. 12. 16:56

** Elasticsearch를 공부하며 정리한 글입니다.

 

  • Lucene은 내부적으로 일정 크기의 buffer(In-memory buffer)를 가짐.
    • 만약, 내부 버퍼가 없다면 매번 색인하여 세그먼트를 만들어야 할 것이다.
  • Lucene에 색인 작업이 요청될 때
    • 전달된 데이터는 인메모리 버퍼에 순서대로 쌓임
    • 정책에 따라 내부 버퍼에 일정 크기 이상의 데이터가 쌓이거나, 일정 시간이 흐를 경우 버퍼에 쌓은 데이터를 한번에 처리.

 

인메모리 버퍼의 데이터를 처리하기 전 인메모리 버퍼의 데이터를 처리한 후

 

  • 한 번에 처리된 데이터는 segment 형태로 생성되고 즉시 Disk로 동기화 .
    • -> Disk 동기화까지 되어야 검색이 가능해짐!!!!
  • 문제점
    • Segment 생성될 때마다 물리적 동기화를 진행하면 성능이 급격히 나빠짐.
  • Lucene의 해결법
    • 무거운 fsync 방식 -> 가벼운 write 방식 이용
    • Cf) write? Fsync?
      • Write()
        • 일반적으로 파일을 저장할 때 사용하는 함수. 운영체제 내부 커널에 system cache가 있는데, write() 함수를 이용하면 system cache에만 기록됨. 그 이후에 특정한 주기에 따라 물리적인 디스크로 쓰기 작업 진행.
        • 장점: 물리적인 디스크로 쓰기 작업을 바로 하지 않아 빠른 처리 가능
        • 단점: 시스템이 비정상으로 종료될 경우 데이터 유실 가능
      • Fsync()
        • 저수준의 파일 입출력 함수

 1. Lucene

  • Flush
    • Segment가 생성된 후 검색이 가능해지도록 수행하는 작업
    • Write() 함수로 동기화가 수행됐기 때문에 커널 system cache에만 데이터가 생성됨
    • 물리적으로 디스크에 쓰여진 상태는 아님
  • Commit
    • 커널 system cache의 내용을 물리적인 디스크로 쓰는 작업
  • Merge
    • 다수의 segment를 하나로 통합하는 작업
    • 삭제 처리된 data가 실제 물리적으로 삭제 처리 됨!
    • 검색할 segment의 개수가 줄어들기 때문에 검색 성능이 좋아짐.

2. Elasticsearch

  • Refresh
    • Lucene Flush 작업.
    • 클러스터에 존재하는 모든 shard에서 기본적으로 1초마다 한 번씩 Refresh 작업이 수행됨.
      • -1로 두면 비활성화가 된다.
      •  
      • Tip: 대량의 데이터를 색인할 경우 Refresh 작업을 잠시 비활성화 하고, 색인 작업이 끝나면 다시 원래 설정으로 되돌려 놓는 것이 좋음.
    • 인덱스를 새로고침해서 새로 추가한 데이터의 검색이 가능(searchable)해지게 한다는 의미.
  • Flush
    • Lucene commit 작업을 수행하고 새로운 Translog를 시작하는 작업.
    • 메모리와 트린잭션 로그를 디스크로 저장하는 작업.
      • Translog?
        • 샤드의 장애 복구를 위해 제공되는 특수한 파일.
        • 엘라스틱서치 Shard는 자신에게 일어나는 모든 변경사항을 Translog에 먼저 기록한 후 내부에 존재하는 루씬을 호출한다.
        • 시간이 지날수록 Translog 파일 크기는 늘어나고 shard 1초마다 Refresh 작업을 수행해 실시간에 가까운 검색을 제공함.
        • 지속적인 Refresh 작업에 의해 검색은 가능하지만 아직 디스크에 물리적인 동기화가 되지 않은 상태이므로 주기적인 루씬commit을 수행해야 함.
        • 루씬 commit이 정상적으로 수행되면 디스크에 물리적으로 기록되고 Translog 파일에서 commit이 정상적으로 일어난 시점까지 내역은 삭제가 된다.
      • 기본적으로 5초에 한 번씩 Flush 작업이 수행됨.
    • Optimize API
      • Forced merge API라고도 하며, Lucene Merge를 강제로 수행하는 기능.
      • 파편화된 세그먼트를 줄이고 성능을 높이는 작업

 

  • Elasticsearch에서 document가 업데이트 되고 나서 인덱스에서 실제로 조회가 될 수 있는 상태가 되기 위해서는 일정 시간이 필요하다.
    • 이 경우, 업데이트 종료 되었다고 알리는 시간을 검색이 가능하게 변경된 시간까지 포함해서 알려주도록 하는 옵션이 있다.
    • bulkInsert, update, create 같은 명령어는 refresh:wait_for를 사용한다.
    • update by query 명령어에서는 waitForCompletion=true를 사용한다.
    • 해당 옵션없이 업데이트를 하면 5분걸렸던 양이 1시간이 되어도 되지 않음. 이럴 경우에는 하나하나 다 update 명령을 사용하지말고 bulk로 작업하는 것을 추천.
Comments