Index maintenance
출처: 문서
본문
인덱스 유지 관리
OpenSearch는 백그라운드에서 인덱스를 리프레시하고, translog를 플러시하고, 세그먼트를 병합해요. 그래서 대부분의 클러스터에서는 이런 작업을 직접 실행할 필요가 전혀 없어요. 다만 특정 시점에 결과가 필요할 때는 직접 실행해야 해요. 문서를 색인한 직후 바로 검색되도록 만들거나, 스냅샷 전에 삭제된 문서의 디스크 공간을 회수하거나, 원래 구성보다 커진 인덱스의 샤드 수를 변경할 때가 그런 경우예요.
각 작업은 인덱스 작업 API로 사용할 수 있고, 클론을 제외하면 OpenSearch Dashboards의 Index Management 페이지에서도 사용할 수 있어요.
인덱스 생성, 열기, 닫기, 삭제 같은 라이프사이클 작업에 대해서는 인덱스 작업을 참고하세요.
이 페이지의 예제는 프라이머리 샤드 두 개를 가진 logs-2026이라는 이름의 인덱스를 대상으로 동작해요. 이 인덱스는 다음 요청으로 만들 수 있어요:
PUT /logs-2026
{
"settings": {
"index.number_of_shards": 2,
"index.number_of_replicas": 0
}
}
{% include copy-curl.html %}
인덱스 리프레시
리프레시는 인메모리 버퍼에 있던 문서를 새 세그먼트에 기록해서 검색 결과에 보이게 만들어요. OpenSearch는 기본적으로 1초마다 각 인덱스를 리프레시하기 때문에, 문서를 색인한 뒤 약 1초가 지나면 검색할 수 있어요. 테스트나 클라이언트가 문서를 쓴 직후 곧바로 검색해야 한다면 인덱스를 수동으로 리프레시하세요:
POST /logs-2026/_refresh
{% include copy-curl.html %}
리프레시는 실행될 때마다 세그먼트를 하나 만들기 때문에, 벌크 로드 도중에 자주 리프레시하면 색인 속도가 느려져요. 대량의 데이터를 적재할 때는 적재가 진행되는 동안 index.refresh_interval을 -1로 설정해 두고, 적재가 끝나면 한 번만 리프레시하세요. 자세한 내용은 인덱스 리프레시를 참고하세요.
리프레시는 열려 있는(open) 인덱스에만 적용돼요.
인덱스 플러시
플러시는 Lucene 커밋을 수행해서 파일 시스템 캐시에 있던 세그먼트를 디스크에 기록하고 새 translog를 시작해요. 이 작업 덕분에 색인된 데이터가 노드 재시작 이후에도 유지돼요. OpenSearch는 translog의 크기와 보존 기간을 기준으로 자동으로 플러시해요:
POST /logs-2026/_flush
{% include copy-curl.html %}
유지 관리를 위해 노드를 종료하기 전에 수동으로 플러시하세요. 그러면 복구할 때 큰 translog를 재생하지 않아도 돼요. 자세한 내용은 플러시를 참고하세요.
플러시는 열려 있는(open) 인덱스에만 적용돼요.
인덱스 캐시 비우기
OpenSearch는 반복되는 검색 속도를 높이기 위해 필드 데이터, 쿼리 결과, 요청 수준의 집계 결과를 캐시해요. 이 캐시들을 비우면 힙 메모리는 확보되지만, 캐시가 다시 채워질 때까지 이후 검색은 느려져요:
POST /logs-2026/_cache/clear
{% include copy-curl.html %}
캐시를 전부 비우지 않고 하나만 비우려면 fielddata, query, request 쿼리 파라미터를 사용하세요. 자세한 내용은 캐시 비우기를 참고하세요.
캐시 비우기는 열려 있는(open) 인덱스에만 적용돼요.
인덱스 강제 병합
OpenSearch는 인덱스를 불변(immutable) 세그먼트의 모음으로 저장하고, 백그라운드에서 작은 세그먼트를 큰 세그먼트로 병합해요. 삭제된 문서는 삭제 표시만 될 뿐이며, 그 문서가 담긴 세그먼트가 병합될 때 비로소 공간이 회수돼요. 강제 병합(force merge)은 이 병합을 즉시 실행해서 세그먼트 수를 줄이고 삭제 표시된 문서를 완전히 제거해요:
POST /logs-2026/_forcemerge?max_num_segments=1
{% include copy-curl.html %}
강제 병합은 I/O 비용이 크고, 자동 병합 정책이 다시는 병합하지 않는 세그먼트를 만들어 낼 수도 있어요. 롤오버된 시계열 인덱스처럼 더 이상 쓰기가 들어오지 않는 인덱스에만 실행하세요. 자세한 내용은 강제 병합을 참고하세요.
인덱스 축소
축소(shrink)는 인덱스를 프라이머리 샤드 수가 더 적은 새 인덱스로 복사해요. 기존 인덱스의 프라이머리 샤드 수는 그 자리에서 바꿀 수 없기 때문에, 최종 크기에 비해 샤드를 많이 잡아 만든 인덱스는 축소해서 쓰세요.
먼저 원본 인덱스에 쓰기 작업을 차단하세요. 아직 쓰기를 받고 있는 인덱스를 축소하면 illegal_state_exception이 발생하면서 실패해요:
PUT /logs-2026/_settings
{
"index.blocks.write": true
}
{% include copy-curl.html %}
그다음 인덱스를 축소하세요:
POST /logs-2026/_shrink/logs-2026-shrunk
{
"settings": {
"index.number_of_shards": 1
}
}
{% include copy-curl.html %}
원본 인덱스는 다음 조건을 충족해야 해요:
- 인덱스가 쓰기 차단이 설정된 읽기 전용 상태여야 해요. 블록을 참고하세요.
- 프라이머리든 레플리카든 모든 샤드의 복사본이 같은 노드에 있어야 해요. 샤드 할당 필터링을 사용해서 복사본을 한곳으로 모으세요.
- 원본 인덱스의 모든 샤드가 할당되어 있어야 해요. 즉, 인덱스 상태가 red가 아니어야 해요.
- 대상 인덱스가 아직 존재하지 않아야 해요.
- 원본 인덱스가 대상 인덱스보다 프라이머리 샤드를 더 많이 가져야 하고, 대상 샤드 수는 원본 샤드 수의 약수여야 해요. 예를 들어 프라이머리 샤드가 8개인 인덱스는 4, 2, 1로 축소할 수 있어요. 7처럼 샤드 수가 소수인 인덱스는 1로만 축소할 수 있어요.
- 어떤 대상 샤드도 Lucene 샤드가 담을 수 있는 최대치인 2,147,483,519개를 넘는 문서를 받으면 안 돼요.
- 축소를 수행하는 노드에 인덱스 사본 하나를 더 담을 만큼의 여유 디스크 공간이 있어야 해요.
자세한 내용은 인덱스 축소를 참고하세요.
인덱스 분할
분할(split)은 인덱스를 프라이머리 샤드 수가 더 많은 새 인덱스로 복사하면서, 각 원본 샤드를 여러 개의 대상 샤드로 나눠요. 원래 샤드 수로는 감당하기 어려울 만큼 커져서 데이터 양이나 쿼리 부하를 처리할 용량이 더 필요한 인덱스를 분할하세요. 분할 역시 원본 인덱스에 쓰기 차단이 필요해요:
PUT /logs-2026/_settings
{
"index.blocks.write": true
}
{% include copy-curl.html %}
그다음 인덱스를 분할하세요:
POST /logs-2026/_split/logs-2026-split
{
"settings": {
"index.number_of_shards": 4
}
}
{% include copy-curl.html %}
원본 인덱스는 다음 조건을 충족해야 해요:
- 인덱스가 쓰기 차단이 설정된 읽기 전용 상태여야 해요. 블록을 참고하세요.
- 원본 인덱스의 모든 샤드가 할당되어 있어야 해요. 즉, 인덱스 상태가 red가 아니어야 해요.
- 대상 인덱스가 아직 존재하지 않아야 해요.
- 원본 인덱스가 대상 인덱스보다 프라이머리 샤드를 더 적게 가져야 하고, 대상 샤드 수는 원본 샤드 수의 배수여야 해요. 예를 들어 프라이머리 샤드가 2개인 인덱스는 4, 6, 8로 분할할 수 있어요. 프라이머리 샤드가 1개인 인덱스는 어떤 수의 샤드로도 분할할 수 있어요.
- 분할을 수행하는 노드에 인덱스 사본 하나를 더 담을 만큼의 여유 디스크 공간이 있어야 해요.
자세한 내용은 인덱스 분할을 참고하세요.
인덱스 클론
클론(clone)은 인덱스를 프라이머리 샤드 수, 매핑, 설정이 모두 같은 새 인덱스로 복사해요. 원본을 건드리지 않으면서 실제 데이터를 대상으로 매핑이나 설정 변경을 테스트하고 싶을 때 인덱스를 클론하세요. 축소와 분할과 마찬가지로 클론도 원본 인덱스에 쓰기 차단이 필요해요:
PUT /logs-2026/_settings
{
"index.blocks.write": true
}
{% include copy-curl.html %}
그다음 인덱스를 클론하세요:
POST /logs-2026/_clone/logs-2026-copy
{% include copy-curl.html %}
작업이 끝나면 index.blocks.write를 false로 설정해서 쓰기 차단을 해제하세요.
자세한 내용은 인덱스 클론을 참고하세요. 클론은 API로만 사용할 수 있어요.
인덱스 롤오버
롤오버는 새 인덱스를 만들고 쓰기 별칭이나 데이터 스트림을 새 인덱스로 향하게 해요. 그러면 이전 인덱스는 읽기 전용이 되고, 쓰기는 새 인덱스로 계속 이어져요. 덕분에 개별 시계열 인덱스를 관리하기 좋은 크기로 유지할 수 있고, 인덱스 전체를 삭제하는 방식으로 오래된 데이터를 지우거나 아카이브할 수도 있어요.
롤오버 대상은 데이터 스트림이거나 쓰기 인덱스가 지정된 인덱스 별칭이어야 해요. 이름이 숫자로 끝나는 인덱스를 만들고 쓰기 별칭을 그 인덱스로 지정하세요:
PUT /logs-000001
{
"aliases": {
"logs": {
"is_write_index": true
}
}
}
{% include copy-curl.html %}
다음 요청은 logs 별칭의 쓰기 인덱스가 50 GB에 도달하거나 문서 1,000만 개에 도달하거나 7일이 지나면 롤오버해요:
POST /logs/_rollover
{
"conditions": {
"max_size": "50gb",
"max_docs": 10000000,
"max_age": "7d"
}
}
{% include copy-curl.html %}
새로 만든 인덱스에서는 어떤 조건도 충족되지 않기 때문에 응답에 "rolled_over": false가 표시돼요. 자세한 내용은 인덱스 롤오버를 참고하세요.
조건이 충족될 때 API를 호출하는 대신 주기적으로 롤오버하려면 rollover 액션이 포함된 Index State Management 정책을 정의하세요. ISM이 조건을 대신 평가하고, 조건이 충족되면 인덱스를 롤오버해 줘요.
OpenSearch Dashboards에서의 인덱스 유지 관리
Index Management 페이지로 이동하려면 상단 메뉴에서 Management > Index Management로 가세요. 선택한 인덱스에 대한 유지 관리 작업은 다음 이미지처럼 Indexes 페이지의 Actions 메뉴에 있어요.

이 절차는 이미 존재하는 인덱스를 대상으로 동작해요. 인덱스를 만드는 방법은 인덱스 생성을 참고하세요.
리프레시, 플러시, 캐시 비우기
- Index Management에서 Indexes, Data streams, Aliases 중 하나를 선택하세요.
- 필요하면 작업을 적용할 항목마다 옆의 체크박스를 선택하세요. 아무것도 선택하지 않으면 모든 항목에 작업이 적용돼요.
- Actions를 선택한 다음 Refresh, Flush, Clear cache 중 하나를 선택하세요.
- 확인 대화상자에서 같은 옵션을 선택하세요.
별칭과 데이터 스트림의 경우 이 작업은 열려 있는 백킹 인덱스에 적용돼요.
인덱스 강제 병합
-
Index Management에서 Indexes, Data streams, Aliases 중 하나를 선택하세요.
-
Actions를 선택한 다음 Force merge를 선택하세요.
-
Configure source index에서 병합할 인덱스, 데이터 스트림, 별칭을 선택하세요.
-
필요하면 Advanced settings를 펼치고 다음 옵션 중 원하는 것을 설정하세요:
- 특정 세그먼트 수로 병합하려면 Index segments에서 Manually set number of segments를 선택하고 숫자를 입력하세요. 각 샤드를 세그먼트 하나로 병합하려면
1을 입력하세요. - 병합이 끝난 뒤 인덱스를 플러시하려면 Flush indexes를 선택하세요.
- 삭제 표시된 문서를 완전히 제거하려면 Remove deleted documents를 선택하세요.
- 특정 세그먼트 수로 병합하려면 Index segments에서 Manually set number of segments를 선택하고 숫자를 입력하세요. 각 샤드를 세그먼트 하나로 병합하려면
-
필요하면 Notifications에서 Has failed / timed out, Has completed 중 하나 또는 둘 다 선택해서 결과에 대한 알림을 받으세요.
-
Force merge를 선택하세요.
인덱스 축소
- Index Management에서 Indexes를 선택하세요.
- 축소할 인덱스를 선택한 다음 Actions > Shrink를 선택하세요.
- Configure target index에서 Target index name에 이름을 입력하세요.
- Number of primary shards에 새 샤드 수를, Number of replicas에 레플리카 수를 입력하세요.
- 필요하면 Index alias에서 대상 인덱스의 별칭을 하나 이상 선택하거나 입력하세요.
- 필요하면 Advanced settings를 펼쳐서 알림을 추가하세요. 추가 알림 보내기를 참고하세요.
- Shrink를 선택하세요.
원본 인덱스가 축소 조건을 충족하지 않으면, 인덱스에 쓰기 차단을 설정하는 일을 포함해 조건을 해결하라는 안내가 인터페이스에 표시돼요.
인덱스 분할
- Index Management에서 Indexes를 선택하세요.
- 분할할 인덱스를 선택한 다음 Actions > Split을 선택하세요.
- Configure target index에서 Target index name에 이름을 입력하세요.
- Number of primary shards에 새 샤드 수를, Number of replicas에 레플리카 수를 입력하세요.
- 필요하면 Index alias에서 대상 인덱스의 별칭을 하나 이상 선택하거나 입력하세요.
- 필요하면 Advanced settings를 펼쳐서 알림을 추가하세요. 추가 알림 보내기를 참고하세요.
- Split을 선택하세요.
데이터 스트림 롤오버
- Index Management에서 Data streams를 선택하세요.
- Actions를 선택한 다음 Roll over를 선택하세요.
- Configure source에서 롤오버할 데이터 스트림을 선택하세요.
- Roll over를 선택하세요.
별칭 롤오버
- Index Management에서 Aliases를 선택하세요.
- Actions를 선택한 다음 Roll over를 선택하세요.
- Configure source에서 롤오버할 별칭을 선택하세요. 별칭에 쓰기 인덱스가 없으면 지정하라는 안내가 표시돼요.
- Define index에서 새 인덱스의 이름을 입력하고, 필요하면 별칭도 입력하세요.
- Index settings에서 프라이머리 샤드 수, 레플리카 수, 리프레시 간격을 입력하세요.
- Roll over를 선택하세요.
장시간 실행 작업의 상태 확인
reindex, shrink, split 작업은 다루는 데이터 양에 따라 수십 초에서 몇 시간까지 걸릴 수 있어요. 각 작업은 일회성이고 재귀적으로 반복되지 않는 작업이기 때문에, 완료될 때까지 추적할 수 있어요:
- Index Management에서 Indexes를 선택하세요.
- 작업이 적용되는 인덱스를 찾으세요.
- Status 열에서 작업 상태를 확인하세요.