728x90
여러개의 인덱스에 걸쳐 alias를 설정하는 방법
test1, test2 두개의 인덱스에 alias 적용
$ curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d'
{
"actions" : [
{ "add" : {"indices" : ["test1", "test2" ], "alias" : "alias2" } }
]
}
test로 시작하는 모든 인덱스에 alias 적용
$ curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d'
{
"actions" : [
{ "add" : { "index" : "test*", "alias" : "alias3" } }
]
}
alias와 관련해서 주의해야할 점이 있는데 단일 인덱스에 설정된 alias는 별칭을 통해서 색인과 검색이 모두 가능하지만, 여러개의 인덱스에 걸쳐 설정된 alias의 경우에는 별칭을 통해서는 색인이 되지 않고 검색만 가능하다.
템플릿 활용하기
인덱스가 생성될 때마다 인덱스 API를 통해서 동적으로 설정을 변경해야 한다면 굉장히 번거로울 것이다. 다행히 ES는 템플릿 API를 통해서 특정 패턴의 이름을 가진 인덱스에 설정이 자동 반영되도록 하는 인터페이스를 제공한다.
$ curl -X PUT "localhost:9200/_template/mytemplate_1?pretty" -H 'Content-type: application/json' -d'
{
"index_patterns" : ["test*"], // 템플릿이 적용될 인덱스의 이름 패턴을 정의. 정규식 적용이 가능
"order" : 1,
"settings" : {
"number_of_shards" : 3, // 프라이머리 샤드 갯수 설정
"number_of_replicas" : 1 // 리플리카 샤드 갯수 설정
},
"mappings" : { // 인덱스에 적용할 매핑정보
"_doc" : {
"properties" : {
"test": { // test라는 text 필드가 생성
"type" : "text"
}
}
}
},
"aliases" : {
"alias1" : {} // alias에 대한 설정. 인덱스가 생성되면 무조건 alias1이라는 별칭을 얻는다.
}
}
클러스터의 상태 확인하기
$ curl -s http://localhost:9200/_cat/health?v
값 | 의미 |
green | 모든 샤드가 정상적으로 동작하고 있는 상태 |
yellow | 모든 프라이머리 샤드는 정상적으로 동작하고 있으나, 일부 혹은 모든 레플리카 샤드가 정상적으로 동작하고 있지는 않는 상태 |
red | 일부 혹은 모든 프라이머리 샤드/레플리카 샤드가 정상적으로 동작하고 있지 않은 상태 |
green과 yellow 상태에서는 프라이머리 샤드가 정상적으로 동작하고 있기 때문에 데이터의 유실은 발생하지 않는다. 다만 yellow의 경우 일부 레플리카 샤드가 정상적으로 동작하지 않기 때문에 이후 레플리카 샤드가 없는 프라이머리 샤드에 문제가 생기면 클러스터의 상태가 red로 변경될 위험이 있다. red는 일부 인덱스들의 프라이머리 샤드가 배치되지 않은 상태이기 때문에 데이터의 유실이 발생할 수 있다.
- epoch : API를 호출한 시간을 UNIX 시간 형태로 표현한 숫자이다.
- timestamp : API를 호출한 시간을 사람이 읽기 쉬운 형태로 표현항 값이다.
- cluster : 클러스터의 이름이다.
- status : 클러스터의 상태이다.
- node.total : 클러스터를 구성하고 있는 전체 노드의 개수다
- node.data : 클러스터를 구성하고 있는 노드들 중 데이터 노드의 개수다.
- shards : 클러스터에 존재하는 전체 샤드의 개수다. 클러스터에 너무 많은 양의 샤드가 존재하면 성능저하를 일으킬수 있기 때문에 모니터링 해야할 중요 지표중 하나이다.
- pri : 클러스터에 존재하는 샤드들 중 프라이머리 샤드의 개수다.
- relo : 클러스터에서 재배치되고 있는 샤드의 개수다.
- init : 클러스터에서 초기화되고 있는 샤드의 개수다.
- unassign : 클러스터에서 어느 노드에도 배치되지 않고 남아있는 샤드의 개수다.
- pending_tasks : 클러스터의 유지보수를 위한 작업 중 실행되지 못하고 큐에 쌓여 있는 작업의 개수다.
- max_task_wait_time : pending_tasks에서 확인한 작업이 실행하기까지 소요된 최대 시간이다.
- active_shards_percent : 전체 샤드 중에서 정상적으로 동작하는 샤드의 비율이다. 100%가 아니라면 초기화 중이거나 배치되지 않은 샤드가 존재한다는 의미이다.
노드의 상태와 정보 확인하기
$ curl -s http://localhost:9200/_cat/nodes?v
- ip : 노드의 IP주소이다.
- heap.percent : 힙 메모리의 사용률이다. 이 값이 클수록 사용중인 힙 메모리의 양이 많다는 뜻이다. 85% 이상을 계속 유지한다면 OOM이 발생할 가능성이 크기 때문에 힙 메모리가 올라가는 이유를 확인해봐야 한다.
- ram.percent : 메모리의 사용률이다. 노드가 상요할 수 잇는 전체 메모리에서 사용 중인 메모리의 사용률이다. 이 값은 대부분 90% 이상의 높은 값을 나타내는데, JVM에 할당된 힙 메모리 외의 영역은 OS에서 IO부하를 줄이기 위한 페이지 캐시로 사용하기 때문이다.
- cpu : 노드의 CPU사용률이다.
- load_1m : 각각 1분, 5분, 15분의 평균 Load Average를 의미한다.
- load_5m
- load_15m
- node.role : 노드의 역할이다. d는 데이터노드, m은 마스터 노드, i는 인제스트
- master : 클러스터에서 마스터 역할을 하는 노드를 표시한다. 별표(*)로 표시되며 해당 노드가 현재 클러스터 전체의 메타 데이터를 관리하는 역할을 한다.
- name : 노드의 이름이다. 호스트 네임이 아니라 elasticsearch.yml 파일내 정의 한 값이다.
노드들의 디스크 사용률 확인하기
$ curl -s "http://localhost:9200/_cat_nodes?v&h=id,name,disk.used_percent"
인덱스의 상태와 정보 확인하기
$ curl -s http://localhost:9200/_cat/indices?v
$ curl -s http://localhost:9200/_cat/indices | grep red
샤드의 상태확인하기
$ curl -s http://localhost:9200/_cat/shards?v
$ curl -s http://localhost:9200/_cat/shards?v | grep UNASSIGNED
값 | 의미 |
STARTED | 정상적인 상태 |
INITIALIZING | 샤드를 초기화하는 상태. 최초 배치시 혹은 샤드에 문제가 발생하여 새롭게 배치할 때의 상태이다. |
RELOCATING | 샤드가 현재의 노드에서 다른 노드로 이동하고 있는 상태. 새로운 데이터 노드가 추가되거나 기존 데이터 노드에 문제가 생겨서 샤드가 새로운 노드에 배치되어야 할때의 상태이다. |
UNASSIGNED | 샤드가 어느 노드에도 배치되지 않은 상태. 해당 샤드가 배치된 노드에 문제가 생기거나 클러스터의 라우팅 정책에 의해 배치되지 않은 상태이다. |
클러스터의 성능 지표
$ curl -s http://localhost:9200/_cluster/stats?pretty
- docs.count : 클러스터에 색인된 전체 문서의 개수
- docs.deleted : 클러스터에서 삭제된 문서의 개수
- store.memory_size_in_bytes : 저장중인 데이터의 전체 크기를 bytes 단위로 표현한 값
- fielddata.memory_size_in_bytes : 필드 데이터 캐시의 크기이다. 필드 데이터는 문자열 필드에 대한 통계 작업을 할때 필요한 데이터로, 필드 데이터의 양이 많으면 각 노드의 힙 메모리 공간을 많이 차지하기 때문에 이 값이 어느정도 인지 모니터링 해야 한다.
- query_cache.memory_size_in_bytes : 쿼리 캐시의 크기이다. 모든 노드들은 쿼리의 결과를 캐싱하고 있는데 이 값이 커지면 힙 메모리를 많이 차지하게 되기 때문에 이 값이 어느 정도인지 모니터링해야 한다.
- segments.count : 세그먼트의 개수다.
- segments.memory_in_bytes : 세그먼트가 차지하고 있는 메모리의 크기이다. 세그먼트도 힙 메모리 공간을 차지하기 때문에 힙 메모리의 사용률이 높을 경우 세그먼트의 메모리가 어느정도를 차지하고 있는지 살펴봐야 한다.
- versions : 클러스터를 구성하고 있는 노드들의 버전이다.
- jvm.versions : 클러스터를 구성하고 있느 노드들의 JVM버전이다.
노드의 성능 지표
$ curl -s http://localhost:9200/_nodes/stats?pretty
- nodes. : 노드의 ID이다. 클러스터 내부에서 임의로 부여한다.
- nodes.name : 노드의 이름이다. elasticsearch.yml파일에 설정한 이름이다.
- nodes.roles : 노드가 수행할 수 있는 역할이다.
- nodes.indices.docs.count : 노드가 가지고 있는 문서의 수이다.
- nodes.indices.store.size_in_bytes : 노드가 저장하고 있는 문서의 크기이다.
- nodes.indices.indexing.index_total : 지금까지 노드가 색인한 문서의 수이다.
- nodes.indices.indexing.index_time_in_millis : 색인에 소요된 시간을 의미한다.
- nodes.indices.get : RestAPI의 GET 요청으로 문서를 가져오는 성능에 대한 지표이다.
- nodes.indices.search : 검색 성능과 관련된 지표이다.
- nodes.indices.merges : 세그먼트 병합과 관련된 성능 지표이다. 카운터 형식의 지표로 세그먼트를 얼마나 병함했는지, 병합할 때 어느 정도의 시간이 소요되었는지를 나타낸다.
- nodes.indices.query_cache : 쿼리 캐시와 관련된 지표이다. 현재 노드에서 사용중인 쿼리 캐시가 어느 정도인지 확인할 수 있다.
- nodes.indices.fielddata : 필드데이터 캐시와 관련된 지표이다. 현재 노드에서 사용중인 필드 데이터의 크기가 어느 정도인지 확인할 수 있다.
- nodes.indices.segments : 노드에서 사용중인 세그먼트와 관련된 지표이다. 세그먼트의 개수 그리고 세그먼트들이 차지하고 있는 메모리의 크기를 보여준다.
- nodes.os.cpu.percent : 노드의 CPU 사용률이다. 이 값이 높으면 노드가 CPU 부하 상태에 있다는 의미이다.
- nodes.os.cpu.load_average : 노드의 Load Average 값이다.
- nodes.os.gc.collectors : GC와 관련된 성능 지표이다. ES는 자바 기반의 애플리케이션이기 때문에 JVM에서 수행하는 GC의 영향을 피할수 없다. 각각 young, old GC를 의미하며 각각의 GC가 얼마나 자주, 그리고 얼마나 오랫동안 발생하는지 나타낸다.
- nodes.os.gc.thread_pool : 노드의 스레드 풀 상태이다. 검색에 사용하는 search 스레드, 색인에 사용하는 write 스레드 등 스레드들의 개수와 큐의 크기를 보여준다.
- nodes.os.fs.total : 디스크의 사용량을 의미한다. available이 현재 남아있는 용량이기 때문에 가장 중요하다.
색인성능 살펴보기
$ curl -s http://localhost:9200/_stats?pretty | more
검색 성능 살펴보기
$ curl -s http://localhost:9200/_stats?pretty| more
GC 성능 살펴보기
$ curl -s http://localhost:9200/_nodes/stats?pretty |more
'PaaS > Data' 카테고리의 다른 글
ElasticSearch-Filebeat 인덱스 이름 Custom하게 변경 (0) | 2022.08.08 |
---|---|
ElasticSearch 색인성능 최적화 (0) | 2022.07.24 |
ElasticSearch 클러스터 튜닝 가이드 (0) | 2022.07.22 |
ElasticSearch 기본 개념 (0) | 2022.07.21 |
Filebeat와 Elastic Search 연동 (0) | 2022.07.15 |