티스토리 뷰
1. 개요
현재 12대 구성의 Elastic Search Cluster 를 운영 중이고, 그중 한대 노드의 이상이 감지되어 장애처리를 하였다.
일반적인 경우 ES 장애처리 수순은 아래와 같다.
1. ES 클러스터에서 장애 노드 제거
2. 장애 노드 로컬에서 Hardware Fault 확인
3. 부품(Disk 등) 교체 후 ES 클러스터에서 장애 노드 신규 추가
ES 에서 해줘야 할일은 노드 제거 및 추가가 전부이기에 Hadoop Slave 교체 처럼 성능에서는 별 영향이 없을 것이라고 예상했으나
예상과 다르게 전체 성능 저하 및 부하 급증을 겪어야 했다.
2. 시스템 현황
작업 전 curl 명령어를 활용해 ES cluster status 를 확인해보자
curl -XGET 'http://hostname:9200/_cluster/health?pretty=true'
현재 운영 중인 ES 클러스터의 규모는 아래와 같다.
indices 갯수 |
38개 |
indieces 용량 |
800G * 12 |
총 데이터 건수 |
7억8천만건 |
현재 운영 중인 ES 클러스터의 status는 아래와 같다.
number_of_data_nodes |
12 |
active_primary_shards |
228 |
active_shards |
456 |
relocating_shards |
0 |
initializing_shards |
0 |
unassigned_shards |
0 |
3. 노드 제거와 Shard Initializing
ES 클러스터에서 1개 노드를 제거하고 나서 ES 의 구동을 살펴보면, 우선 shard initializing 을 시작한다.
제거된 노드에서 가지고 있던 indices 는 기존 3 copy 에서 2 copy 가 되므로
나머지 노드들은 2 copy 의 indices 들을 3 copy 로 만들기 위해 자기복제를 시작한다.
제거된 노드에서 37개 indices 를 가지고 있었기 때문에 initializing_shards 값은 37 부터 시작해서 0 까지 서서히 줄어들다.
그리고 이 작업이 완료될때까지 아래 현상이 발생하였다.
. indices 직접 복사 중인 노드들의 load avg 20까지 치솟음
4. 노드 추가시 전체 부하
금번 작업의 경우 로컬 디스크나 메인보드에서 특별한 이상을 찾을 수 없었기에 제거된 노드를 그대로 다시 추가시켰다.
결국 신규 추가되는 노드의 로컬디스크에는 기존 indices 데이터를 그대로 가지고 있는 채로 ES 클러스터에 추가된 셈이다.
일단 신규 노드를 추가시키면 shard relocating 이 발생하고, 이 값은 2를 유지하고 있다.
ES UI Plugin 인 BigDesk 에서 확인해보면 shard 들의 이동(보라색) 이 2개씩 한정되어 이동하는 것이 보인다.
위 상황을 고려하여 가정해보면 아래와 같은 결론을 얻을 수 있다.
ES 에서 노드 1개가 제거되면 다른 11개의 노드들은 각자의 indices 정보를 참고하여 전체 밸런스를 맞출 것이다.
이때 11개 노드 각각은 2 shard 만 처리를 하더라도 여러 노드에서 동시다발적으로 진행되기 때문에 전체 부하가 급증한다.
반대로 ES 에서 노드 1개가 추가되면 추가된 1개의 신규 노드는 본인이 처리할 수 있는 만큼만 일을 하기 때문에 전체 부하가 급증하지 않는다.
5. Shard Relocating
ES에서 신규노드를 추가하면 발생하는 shard relocationg 에 관해 부연하자면,
Hadoop 에서 신규 노드 추가할 때와는 다르다는 점이다.
Hadoop 에서 신규노드를 추가하면 기존 데이터의 밸런싱은 거의 이루어지지 않고,
새로 들어오는 데이터에 대해서 가용공간이 많은 신규 노드 위주로 저장이 이루어 진다.
이를 해결하고 전체 디스크 사용률을 어느정도 맞추기 위해선 별도로 하둡 밸런서를 구동시켜줘야 한다.
그러나 ES 에서는 relocating shard 과정이 곧 밸런서이다.
위 같은 경우 신규로 추가된 노드(= 방금 제거시킨 장애노드) 에는 기존 indices 정보를 가지고 있었다.
relocating 과정을 거치면서 기존의 indices 는 삭제되고 새로 전달받은 indices 만 저장하고 관리하게 된다.
신규노드로 진입하는 순간 기존 37개 indices 가 모두 삭제되고 새 indices 를 2개씩 전달받는지,
순차적으로 기존 indices 를 지우고 새 indices 를 받는지까지 모니터링 하진 않았다.
하지만 나중에 disk 사용량 로그를 확인해보니
노드추가 시점에서 기존 inidices 용량만큼 삭제되고 나서 다시 서서히 증가하는 것을 확인할 수 있었다.
결국 신규노드가 추가되면 기존의 indices 데이터는 전부 삭제된 후 새 indices 를 순차적으로 받아오는 방식임을 알 수 있다.
그리고 위와 같은 방식에서는 relocating 작업은 어떤 상황이던지 비슷한 부하정도가 나타날 것이다.
. shard relocating 시 검색속도는 거의 영향을 받지 않는다.
6. 시사점
결론적으로 ES 노드 교체 작업은 사용자 서비스에 영향을 미치게 되고,
Hadoop Slave 노드 교체 처럼 일과시간 중 처리하기에는 무리가 따른다.
그리고 중요한건 차후 동일 작업이 발생할 경우 보다 수월한 진행을 위해서
그리고 initializing 과 relocating 이 발생하는 원리와 기준은 무엇인가?
-> 이것도 공부해야할 것
'개발 노트 > Elastic Search' 카테고리의 다른 글
elastic search 장애처리(상세) (0) | 2013.11.05 |
---|---|
Elastic Search 장애처리 (0) | 2013.10.28 |
ElasticSearch Query 사용하기 (0) | 2013.09.04 |
- Total
- Today
- Yesterday
- natas7
- Encode
- 리터럴
- bz2
- BASE64
- OpenSSL
- tr
- 리눅스
- Strings
- nc
- Bandit
- tar
- Linux
- 풀이
- solution
- find
- 압축파일
- 웹보안
- OverTheWire
- over the wire
- gz
- java
- grep
- 32bit
- Natas
- SSL
- ssh
- X32
- HTTPS
- 웹보안공부
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |