른록노트
[Elasticserach] ElasticSearch란? 본문
참고사이트
https://www.elastic.co/guide/en/elasticsearch/reference/current/documents-indices.html
https://www.elastic.co/kr/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster
https://www.elastic.co/guide/en/elasticsearch/reference/current/size-your-shards.html
https://codecurated.com/blog/basics-of-elasticsearch-for-developer/
https://codecurated.com/blog/elasticsearch-text-vs-keyword/
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html
1. Elasticsearch란?
- 엘라스틱서치는 분산 문서 저장소이며 JSON 형태로 직렬화된 복잡한 데이터 구조를 저장합니다.
- 엘라스틱서치는 Apache Lucene 기반으로한 오픈 소스 검색 및 분석 엔진입니다.
- 간단한 REST API지원, 분산 서버, 속도 및 확장성이 좋습니다.
- 핵심 구성 요소는 데이터 수집, 분석, 통계, 빠른 검색 등이 있습니다.
1) Elasticsearch에서 document가 index에 저장되는 과정
- index는 document가 저장되는곳이며 Elasticsearch는 빠른 검색을 지원하기위해 inverted index(역 인덱스)라는 구조를 사용합니다. 그리고 document를 저장할 때 여러 상황에 맞게(Field type or Analyzer) 지정한 document를 여러 방법으로 index에 저장합니다.
Inverted Index : 역 인덱스는 elasticsearch에 대한 쿼리를 엄청나게 빠르게 만드는 주요 요소입니다. document를 저장할 때 저장할 문서의 데이터를 Analyzer로 먼저 분석하고 index에 단어와 위치를 역으로 매핑하는 데이터 구조입니다. 그래서 검색할 때 index에 매핑된 키를 검색해서 빠르게 document 번호를 가져올 수 있습니다.
Field Type : Elasticsearch도 다른 DB와 마찬가지로 Field Type이 있습니다. Elasticsearch에서는 Text와 Keyword Type을 유의해야합니다. 기본적으로 Type을 지정하지 않으면 Elasticsearch가 자동으로 Mapping 하는데 이후 변경이 쉽지 않으므로 document를 삽입하기전에 먼저 mapping을하여 index를 생성하는게 좋습니다.
- Text type vs Keyword type : 이는 Inverted Index에 저장되는 방법을 결정하는데 매우 중요합니다. Text 타입은 Analyzed되고 keyword 타입은 그 문자 그대로를 저장합니다.
Analyzer : Analyzer는 Inverted Index에 document가 들어가기전에 document를 먼저 분석해서 적절하게 저장하도록 변환하는 프로세스를 말하며 이 프로세스는 Character Filters, Tokenizer, Token Filter가 있습니다.
- Character Filters : Analyzer에서 제일 처음으로 발생하는 프로세스로써 문자를 제거하거나 바꾸는데 사용할 수 있습니다. 예를들면 html 태그 필터링을 말합니다.
<html>
등과 같은 내용은 문장에서 제거 할 수 있습니다. - Tokenizer : 문장을 단어로 분리하는 과정입니다. 다양한 유형의 토크나이저가 있습니다.
- Token Filter : Tokenizer에서 나온 단어를 소문자로 만드는 등 Filter를 적용하여 저장되도록하는 프로세스 입니다.
- Character Filters : Analyzer에서 제일 처음으로 발생하는 프로세스로써 문자를 제거하거나 바꾸는데 사용할 수 있습니다. 예를들면 html 태그 필터링을 말합니다.
In Memery Buffer : 단일 shard는 여러 세그먼트와 메모리 버퍼로 구성될 수 있습니다. document가 삽입되면 바로 index에 저장되지 않고 refresh가 되면 메모리 버퍼에 있는 document가 세그먼트가 되어 저장되고, 세그먼트로 저장 된 후 저장된 document를 검색할 수 있습니다.
2) 검색
- Inverted Index에 저장된 document를 검색하는 방법은 여러가지 있습니다.
- Query DSL
- x-pack 플러그인을 사용하여 일반 SQL로도 검색할 수 있습니다.
Match와 Term 검색의 차이 : Match는 검색 쿼리에서 먼저 Analyzer를 수행하여 검색하는 방식을 말하고 Term 검색은 Keyword 타입에 저장된 데이터를 검색할 때 처럼 검색할 단어를 Analyzed를 하지않아서 Keyword 타입을 검색하거나 document 그대로의 값을 검색할때 사용합니다.
Aggregation : 집계할 수 있는 통계 쿼리입니다. Elasticsearch 집계의 장점은 중첩 aggregation을 만들 수 있다는 것입니다.
2. Elasticsearch Node에 얼마나 많은 샤드가 필요할까?
1) shard(샤드)란 무엇일까?
document들은 index에 저장되며 각 index는 한개 혹은 여러개의 shard로 구성됩니다. 각 샤드는 Lucean index이며 이는 Elasticsearch 클러스터 내에 인덱싱을 하거나 데이터 일부를 조회하기 위한 독립적인 검색 엔진이라고 생각 할 수 있습니다.
document를 입력할때 index에 입력하지만 index는 shard로 구성되어있고 데이터를 샤드에 입력할 때, Elasticsearch는 주기적으로 디스크에 Lucean 세그먼트 형태로 저장하며 이 작업 이후에 해당 document 검색이 가능해집니다. (위에서 말한 refresh 프로세스) 그리고 세그먼트의 개수가 많아지면 주기적으로 더 큰 세그먼트로 병합이되고 이 과정을 merging 작업이라고 부르며 디스크 I/O에 큰 영향을 받습니다.
즉 shard는 Elasticsearch가 데이터를 클러스터 내에 분산 저장하기 위한 단위이고 장애 발생 시 Elasticsearch가 데이터를 재배치할 때의 수행 속도는 네트워크와 디스크 성능뿐만 아니라 샤드의 크기와 개수에 따라 결정됩니다. 그리고 장애 복구를 위해 분산 서버마다 각 index의 primary shard를 복제한 Replica라는 것이 있습니다.
2) replica란?
각 index에는 shard가 존재하며 각 Node마다 primary shard가 있고 이를 복제한 replica가 있습니다. primary shard를 갖고 있지않은 다른 서버는 데이터를 동기화하고 장애 발생시 대처하기 위해 primary shard를 복제한 replica를 갖고 있습니다.
만약 어떤 Node에서 장애가 발생한다면 그 Node에서 사용하고있는 index의 shard들은 현재 연결된 Node의 replica가 primary Shard로 승격하여 오류 없이 바로 사용할 수 있게 됩니다.
3) 적절한 Shard의 개수는?
여기서 중요한건 성능에 있어서 shard의 개수보다 크기가 더 중요합니다. 만약 shard의 사이즈가 65Gb 넘게되면 failover할때 네트워크 상황 등 io가 일어나게되고 실패할 수 있는 확률이 올라가게됩니다. 그래서 10~65Gb를 유지하게 하고
Node당 Heap에 비례하여 1Gb당 20개의 Shard를 할당해야하고 그 이상을 넘으면 Node를 추가하는게 좋습니다.
그럼 만약 하루에 100Gb의 로그가 발생하는 index를 만든다고 하면 shard 사이즈를 어떻게 해야할까요?
우선 인덱스를 하루 단위로 만들고 shard 사이즈는 3개로 하는게 좋을것 같습니다. 그러면 shard의 크기는
33Gb로 나뉠거고 현재 Node의 Heap을 보고 만약 현재 노드의 Heap이 10Gb면 400개 이하의 샤드를 유지해야하게 해야합니다.
3. Elasticsearch의 Node 종류
1) 클러스터란?
- Elasticsearch는 분산 서버 클러스터링을 지원하며 Elasticsearch가 가동되고있는 서버들의 셋을 클러스터라고 합니다.
2) Node란?
Node는 클러스터안에 있는 하나의 서버들을 이야기합니다. Node는 여러가지 역할이 있고 config에서 설정할 수 있습니다.
여러가지 노드가 있지만 크게 3가지만 설명하자면
- Master Node : 클러스터를 제어하고 기준이 되는 Node 입니다. 중요한 사항으로 Master Node는 하나만 선출되야하고(split brain을 알면 좋습니다) 만약 Master Node가 Down되면 Master-eligible node 로 설정된 Node들 중에서 Master Node가 선출됩니다.
- data Node : 데이터를 저장하고 조회할 수 있는 노드입니다.
- ingest Node : 수집의 역할이 있는 노드입니다. 인덱싱 전에 analyzer 작업과 같이 document를 변환하고 보강하는 일을 합니다.
4. 마치며
최대한 필요한 개념만 적으려고 노력하였고 참고사이트를 읽어보면 많은 도움이 될것이라고 생각합니다.