본문 바로가기
Elastic Stack

Elasticsearch Hot Warm Architecture

Hot/Warm Architecture

• 데이터 별로 저장 할 데이터 노드를 구성 하여 Cluster를 구성 할 수 있다.  Elasticsearch에서 원할한 검색 속도를 보장 받기 위해서는 SSD 디스크를 이용 하여 Node를 구성 하지만, 저장 되는 데이터가 많아 지면 고민에 빠질 수 밖에 없다. 그럴 경우 자주 사용 되는 Index에 대하여 성능이 좋은 Node에 저장 하여 사용 하고, 사용을 많이 하고 간혈적으로 사용 하는 Index 에 대하여  비교적 성능이 낮은 Node에 저장 하여 구성 할 수 있다.

• 이러한 구성을 Hot/Warm Architecture 라고 불리며,  Node를 제어 하려는 시나리오에 유용 하여, 데이터에 대한 세밀한 제어가 가능하다.

• 전용 데이터 노드는 다음과 같이 사용할 수 있습니다.

- hot 노드 : 새로운 문서가 작성된 색인을 지원하기 위해

- warm 노드 : 빈번하게 질의 될 가능성이없는 읽기 전용 색인을 처리하기 위해

Hot Node

• 색인 생성에 Hot Node 를 사용

-  인덱싱 작업은 CPU 및 IO 집중적 작업이기 때문에 서버의 자원이 높아야 한다.

- warm 노드에 비하여 보다 빠른 스토리지를 사용 해야 한다.

Warm Node

• 오래된 읽기 전용 색인에 warm 노드 사용

- 큰 부착 디스크를 사용하는 경향이 있다.

- 더 많은 양의 데이터를 만나려면 추가 노드가 필요할 수 있다.

Hot, Warm 과 같이 index에 대하여 특정 Data 노드로 구분 하여 구성 하기 위해서는 Shard Filtering을 통하여 구성 할 수 있다.


Shard Allocation Filtering

Shard Filtering 은 특정 Shard가 특정 Node로 지정 될 수 있도록 Routing 해준다.

즉, 특정 Index에 대하여 특정한 Node로 할당 하여 관리 할 수 있도록 해준다,

이러한 설정은 dynamic setting 을 통하여 Node에 재시작 없이 allocation 하여 운영 할 수 있다.

"index.routing.allocation"을 이용 하여 특정 노드에 할당 하는 것을 설정 한다.


Shard Allocation Filtering Dynamic Setting

index.routing.allocation.include.{attr} : 해당 attr에 적어도 한 개  이상 포함 하는 설정

index.routing.allocation.exclude.{attr} :  해당 attr에 포함 되지 않도록 설정 

index.routing.allocation.require.{attr} :  해당 attr에 무조건 포함 되로록 설정 

ㅁ attribute 요소

{attr} 
설명

_name

Node의 이름으로 매칭

_ip

Node의 ip 주소로 매칭

_host

Node의 hostname 으로 매칭


Tag the Nodes

다수의 Node를 지정하여 그룹화 및 관리의 편의성을 위하여 Node에 대하여 Tag를 지정 할 수 있다.

설정은 "node.attr" 속성을 사용하여 노드에 태그를 지정 한다.

아래와 같이 elasticsearch.yml파일을 수정 하거나 실행 시 -E 옵션으로 설정이 가능 하다

"cy_es" 임의로 설정된 이름으로 변경 가능 하며, 아래와 같은 경우 "cy_se"  에 "hot" 이라는 이름 Tag로 Node로 설정이 되어 Shard Filtering이 가능 하다. 

/etc/elasticsearch/elasticsearch.yml

아래와 같은 경우 "cy_se"  에 "warm" 이라는 이름의 Tag로 Node로 설정이 되어 Shard Filtering이 가능 하다. 

/etc/elasticsearch/elasticsearch.yml

index.routing.allocation

위에서 설명한 index.routing.allocation을 통하여 특정 index에 대하여 routing 을 아래와 같이 진행 할 수 있다.

아래 예제는 hot_warm_test 라는 index에 할당된 shard에 대하여 cy_es 에서 hot 이라는 tag로 지정된 node로 allocation 하게 된다.

PUT hot_warm_test
{
  "settings": {
  }

만약 동일한 index에 대하여 warm으로 지정된 tag로 설정된 data node 로 allocation 할 경우 warm tag로 설정 한다.

PUT hot_warm_test
{
  "settings": {
  }

Hot/Warm Test

기존의 아래와 같은 구성 으로 되어 있는 elasticsearch cluster가 있다.

1~3 노드는 master와 같은 역할 을 하고 있으며, hot node로 사용 할 예정이며, 4~6 노드는 warm 노드로 설정 하려고 한다.

ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.222.11 55 87 5 0.36 0.22 0.17 mdi - elastic_1
192.168.222.12 47 65 7 0.16 0.09 0.10 mdi * elastic_2
192.168.222.13 53 69 2 0.01 0.06 0.07 mdi - elastic_3
192.168.223.11 35 97 20 0.00 0.03 0.05 di - elastic_4
192.168.223.12 24 62 2 1.15 0.36 0.16 di - elastic_5
192.168.223.13 16 61 63 1.06 0.28 0.13 di - elastic_6

hot  노드로 설정 할 노드에 대하여 "node.attr.cy_es : hot" 으로 설정 하여 hot node로 설정 하기 위한  tag를 설정 한다.

/etc/elasticsearch/elasticsearch.yml
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
node.name: ${HOSTNAME}
discovery.zen.ping.unicast.hosts: ["elastic_1""elastic_2""elastic_3""elastic_4""elastic_5""elastic_6"]

hot  노드로 설정 할 노드에 대하여 "node.attr.cy_es : warm" 으로 설정 하여 warm node로 설정 하기 위한  tag를 설정 한다.

/etc/elasticsearch/elasticsearch.yml
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
node.name: ${HOSTNAME}
network.host: 0.0.0.0discovery.zen.ping.unicast.hosts: ["elastic_1""elastic_2""elastic_3""elastic_4""elastic_5""elastic_6"]

이제, hot_warm_test 라는 이름의 index를 hot으로 tag된 data노드로 routing 하여 생성 하여 본다,

PUT hot_warm_test
{
  "settings": {
  }

모든 data 노드는 1~3 노드에 tag된  hot 노드로 shard가 생성 된 것을 볼 수 있다.

GET _cat/shards/hot_warm_test?v
index         shard prirep state   docs store ip             node
hot_warm_test 3     p      STARTED    0  230b 192.168.222.13 elastic_3
hot_warm_test 3     r      STARTED    0  230b 192.168.222.11 elastic_1
hot_warm_test 2     r      STARTED    0  230b 192.168.222.13 elastic_3
hot_warm_test 2     p      STARTED    0  230b 192.168.222.11 elastic_1
hot_warm_test 4     p      STARTED    0  230b 192.168.222.12 elastic_2
hot_warm_test 4     r      STARTED    0  230b 192.168.222.11 elastic_1
hot_warm_test 1     r      STARTED    0  230b 192.168.222.13 elastic_3
hot_warm_test 1     p      STARTED    0  230b 192.168.222.12 elastic_2
hot_warm_test 0     p      STARTED    0  230b 192.168.222.13 elastic_3
hot_warm_test 0     r      STARTED    0  230b 192.168.222.12 elastic_2

간단하게 document를 1개 생성 하여 보면 정상 적으로 생성 된다.

PUT /hot_warm_test/_doc/1
{
"name" "yoon"
}

검색도 정상 적으로 응답 받을 수 있다.

GET /hot_warm_test/_doc/1
{
  "_index""hot_warm_test",
  "_type""_doc",
  "_id""1",
  "_version": 1,
  "found"true,
  "_source": {
    "name""yoon"
  }
}

만약 더이상 색인(docuement 추가)가 없고 간혈적으로 검색 하기 위하여  hot_warm_test 라는 이름의 index를 warn으로 tag된 data노드로 routing 하여 생성 하여 본다,

PUT /hot_warm_test/_settings
{
}

기존의  hot 노드(elastic_1~3) 에 있던 shard가 warm 노드(elastic_4~6) 으로 allcation된 것을 확인 할 수 있다.

GET _cat/shards/hot_warm_test?v
index         shard prirep state   docs store ip             node
hot_warm_test 3     r      STARTED    1 3.3kb 192.168.223.12 elastic_5
hot_warm_test 3     p      STARTED    1 3.3kb 192.168.223.11 elastic_4
hot_warm_test 2     r      STARTED    0  261b 192.168.223.12 elastic_5
hot_warm_test 2     p      STARTED    0  261b 192.168.223.11 elastic_4
hot_warm_test 4     p      STARTED    0  261b 192.168.223.12 elastic_5
hot_warm_test 4     r      STARTED    0  261b 192.168.223.13 elastic_6
hot_warm_test 1     p      STARTED    0  261b 192.168.223.12 elastic_5
hot_warm_test 1     r      STARTED    0  261b 192.168.223.13 elastic_6
hot_warm_test 0     r      STARTED    0  261b 192.168.223.11 elastic_4
hot_warm_test 0     p      STARTED    0  261b 192.168.223.13 elastic_6

Monitoring 기능을 활성화 하였다면, 좀더 자세하게 allocation된 부분을 확인 할 수 있다.

hot 노드와 동일 하게 document를 1개 생성 하여 보면 정상 적으로 생성 된다.

PUT /hot_warm_test/_doc/2
{
"name" "yoon"
}

또한,검색도 정상 적으로 응답 받을 수 있다.

GET /hot_warm_test/_doc/1
{
  "_index""hot_warm_test",
  "_type""_doc",
  "_id""1",
  "_version": 1,
  "found"true,
  "_source": {
    "name""yoon"
  }
}


참고 : https://www.elastic.co/blog/hot-warm-architecture-in-elasticsearch-5-x



반응형