반응형

 

엘라스틱서치를 구성하는 개념

데이터의 구조

기본 용어

1. 인덱스

인덱스는 데이터 저장 공간이다. 하나의 인덱스는 하나의 검색 주제의 집합이라고 보면 된다. 기본적으로 하나의 물리적인 노드에 여러 개의 인덱스를 생성 가능한다. 분산 환경을 구축한다면 한 개의 인덱스를 여러 개의 노드에 분산 저장 관리할 수 있다. 이는 레플리카(복제), 샤드(분할)를 구성할 수 있다는 의미다. 그리고 인덱스 생성시 엘라스틱서치는 기본적으로 5개의 primary 샤드와 1개의 레플리카 샤드 세트를 생성한다. 검색시에는 단일 검색으로 하나의 인덱스부터 여러 개의 인덱스까지 동시에 검색할 수 있다.

 

2. 샤드

인덱싱을 하게 되면 인덱스는 내부적으로 물리적인 공간에 여러 개의 파티션으로 나뉘어 구성되는데 이 파티션들을 샤드라고 부른다.

 

3. 문서

엘라스틱서치 인덱스에 들어가는 데이터 저장 최소 단위이다. 기본적으로 JSON 포맷으로 데이터가 저장된다.

 

4. 필드

문서는 다양한 필드를 가질수 있다. 필드는 문서를 설명할 수 있는 속성이다. 필드는 데이터 타입을 하나부터 여러 개까지 가질 수 있는데 이는 하나의 필드에 대해 여러개의 분석기를 사용해 여러개의 역색인을 생성해 해당 필드로 다양한 검색을 지원할 수 있게 만든다.

 

5. 매핑

문서에 필드와 필드 속성을 정의하여 색인 방법을 정의하는 것이다. 4에서 설명했듯이 필드별로 다양한 색인 생성 형태를 지정할 수 있다.


엘라스틱서치 노드의 종류

엘라스틱서치 클러스터는 물리적인 노드 인스턴스들의 모임이다. 클러스터는 모든 노드에 대해 색인/검색 작업을 괁방하는 논리적인 개념이다. 여러 개의 노드의 서버로 분산 처리가 가능하기 때문에 대용량 데이터를 처리할 수 있다.

 

분산 처리를 하기 위해서 엘라스틱서치는 다양한 형태의 노드들이 존재한다.

1. 마스터 노드

마스터 노드는 인덱스를 생성, 삭제하는 등 클러스터 전체에 대한 관리를 관장하는 역할을 한다. 다수의 노드를 마스터 서버로 설정해 시작시킬 수 있지만 결과적으로는 노드들 중 하나의 서버만 마스터 서버가 된다.

마스터 서버로 설정하기 위해서는 엘라스틱서치가 설치된 디렉토리의 conf/elasticsearch.yml 파일을 열어 다음과 같이 설정한다.

node.master: true
node.data: false
node.ingest: false
search.remote.connect: false

2. 데이터 노드

문서가 실제로 저장되는 노드다. 데이터가 실제로 분산 저장되는 물리적 공간인 샤드가 배치되는 노드이다. 색인 작업이 수행되는 노드이며, cpu, memory, 스토리지 같은 컴퓨팅 리소스가 많이 소모되기 때문에 리소스 모니터링이 필요하다.

리소스를 많이 사용하기 때문에 발생할 수 있는 서버 부하나 장애를 고려해 마스터 노드는 데이터 노드로 사용하지 않는것을 권장한다.

리소스 모니터링을 위해서는 metric 정보를 가져올 수 있는 exporter와 prometheus, 시각화를 위한 grafana의 조합으로 많이 사용하는 것 같다.

설정파일은 다음과 같이 설정한다.

node.master: false
node.data: true
node.ingest: false
search.remote.connect: false

3. 코디네이팅 노드

다른 역할은 하지 않고 검색과 벌크 색인 요청이 들어오는 것을 단순히 라운드로빈 방식으로 분산시켜주는 노드이다. 

node.master: false
node.data: false
node.ingest: false
search.remote.connect: false

4. 인제스트 노드

색인에 앞서 데이터를 전처리하기 위한 노드이다. 색인별로 어떤 이름의 필드에 대해문자열을 배열의 형태로 만든다던가 모두 소문자로 변환해준다던가 할 때 사용할 수 있다.

node.master: false
node.data: false
node.ingest: true
search.remote.connect: false

클러스터, 노드, 샤드

클러스터 구성 예시

클러스터는 노드의 집합이며, 노드는 물리적인 서버 한대라고 보면 된다. 서버 자원이 넉넉할 경우에는 2개 이상의 노드를 한 물리 서버에 동시에 운영할수도 있다. 각 인덱스는 하나 또는 여러개의 노드에 분산되어 존재한다.

 

각 인덱스안에서 물리적으로 여러 개의 파티션이 존재할 수 있는데 이것이 샤드이다.

샤드는 각각 프라이머리 샤드레플리카 샤드가 될 수 있다.

 

프라이머리 샤드는 위 그림에서 실선으로 표시된 샤드이며, 검색을 위해 사용하는 샤드이다.

그림에서 점선으로 된 샤드는 레플리카 샤드로써 평소에는 사용하지 않고 프라이머리의 복제본으로만 가지고 있다가 프라이머리 샤드를 가진 노드에 장애가 발생할 경우 이 레플리카 샤드가 프라이머리 샤드로 승격되어 검색시 사용하게 된다.

 

샤드와 레플리카 설정은 인덱스 설정시 settings 값으로 설정할 수 있다.

{
    "settings": {
    	"index" : {
       	    "number_of_shards" : 3,
            "number_of_replicas" : 1
        }
    }
}

 

 

클러스터를 실제로 운영해보니 현재 노드의 개수를 고려하여 인덱스별 샤드와 레플리카의 개수를 조절하는 것이 좋아보였다.

특히 문서당 필드 수가 많고 분석과정이 많은 인덱스의 경우 2개 이상의 프라이머리 + 레플리카 샤드를 가지고 bulk indexing을 하는 경우 OOM이 발생하는 경우가 있었다.

 

무거운 인덱스의 레플리카, 샤드 설정

노드 수 >= 샤드 수(number_of_shards) * (1(프라이머리 샤드) + 레플리카 샤드 수(number_of_replicas))

 

다음과 같이 구성하는 경우 노드당 하나 이하의 샤드를 가지기 때문에 안전하게 운영할 수 있는 설정이었다.


참고자료

반응형