Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스프링 핵심 원리 이해
- 7장 고급매핑
- Kotlin
- 기능개발 python
- 백준
- spring
- KotlinInAction
- Kotlin in action 6장
- Kotlin in action 10장
- kotlin in action 정리
- 스프링 컨테이너와 스프링 빈
- 객체 지향 설계와 스프링
- 13460 구슬탈출 2
- 코틀린
- 스프링 핵심 원리
- 자바 ORM 표준 JPA 프로그래밍 7장
- Kotlin In Action
- 스프링 핵심 원리 - 기본편
- 코틸린인액션
- Python
- 코틀린인액션
- 20055
- Kotlin in action 3장
- Kotlin in action 5장
- 고급매핑
- 컨베이어 벨트 위의 로봇 Python
- 백준 20055 컨베이어 벨트 위의 로봇
- 싱글톤 컨테이너
- 백준 13460 Python
- 20055 컨베이어 벨트 위의 로봇
Archives
- Today
- Total
기록하는 습관
Elasticsearch (2) - index 최적화 방법 본문
** Elasticsearch를 공부하며 정리한 글입니다.
- Lucene은 내부적으로 일정 크기의 buffer(In-memory buffer)를 가짐.
- 만약, 내부 버퍼가 없다면 매번 색인하여 세그먼트를 만들어야 할 것이다.
- Lucene에 색인 작업이 요청될 때
- 전달된 데이터는 인메모리 버퍼에 순서대로 쌓임
- 정책에 따라 내부 버퍼에 일정 크기 이상의 데이터가 쌓이거나, 일정 시간이 흐를 경우 버퍼에 쌓은 데이터를 한번에 처리함.
인메모리 버퍼의 데이터를 처리하기 전 | 인메모리 버퍼의 데이터를 처리한 후 |
|
|
- 한 번에 처리된 데이터는 segment 형태로 생성되고 즉시 Disk로 동기화 됨.
- -> Disk 동기화까지 되어야 검색이 가능해짐!!!!
- 문제점
- Segment 생성될 때마다 물리적 동기화를 진행하면 성능이 급격히 나빠짐.
- Lucene의 해결법
- 무거운 fsync 방식 -> 가벼운 write 방식 이용
- Cf) write? Fsync?
- Write()
- 일반적으로 파일을 저장할 때 사용하는 함수. 운영체제 내부 커널에 system cache가 있는데, write() 함수를 이용하면 system cache에만 기록됨. 그 이후에 특정한 주기에 따라 물리적인 디스크로 쓰기 작업 진행.
- 장점: 물리적인 디스크로 쓰기 작업을 바로 하지 않아 빠른 처리 가능
- 단점: 시스템이 비정상으로 종료될 경우 데이터 유실 가능
- Fsync()
- 저수준의 파일 입출력 함수
- Write()
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 작업이 수행됨.
- Translog란?
- Optimize API
- Forced merge API라고도 하며, Lucene Merge를 강제로 수행하는 기능.
- 파편화된 세그먼트를 줄이고 성능을 높이는 작업
- Elasticsearch에서 document가 업데이트 되고 나서 인덱스에서 실제로 조회가 될 수 있는 상태가 되기 위해서는 일정 시간이 필요하다.
- 이 경우, 업데이트 종료 되었다고 알리는 시간을 검색이 가능하게 변경된 시간까지 포함해서 알려주도록 하는 옵션이 있다.
- bulkInsert, update, create 같은 명령어는 refresh:wait_for를 사용한다.
- update by query 명령어에서는 waitForCompletion=true를 사용한다.
- 해당 옵션없이 업데이트를 하면 5분걸렸던 양이 1시간이 되어도 되지 않음. 이럴 경우에는 하나하나 다 update 명령을 사용하지말고 bulk로 작업하는 것을 추천.
'개발 > Elasticsearch' 카테고리의 다른 글
Elasticsearch (6) - 노드의 종류 (0) | 2022.07.06 |
---|---|
Elasticsearch (5) - 클러스터,Shard,Index 개념 (0) | 2022.07.06 |
Elasticsearch (4) - 동의어 사전 (0) | 2022.03.12 |
Elasticsearch (3) - reindex (0) | 2022.03.12 |
Elasticsearch (1) - alias (0) | 2022.03.12 |
Comments