[Elasticsearch] Elasticsearch Case Study 1) Data 노드에 Index/Shard 구성 시작 해보기

Elastic/Elasticsearch 2018. 4. 6. 10:13

Elasticsearch Case Study 1) Data 노드에 Index/Shard 구성 시작 해보기

- Data Node 3개, Active Index 1개

- Data Node Spec)

CPU : 16 cores

- 지속적인 Read/Write operaiton 이 발생 하는 경우로 가정 하겠습니다.


Primary/Replica Shard Sizing)

- Shard 구성을 하실 때 가장 쉽게 접근 할 수 있는 방법은 CPU 코어 크기를 가지고 판단 하시면 됩니다.

- Data 노드 하나당 active shard 로 배치 할 수 있는 가장 기본은 코어 크기와 똑같이 구성 하시는 것입니다.


위에 16 코어로 가정했기 때문에 Data 노드에는 16개의 Shard 를 할당 할 수 있습니다.


Elasticsearch Settings 정보)

curl -XPUT http://localhost:9200/case-study-1/_settings '{

    "settings" : {

        "index" : {

            "number_of_shards" : 15,

            "number_of_replicas" : 2

        }

    }

}'


이와 같이 Index 를 생성 하게 되면 아래와 같이 shard 가 배치 됩니다.


Data node 1 : 

Primary Shards : 0, 1, 2, 3, 4

Replica Shards : 5, 6, 7, 8, 9, 10, 11, 12, 13, 14

Data node 2 :

Primary Shards : 5, 6, 7, 8, 9

Replica Shards : 0, 1, 2, 3, 4, 10, 11, 12, 13, 14

Data node 3 :

Primary Shards : 10, 11, 12, 13, 14

Replica Shards : 5, 6, 7, 8, 9, 0, 1, 2, 3, 4


보시게 되면 모든 Data 노드에 Shard 가 15개씩 할당 되어 있는 것을 확인 하실 수 있습니다.

여기까지 확인 하셨으면 이제 부터가 시작 입니다.


Data 노드에 Index, Shard에 대한 기본 설정은 했지만 이게 최적화 된 것인지는 알수 없습니다.

그래서 사용환경에 맞춰서 성능 테스트를 해 보셔야 합니다.


아래 질문에 답변을 해보세요.


1. 내가 사용하고자 하는 클러스터는 질의 및 분석에 최적화 되어야 한다.

2. 내가 사용하고자 하는 클러스터는 색인에 최적화 되어야 한다.

3. 내가 사용하고자 하는 클러스터는 질의, 분석 그리고 색인 모두 최적화 되어야 한다.


1번을 원하신다면 아래 항목들에 대해서 검토를 해보시면 좋습니다.

질의 와 분석은 CPU 와 Memory 를 많이 사용하기 때문에 충분한 자원이 준비 되어 있어야 합니다.

그리고 Document 에 대한 mapping 정보 최적화가 필요 합니다.

1. Match query 종류를 사용해야 하는가? (주로 Full text query를 의미 합니다.)

- Elastic 사에서는 Full text queries 라고 합니다.

2. Term query 종류를 사용해야 하는가? (주로 Exact match query를 의미 합니다.)

- Elastic 사에서는 Term level queries 라고 합니다.

3. Aggregation 질의가 많은가?

4. Nested 유형의 Aggregation 질의가 많은가?


2번을 원하신다면 아래 항목들에 대해서 검토를 해보시면 좋습니다.

색인 작업은 CPU 와 Disk I/O 성능에 영향을 많이 받습니다.

또한 사용하는 형태소 분석기에 따른 성능 변화도 확인을 하셔야 합니다.


사실 색인에 최적화 라는건 Bulk Indexing 이 아니고서는 다른 주제 인것 같습니다.

로그 데이터의 경우 보통은 Data 노드의 처리량을 고려해서 앞단에 Queue 를 사용하고,

여기서 Beats 나 Logstash 와 같은 Shipper 를 이용해서 Elasticsearch 로 색인하도록 구성을 합니다.

결과적으로 Queue + Beats/Logstash + Elasticsearch 에 대한 최적화 작업 없이는 어려운 작업 입니다.


Elasticsearch 관점에서 바라보면:Bulk Indexing)

1. Dynamic mapping 사용을 피하는게 좋습니다.

2. 불필요한 Analyzed 과정을 제거 하는게 좋습니다.

3. Bulk 요청 시 Replica 와 Refresh 를 사용하지 않는게 좋습니다.

4. _all Field 사용을 피하는게 좋습니다.

5. _id 는 가능 하면 임의 설정을 하지 않는게 좋습니다.

6. Index Buffer Size 를 512MB 정도까지 크게 설정 하는게 좋습니다.

7. 기타 등등 사소한 튜닝 팁들이 많습니다.


3번을 원하신다면 아래 항목들에 대해서 검토를 해보시면 좋습니다.

가장 어려운 요구사항 입니다.

이런 경우 클러스터의 노드와 인덱스 구성을 분리해서 사용하시는게 좋습니다.

1. Cross Cluster Search(Tribe Node) 에 대해서 검토해 봅니다.

2. Hot-Warm Architecture 에 대해서 검토해 봅니다.

3. Index Alias 기능에 대해서 검토해 봅니다.

4. Shrink, Split, Reindex, Rollover, Rollup 기능에 대해서 검토해 봅니다.

5. Snapshot 과 Restore 기능에 대해서 검토해 봅니다.


이번 Case Study 는 아주 단순 합니다.

요구사항은 알수 없고 단순히 Data 노드 규모와 스펙만으로 Index/Shard 배치를 설정 하는 것이였습니다.

"왜 이렇게/저렇게 해야 하지?" 라는 궁금증이 드시는 부분은 이해를 돕기 위해 추가적인 설명이 들어가야 하는데 과감히 생략 했습니다. (커뮤니티에 질문 주시거나 저를 만나시면 물어보세요. 친절히 설명해 드리겠습니다.)


항상 반복 되는 이야기지만,

사용 환경에 맞게 테스트 하시고 최적화 하는게 정답입니다.

시작 하기 전에 조금이나마 도움이 될 수 있는 내용을 작성한 것이지 이대로 하면 된다는 것은 아닙니다.

알아야 할 것도 많고 검증 해야 할 것도 많습니다.

시간과 인력이 부족 하시다면 Elastic 사에서 지원하는 좋은 프로그램들이 있으니 참고 하셔도 좋을 것 같습니다.


궁금 하신 것들이 있으시면 Facebook 유저 커뮤니티에 질문으로 올려 주세요.

제가 할 수 있다면 도움 드릴 수 있도록 하겠습니다.

: