ES 구조와 역할

JB·2022년 1월 24일
0

ElasticSearch

목록 보기
2/3

ES 구조(아키텍처)

  • Node : ES 프로세스 1개를 의미. 단일 머신에서 여러 개의 노드도 실행이 가능하지만, HA 확보를 위해 운영환경에서는 추천하지 않음
  • Shard : 하나의 인덱스를 조각으로 나눴을 때의 각 인덱스 조각 하나. 위 그림의 경우 1개의 인덱스가 5개의 샤드로 분리되어 저장.
  • Index : 그림 속 0~4번의 샤드를 하나로 합칠 경우, 한개의 인덱스가 됨
  • Document : 인덱스에 삽입할 수 있는 데이터의 최소 단위. N개의 필드로 구성된 JSON 객체 형식이다.
  • Primary shard : 샤드 데이터 중 원본 데이터
  • Replica shard : 만일 node에 문제가 생겨 데이터가 유실될 경우를 대비하여, 각 샤드는 한 개 이상의 복제본인 레플리카 샤드를 보유.
  • 위 그림에서 노드 1이 손상된 경우에도, 레플리카 샤드를 활용해 정상적으로 서비스가 가능
  • 레플리카 샤드는 프라이머리 샤드와 항상 다른 노드에 배치되도록 구성.

Shard

  • ES에서 샤드를 이용하는 주된 이유는 데이터 스케일링이 용이하도록 구성하기 위해서이다
  • 샤드를 사용하지 않으면, 인덱스는 단일 노드 위에 존재해야한다.
  • 이렇게 되면 용량이 매우 큰 인덱스의 경우 단일 노드 위에 올리기가 힘들어져, 인덱스를 분리해야하는 문제점이 생긴다
  • 따라서 샤딩을 통해, 인덱스를 여러 조각으로 분할하여 저장하는 방법을 ES에서는 사용하고 있다.
  • 또한, 샤딩을 통해 인덱스를 여러 노드에 분할하여 두면, 병렬처리가 가능하여 쿼리 처리량(Query Throughput)에서 이점이 있어 성능 향상을 기대할 수 있다.

Cluster

  • Cluster : 연관된 데이터를 가진 노드들의 집합을 클러스터라고 칭함. 클러스터는 다른 클러스터와 완전히 독립적인 구조를 가져야한다.(cross-cluster 검색도 가능하지만, 자주 사용되지 않는다) 노드를 생성하면, 자동으로 기본 클러스터가 생성되거나, 지정된 클러스터에 조인하도록 되어있다.
  • 위 그림에서 볼 수 있다시피, 각 샤드는 개별 루신 인덱스로 구성되어 있다.
  • 따라서 각 샤드는 독립적인 개별 인덱스로 생각하면 대부분의 경우 무리가 없다.

Document 저장



위 2개의 이미지 중 윗쪽의 이미지는 삽입을 요청한 원본 document이다.
아래는 ES에서 저장한 방식이다.
위 이미지처럼 ES에서는 각종 메타데이터를 붙여서 저장한다.
_source 하위가 실제 저장을 요청한 데이터이다.
Document는 특정 index에 포함되어야하며, ES의 검색 기능 또한 특정 인덱스 내부에서의 검색만 가능하다.

REST API


REST API에 대한 이해가 없다면, 생활코딩님의 REST API 강의를 보고 오면, 이해가 쉬울 것이다.

Cluster 상태 확인

Cluster의 상태는 아래 API를 통해 확인할 수 있다.

GET /_cluster/health

_cluster는 ES의 어떤 API인지를 나타내며, 모든 ES의 API 이름은 _으로 시작한다.
health는 해당 API의 커맨드를 나타낸다.

해당 명령어를 실행하면

{
  "cluster_name" : "elasticsearch_jb",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 9,
  "active_shards" : 9,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 1,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 90.0
}

위와 비슷한 결과가 나올 것이다.
그 중 눈여겨볼 점은 status가 yellow라는 점이다.
기본적으로 ES에서는 2개 이상의 노드로 구성을 해야한다.
그래야 앞서 살펴본 레플리카 샤드를 다른 노드에 배치할 수 있기 때문이다.
따라서, 노드를 하나 더 추가하면 status는 green으로 변한다.
(단순히 같은 머신에서 프로세스 하나 더 띄워도 된다)

Node 확인하기

GET /_cat/nodes/?v

위 명령어를 통해서는 현재 클러스터에 있는 노드의 상태를 확인할 수 있다.
마지막의 ?v는 REST API의 Query String으로 사람이 읽기 편한 형태로 출력해준다.
출력 결과는 아래와 같다.

ip        heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
127.0.0.1           14          99  12    2.91                  cdfhilmrstw *      MacBook-Pro.local

현재 단일 노드 상태이기 때문에, 한 개의 노드가 표시된다.
master 노드가 무엇인지에 대해서는 추후에 알아보자.

인덱스 확인하기

GET /_cat/indices/?v
health status index                           uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .geoip_databases                jomTjVsrR2qdZ1JM7Nww1w   1   0         42            7     43.1mb         43.1mb
green  open   .apm-custom-link                pEN6TUV4R-GU2l8QAq8UOg   1   0          0            0       208b           208b
green  open   .kibana-event-log-7.15.2-000002 yhgI3G4PTlifL2PzggUhVQ   1   0          0            0       208b           208b
green  open   .kibana-event-log-7.15.2-000001 _QvSvFvsSBygWKNrsO5n6g   1   0          2            0     11.9kb         11.9kb
green  open   .apm-agent-configuration        E1u9Y5uRQCGsl7aS39mcFQ   1   0          0            0       208b           208b
green  open   .kibana_7.15.2_001              A7YWF0mHRdeNDif4NS94lA   1   0         48           10      4.7mb          4.7mb
green  open   .kibana_task_manager_7.15.2_001 g-XGa7c4SxKfeusWyWNzJA   1   0         14          648      4.3mb          4.3mb
yellow open   daum-news                       Xrh5yo2tSbKhQaAcXvfaWw   1   1      11479            0      4.6mb          4.6mb
green  open   .tasks                          mI64usOnQjucG0BbqxvGTQ   1   0          2            0     13.7kb         13.7kb

위의 인덱스 목록은, 내가 지난번 작업을 하며 만들었던 인덱스 리스트들이다.
ES를 처음 설치하고 키바나로 명령을 수행한다면, 몇가지 인덱스만 볼 수 있을 것이다.
.kibana_* 형태로 이루어진 인덱스는 키바나가 자체적으로 퍼시스턴스 데이터를 위해 생성한 인덱스들이다.
키바나에서 대시보드를 생성하고, 설정을 저장하기 위해 이용되는 인덱스이기 때문에, 대부분 직접 건드리지 않아도 된다.

샤드 확인하기

이쯤되면 샤드의 상태를 확인하는 방법은 알 것이다.

GET /_cat/shards?v
index                                                         shard prirep state      docs  store ip        node
.kibana-event-log-7.16.3-000001                               0     p      STARTED                127.0.0.1 MacPro.local
.geoip_databases                                              0     p      STARTED      42 40.4mb 127.0.0.1 MacPro.local
.kibana_7.16.3_001                                            0     p      STARTED      37  2.3mb 127.0.0.1 MacPro.local
.apm-agent-configuration                                      0     p      STARTED       0   226b 127.0.0.1 MacPro.local
my_index                                                      0     p      STARTED       1  4.4kb 127.0.0.1 MacPro.local
my_index                                                      0     r      UNASSIGNED                       
.ds-ilm-history-5-2022.01.24-000001                           0     p      STARTED                127.0.0.1 MacPro.local
.kibana_task_manager_7.16.3_001                               0     p      STARTED      17  2.4mb 127.0.0.1 MacPro.local
.ds-.logs-deprecation.elasticsearch-default-2022.01.24-000001 0     p      STARTED                127.0.0.1 MacPro.local
.apm-custom-link                                              0     p      STARTED       0   226b 127.0.0.1 MacPro.local

기본적으로 샤드의 수는 1개이며, 만들때에 지정하여 만드는 편이 나중의 성능 하락 방지를 위해 유리하다.
샤드의 수는 ES 7.0버전 이상이라면, shrink, split API를 통해 조정이 가능하다.(조정 시에는 성능 하락이 발생할 수 있다)
shrink, split API의 자세한 내용은 아래 문서를 참조하자.
Shrink API document
Split API document

profile
평범한 월급쟁이 개발자

0개의 댓글