클러스터 상태 API
클러스터 상태 API (Cluster Health API)
클러스터가 지금 정상인지 한눈에 확인하고 싶으시죠? 클러스터 상태 API가 클러스터의 운영 상태를 빠르게 보여줘요. OpenSearch는 샤드 할당 상태를 나타내는 세 가지 색으로 클러스터 상태를 표현해요.
출처: 문서
본문
1.0에서 도입
클러스터 상태 API는 클러스터의 운영 상태를 빠르게 보여줘요. OpenSearch는 샤드 할당 상태를 나타내는 세 가지 색으로 클러스터 상태를 표현해요.
- Green(최상): 모든 primary 샤드와 그 replica가 노드에 할당됐어요. 클러스터가 완전히 운영 중이에요.
- Yellow: 모든 primary 샤드가 할당됐지만 일부 replica 샤드가 unassigned 상태예요. 클러스터는 운영되지만 완전히 중복되지는 않아요.
- Red(최악): primary 샤드가 하나 이상 unassigned 상태예요. 일부 데이터를 사용할 수 없고, 검색 결과가 불완전할 수 있어요.
전반적인 상태를 결정할 때 최악의 상태가 우선해요. 여러 인덱스에 대해 상태를 요청하면 전체 상태는 최악의 인덱스 상태에 의해 결정돼요. 마찬가지로 인덱스 상태는 그 안에서 최악의 샤드 상태에 의해 결정돼요.
엔드포인트
GET /_cluster/health
GET /_cluster/health/{index}
경로 파라미터
다음 표는 사용 가능한 경로 파라미터예요. 모든 경로 파라미터는 선택적이에요.
| Parameter | Data type | Description |
|---|---|---|
| index | List or String | 요청을 제한하는 데 사용하는 데이터 스트림, 인덱스, alias의 쉼표로 구분된 목록이에요. 와일드카드(*)를 지원해요. 모든 데이터 스트림과 인덱스를 대상으로 하려면 이 파라미터를 생략하거나 * 또는 _all을 사용해요. |
쿼리 파라미터
다음 표는 사용 가능한 쿼리 파라미터예요. 모든 쿼리 파라미터는 선택적이에요.
| Parameter | Data type | Description | Default |
|---|---|---|---|
| awareness_attribute | String | 클러스터 상태를 반환할 awareness 속성의 이름이에요(예: zone). level이 awareness_attributes로 설정된 경우에만 적용돼요. | N/A |
| cluster_manager_timeout | String | cluster manager 노드로부터 응답을 기다리는 시간이에요. 지원되는 시간 단위에 대한 자세한 내용은 Common parameters를 참고하세요. | N/A |
| expand_wildcards | List or String | 와일드카드 표현식이 매칭할 수 있는 인덱스 유형을 지정해요. 쉼표로 구분된 값을 지원해요. 유효한 값은 다음과 같아요. - all: 숨겨진 인덱스를 포함해 모든 인덱스를 매칭해요. - closed: 닫힌, 숨겨지지 않은 인덱스를 매칭해요. - hidden: 숨겨진 인덱스를 매칭해요. open, closed 또는 둘 다와 결합해야 해요. - none: 와일드카드 표현식이 허용되지 않아요. - open: 열린, 숨겨지지 않은 인덱스를 매칭해요. | open |
| level | String | 클러스터 상태 응답에 포함되는 세부 정보의 양을 제어해요. 유효한 값은 awareness_attributes, cluster, indices, shards예요. | cluster |
| local | Boolean | cluster manager 노드 대신 로컬 노드에서만 정보를 반환할지 여부예요. | false |
| timeout | String | cluster manager 노드로부터 응답을 기다리는 시간이에요. 지원되는 시간 단위에 대한 자세한 내용은 Common parameters를 참고하세요. | N/A |
| wait_for_active_shards | Integer or String or NULL or String | 지정된 수의 샤드가 활성화될 때까지 기다린 후 응답을 반환해요. 모든 샤드에 대해 all을 사용해요. 유효한 값은 다음과 같아요. - all: 모든 샤드가 활성화될 때까지 기다려요. | 0 |
| wait_for_events | String | 주어진 우선순위를 가진 현재 대기 중인 모든 이벤트가 처리될 때까지 기다려요. 유효한 값은 다음과 같아요. - immediate: 최고 우선순위, 가능한 한 빨리 처리돼요. - urgent: 매우 높은 우선순위, immediate 이벤트 다음에 처리돼요. - high: 높은 우선순위, urgent 이벤트 다음에 처리돼요. - normal: 기본 우선순위, high 이벤트 다음에 처리돼요. - low: 낮은 우선순위, normal 이벤트 다음에 처리돼요. - languid: 최저 우선순위, 다른 모든 이벤트 다음에 처리돼요. | N/A |
| wait_for_no_initializing_shards | Boolean | 클러스터에 initializing 샤드가 없을 때까지 기다릴지 여부예요. | false |
| wait_for_no_relocating_shards | Boolean | 클러스터에 relocating 샤드가 없을 때까지 기다릴지 여부예요. | false |
| wait_for_nodes | Integer or String | 지정된 수의 노드(N)를 사용할 수 있을 때까지 기다려요. >=N, <=N, >N, <N을 받아요. ge(N), le(N), gt(N), lt(N) 표기법도 사용할 수 있어요. | N/A |
| wait_for_status | String | 클러스터 상태가 지정된 상태 이상에 도달할 때까지 기다려요. 유효한 값은 green, GREEN, yellow, YELLOW, red, RED예요. | N/A |
| weights | JSON object | PUT 요청의 요청 본문에서 속성에 가중치를 할당해요. 가중치는 2:3:5 같은 어떤 비율로든 설정할 수 있어요. 세 zone에서 2:3:5 비율이면 클러스터에 보내지는 100개의 요청마다 각 zone이 무작위 순서로 20, 30, 50개의 검색 요청을 받아요. 가중치 0이 할당되면 그 zone은 어떤 검색 트래픽도 받지 않아요. | N/A |
예시 요청: 모든 인덱스의 클러스터 상태 검색
다음 요청은 클러스터의 모든 인덱스에 대한 클러스터 상태를 검색해요.
GET /_cluster/health
예시 응답
응답에 클러스터 상태 정보가 포함돼요.
{
"cluster_name" : "opensearch-cluster",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"discovered_master" : true,
"discovered_cluster_manager" : true,
"active_primary_shards" : 138,
"active_shards" : 138,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 110,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 55.64516129032258
}
응답이 yellow 상태를 보여주는 이유는 이것이 할당할 수 없는 replica 샤드가 있는 단일 노드 클러스터이기 때문이에요. timed_out 필드가 false라서 응답이 기본 타임아웃 기간 내에 반환됐음을 나타내요.
예시 요청: 특정 상태 대기하기
다음 요청은 클러스터가 yellow 상태 이상에 도달할 때까지 50초를 기다려요.
GET /_cluster/health?wait_for_status=yellow&timeout=50s
클러스터 상태가 50초가 경과하기 전에 yellow나 green이 되면 요청은 즉시 응답을 반환해요. 그렇지 않으면 타임아웃을 초과하는 즉시 응답을 반환해요.
예시 요청: awareness 속성별 클러스터 상태 검색
awareness 속성(예: zone 또는 rack)별로 클러스터 상태를 확인하려면 level 쿼리 파라미터에 awareness_attributes를 지정해요.
GET /_cluster/health?level=awareness_attributes
응답에 awareness 속성별로 분할된 클러스터 상태 지표가 포함돼요.
{
"cluster_name": "runTask",
"status": "green",
"timed_out": false,
"number_of_nodes": 3,
"number_of_data_nodes": 3,
"discovered_master": true,
"discovered_cluster_manager": true,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100,
"awareness_attributes": {
"zone": {
"zone-3": {
"active_shards": 0,
"initializing_shards": 0,
"relocating_shards": 0,
"unassigned_shards": 0,
"data_nodes": 1,
"weight": 1
},
"zone-1": {
"active_shards": 0,
"initializing_shards": 0,
"relocating_shards": 0,
"unassigned_shards": 0,
"data_nodes": 1,
"weight": 1
},
"zone-2": {
"active_shards": 0,
"initializing_shards": 0,
"relocating_shards": 0,
"unassigned_shards": 0,
"data_nodes": 1,
"weight": 1
}
},
"rack": {
"rack-3": {
"active_shards": 0,
"initializing_shards": 0,
"relocating_shards": 0,
"unassigned_shards": 0,
"data_nodes": 1,
"weight": 1
},
"rack-1": {
"active_shards": 0,
"initializing_shards": 0,
"relocating_shards": 0,
"unassigned_shards": 0,
"data_nodes": 1,
"weight": 1
},
"rack-2": {
"active_shards": 0,
"initializing_shards": 0,
"relocating_shards": 0,
"unassigned_shards": 0,
"data_nodes": 1,
"weight": 1
}
}
}
}
특정 awareness 속성이 궁금하다면 awareness 속성 이름을 쿼리 파라미터로 포함할 수 있어요.
GET /_cluster/health?level=awareness_attributes&awareness_attribute=zone
위 요청에 대한 응답으로 OpenSearch는 zone awareness 속성에 대해서만 클러스터 상태 정보를 반환해요.
unassigned 샤드 정보는 awareness 속성에 대해 replica 수 강제(replica count enforcement)와 forced awareness를 클러스터 시작 전이나 클러스터 시작 후지만 인덱싱 요청 전에 구성한 경우에만 정확해요. 클러스터가 인덱싱 요청을 받은 후 replica enforcement를 활성화하면 unassigned 샤드 정보가 부정확할 수 있어요. replica 수 강제와 forced awareness를 구성하지 않으면 unassigned_shards 필드에 -1이 포함돼요.
응답 본문 필드
다음 표는 모든 응답 필드예요.
| Field | Data type | Description |
|---|---|---|
| cluster_name | String | 클러스터의 이름이에요. |
| status | String | 샤드 할당 상태에 기반한 전체 클러스터 상태예요. - green: 모든 primary와 replica 샤드가 할당됨. - yellow: 모든 primary 샤드가 할당됐지만 일부 replica는 아님. - red: primary 샤드가 하나 이상 unassigned 상태. 전체 상태는 모든 인덱스에서 최악의 샤드 상태에 의해 결정돼요. |
| timed_out | Boolean | 요청이 원하는 상태에 도달하기 전에 타임아웃 기간을 초과했는지 여부예요. false는 응답이 타임아웃 기간 내에 반환됐음을, true는 원하는 상태를 달성하기 전에 타임아웃이 만료됐음을 의미해요. |
| number_of_nodes | Integer | 데이터, cluster manager, ingest 등 모든 노드 유형을 포함한 클러스터의 총 노드 수예요. |
| number_of_data_nodes | Integer | 클러스터에서 데이터 노드로 지정된 노드 수예요. 데이터 노드는 샤드를 저장하고 데이터 관련 연산을 처리해요. |
| discovered_cluster_manager | Boolean | cluster manager 노드가 발견되어 연결 가능한지 여부예요. false면 클러스터가 불안정한 상태일 수 있어요. |
| discovered_master | Boolean | 레거시 필드예요. discovered_cluster_manager를 대신 사용해요. 하위 호환성을 위해 유지돼요. |
| active_primary_shards | Integer | 클러스터에서 현재 할당되어 활성화된 primary 샤드 수예요. 각 문서는 정확히 하나의 primary 샤드에 저장돼요. |
| active_shards | Integer | primary와 replica 샤드를 모두 포함한 활성 샤드의 총수예요. 숫자가 높을수록 데이터 중복이 좋다는 뜻이에요. |
| relocating_shards | Integer | 현재 한 노드에서 다른 노드로 이동 중인 샤드 수예요. 샤드 재배치는 리밸런싱 중이거나 노드가 클러스터에 합류하거나 떠날 때 발생해요. |
| initializing_shards | Integer | 현재 초기화 중인 샤드 수예요. 인덱스를 처음 만들거나 노드가 클러스터에 다시 합류해 샤드 데이터를 복구해야 할 때 발생해요. |
| unassigned_shards | Integer | 클러스터 상태에 존재하지만 어떤 노드에도 할당되지 않은 샤드 수예요. unassigned 샤드는 일반적으로 replica를 할당할 수 없거나(단일 노드 클러스터에서) 노드가 실패해 샤드를 재할당해야 할 때 발생해요. |
| delayed_unassigned_shards | Integer | 할당이 의도적으로 지연된 unassigned 샤드 수예요. OpenSearch는 노드가 잠시 연결이 끊겼다가 돌아올 것으로 예상될 때 불필요한 샤드 이동을 피하기 위해 할당을 지연시킬 수 있어요. |
| number_of_pending_tasks | Integer | cluster manager가 대기하고 실행할 큐에 있는 클러스터 수준 변경(인덱스 생성, 매핑 업데이트, 샤드 할당 결정 등) 수예요. |
| number_of_in_flight_fetch | Integer | 클러스터 전반에서 현재 실행 중인 샤드 수준 fetch 연산 수예요. |
| task_max_waiting_in_queue_millis | Integer | 가장 오래 대기한 작업이 큐에 있었던 시간(밀리초)이에요. 값이 높으면 cluster manager가 과부하됐을 수 있어요. |
| active_shards_percent_as_number | Double | 존재해야 하는 총 샤드 수(primary와 replica) 중 활성화된 샤드의 비율이에요. 100.0은 모든 샤드가 할당됐음을 나타내요. |
| indices | Object | level=indices 또는 level=shards일 때 반환돼요. 클러스터 수준 필드와 동일한 구조의 인덱스별 상태 정보를 포함해요. |
| shards | Object | level=shards일 때 반환돼요. indices 객체 안에 중첩된 샤드별 상태 정보를 포함해요. |
| awareness_attributes | Object | level=awareness_attributes일 때 반환돼요. awareness 속성(zone or rack 같은)에 따라 분할된 클러스터 상태 정보를 포함해요. |
보안
Security 플러그인을 사용한다면 적절한 권한이 있는지 확인해야 해요: cluster:monitor/health.
더 알아보기 (Learn more)
- 샤드 할당 이유를 자세히 보려면 Cluster Allocation Explain API를 참고하세요.
awareness_attribute파라미터와 클러스터 상태의level조합으로 zone/rack 단위 상태를 확인할 수 있어요.