1. Elastic search
Elastic search의 개념과 시스템 구조에 대해 알아보자.
배경
꿀모 (www.ggulmo.com) 에 elastic search 를 도입하여 검색 기능을 구현하였다.
Elastic search의 기능을 제대로 이해하고 사용하기 위해 elastic search의 시스템 구조와 개념, 검색 쿼리 등에 대해 알아보려고 한다.
루씬
Apache Lucene의 한계를 보완하기 위해 새로 검색 엔진을 만든 것이 elastic search이다. Elastic search 엔지니어의 다수가 루씬 커미터들이어서 루씬을 매우 깊게 이해하고 있다. 루씬이 자바로 만들어져있기 때문에 elastic search도 자바로 만들어져 있다.
실시간 분석
Elastic search는 클러스터가 실행되는 동안에는 계속해서 데이터가 입력되고 그와 동시에 실시간에 가까운 속도로 indexing된 데이터의 검색, 집계가 가능하다.
Inverted file index
모든 데이터를 역파일 색인 구조로 저장하여 가공된 텍스트를 검색한다. 검색을 매우 빠르게 할 수 있어서 검색 엔진에서 많이 사용되는 데이터 구조이다.
간단히 설명하면 키워드를 통해 문서를 찾아내는 방식이다.
책 뒷편의 색인된 키워드를 이용해 역으로 본문을 찾는 방식을 말한다. 그래서 전문(full text) 검색이라고도 한다.
자세한 구현 방법은 아래 링크를 참고하길 바란다.
https://the-dev.tistory.com/30
https://pro-jy.tistory.com/28
RESTFul API
Elastic search는 Rest API를 기본으로 지원하며 모든 데이터 조회, 입력, 삭제를 http 프로토콜을 통해 Rest API로 처리한다.
시스템 구조
노드와 클러스터
Elastic search의 노드들은 클라이언트와의 통신을 위한 http포트(9200~9299), 노드 간의 데이터 교환을 위한 tcp 포트 (9300~9399) 2개의 네트워크 통신을 열어두고 있다. 일반적으로 1개의 서버마다 1개의 노드를 실행하는 것을 권장하고 있다. 여러개의 노드는 하나의 클러스터로 묶일 수 있다. 물리 서버의 위치나 네트워크망에 상관없이 cluster.name의 차이로 클러스터를 지정한다.
같은 클러스트의 노드끼리는 데이터 교환이 가능하지만 다른 클러스트의 노드끼리는 교환이 불가능하다. 아래 그림에서는 2개의 물리서버에서 노드를 구성했지만 같은 클러스터이므로 서로간의 tcp통신이 가능하다.
Discovery
노드 처음 실행시에 discovery.seed_hosts: [] 에 설정된 네트워크 상의 다른 노드들을 찾아 하나의 클러스터로 바인딩 하는 과정을 discovery라고 한다.
discovery.seed_hosts에 존재하는 주소를 돌면서 노드의 존재와 cluster.name을 확인하고 cluster.name이 같으면 같은 클러스터로 바인딩한다.
인덱스와 샤드, 복제본 — Index & Shards, Replica
Elastic search에서는 단일 데이터를 document라고 하고 document들의 집합을 인덱스라고 한다.
샤드는 인덱스를 여러개로 나누고 각 노드에 분산되어 저장된다.
복제본(Replica)
데이터의 가용성과 무결성을 위해 인덱스의 복제본을 생성한다. 처음 생성된 샤드인 프라이머리 샤드와 replica 들이 전체 노드에 골고루 분배되어 저장된다.
노드가 1개인 경우 replica가 생성되지 않기 때문에 데이터의 가용성과 무결성을 위해 최소 3개의 노드로 구성할 것을 권장한다.
샤드와 복제본을 여러 노드에 분배해놓았기 때문에 특정 노드가 망가지더라도 다른 노드에서 복구할 수 있다.
노드
각 노드들이 하는 역할을 지정할 수 있다.
Master node
Cluster를 제어하는 역할을 한다.
인덱스 생성, 삭제, 샤드의 할당 등을 정한다.
3개 이상의 설치가 권장된다.
Data node
Data가 저장되고 CRUD, aggregation이 수행되는 노드이다. 가장 중요하고 많은 연산이 일어나기 때문에 최소 메모리 16GB, CPU 2core, 3개 이상의 Data node를 설치하는 것이 권장된다.
Ingest node
인덱싱하기 전 document를 전처리하는 노드이다. 전처리하는 데이터가 많다면 ingest node를 추가하는 것이 성능에 도움이 된다.
Coordination node
Client node라고도 불린다. Client로부터의 요청을 담당하는 노드이다.
각 Data node에 적절하게 요청 분산하고 취합하는 역할을 한다. (로드 밸런서 역할)
Split Brain
마스터 후보 노드를 짝수개로 운영할 경우 생길 수 있는 문제이다.
마스터 노드가 유실 되었을 경우 마스터 후보 노드가 짝수개라면 클러스터 전체가 작동을 멈출 수 있다.
클러스터간의 통신이 끊겼을 경우 각각의 클러스터는 각자 동작한다. 그렇게 되면 클러스터 안의 데이터가 서로 다르게 된다. 나중에 통신이 연결되어 데이터 동기화를 시킬 때 데이터가 다르므로 정합성에 문제가 생기고 무결성이 유지될 수 없다. 이런 문제를 Split Brain이라고 한다.
이 문제를 방지하기 위해 최소 마스터 노드 후보의 수를 정하고 그보다 적은 수의 마스터 노드 후보를 가지고 있는 클러스터는 동작을 멈추도록 해야 한다. 그러면 문제가 생겼을 경우 마스터 후보 노드의 수가 충분한 클러스터만 동작하고 문제 해결 후 데이터를 업데이트 해주면 된다.
마스터 후보 노드의 개수는 항상 홀수로 하고 최소 마스터 후보 노드는 (전체 마스터 후보 노드)/2+1 로 해야 한다.
Reference
- https://esbook.kimjmin.net/
- https://bakyeono.net/post/2016-08-20-elasticsearch-querydsl-basic.html#terms-%ED%95%84%ED%84%B0
- https://www.elastic.co/guide/en/elasticsearch/reference/7.14/query-dsl.html
- https://coding-start.tistory.com
- https://kay0426.tistory.com/50
- https://blog.naver.com/PostView.naver?blogId=theswice&logNo=222198334587&parentCategoryNo=&categoryNo=66&viewDate=&isShowPopularPosts=false&from=postView