본문 바로가기

Backend Study/ELK Stack

[ElasticSearch] 기본 개념

1. 엘라스틱 서치의 특징

1.1. 분산/확장성/병렬처리

엘라스틱 서치 구성 시 보통 3개 이상의 노드(엘라스틱서치 서버)를 클러스터로 구성하며, 데이터를 샤드로 저장시 클러스터 내 다른 호스트에 복사본을 저장해두기 때문에 하나의 노드가 죽거나 샤드가 깨져도 복제되어 있는 다른 샤드를 활용한다.

 

데이터 분산과 병렬처리가 되므로 실시간으로 검색 및 분석할 수 있고, 노드르 수평적으로 늘릴 수 있다. 또한 노드를 클러스터에 추가할 수 있다.

 

2. 클러스터

하나 이상의 노드(서버)가 모인 것이며, 전체 데이터를 저장하고 모든 노드를 포괄하는 통합 색인화 및 검색 기능을 제공한다.

고유의 이름으로 식별되고, 기본 이름은 "elasticsearch"이다. 어떤 노드가 어느 클러스터에 포함되기 위해서는 이름에 의해 클러스터의 구성원이 되도록 설정된다. 

 

3. 노드

엘라스틱 서치는 분산 시스템이며 노드는 이 분산 시스템에서 작동하는 하나의 엘라스틱서치 엔진을 의미한다.  (내 컴퓨터에 엘라스틱 서치를 하나 설치했다면 하나의 노드를 설치한것과 동일하다.)

노드는 데이터를 저장하고 클러스터의 색인화 및 검색 기능에 참여한다. 이또한 이름으로 식별되는데, 기본 이름은 시작시 노드에 지정되는 임의 UUID이다. 

노드는 클러스터의 이름을 통해 어떤 클러스터의 일부로 구성될 수 있다.  기본적으로 각 노드는 'elasticsearch'라는 이름의 클러스터에 포함되도록 설정한다. 만약 네트워크에서 다수의 노드를 시작할 경우, 이 노드가 모두 자동으로 'elasticsearch'라는 단일 클러스터를 형성하고 이 클러스터의 일부가 된다.  

 

Elasticsearch를 별 다른 설정없이 실행하면 default 설정값으로 실행하게 되므로, 설정값 변경 없이 두개의 노드를 실행할 경우 충돌이 발생한다. 하나의 컴퓨터에서 여러개의 노드를 실행하고자하는 경우 적절한 설정값의 지정이 필요하다. 

- cluster.name: 클러스터의 이름

- node.name: 노드의 이름, 서로 다른 이름으로 설정한다.

- path.data: 해당 노드의 데이터가 적재되는 경로

- path.logs: 해당 노드의 로그가 적재되는 경로

- http.port: 충돌되지 않게 다른 포

 

4. 인덱스

색인은 다소 비슷한 특성을 가진 문서의 모음이며 단일 클러스터에서 원하는 개수의 색인을 정의할 수 있다.

예를 들어 고객 데이터에 대한 색인, 제품 카탈로그에 대한 색인, 주문 데이터에 대한 색인 등이 있다. 

인덱스 내부에는 JSON 형태로 된 다수의 도큐먼트가 존재한다.

 

5. 도큐먼트

데이터가 저장되는 기본 단위로 JSON 형태이다. 여러 필드와 값을 가진다.

 

RDS와 비교

엘라스틱 서치

- index: member

- document :

{"name" : "corn" ,

"age" : 30,

"gender" : "male"}

 

RDB

- 테이블: member (name,age,gender 컬럼을 가짐)

- 레코드 데이터: "corn", 30, "male"

 

RDB Elasticsearch 
데이터베이스 인덱스
테이블 타입
Row 도큐먼트
컬럼 필드
스키마 매핑

 

6. Data CRUD

Data CRUD Elasticsearch Restful
SELECT GET
INSERT PUT
UPDATE POST
DELETE DELETE

 

user 인덱스 생성

$ curl -XPUT http://localhost:9200/user?pretty

 

Document 만들기

$ curl -XPOST http://localhost:9200/user/class/1/ -d '{"title" : "ElasticSearch", "member" : "kimkyuri"}'

 

참고)

https://www.elastic.co/guide/kr/elasticsearch/reference/current/gs-basic-concepts.html