이 문서는 2023년 7월에 작성되었으며 Opensearch 2.8.0 버전입니다.

Opensearch의 Searchable Snapshot은 클러스터에서 삭제된 Index를 Snapshot으로 복원하여 데이터를 검색할 수 있도록 하는 기능을 수행합니다. Searchable Snapshot 기능을 사용하기 위해서는 Snapshot에 대한 사전 지식이 필요합니다. Snapshot 글을 먼저 참고하시면 진행하는데 많은 도움이 됩니다.

https://stdhsw.tistory.com/entry/Opensearch-Snapshot-AWS-S3%EB%B0%B1%EC%97%85-%EB%B0%8F-%EB%B3%B5%EA%B5%AC

 

클러스터 노드 구성

Opensearch에서 Searchable Snapshot 기능을 사용하기 위해서는 "search" role을 가진 노드가 필요합니다. 저는 한정된 자원으로 Master Node 1대, Data Node 2대, Search Node 1대로 클러스터를 구성하여 테스트하였습니다. (웬만하면 Master Role을 가진 노드를 3대 이상의 홀수 개수만큼 유지하는 것을 추천합니다.)

  Master Node Data Node Search Node
개수 1 2 1
Role master data
ingest
saerch

Master Node는 Opensearch의 클러스터를 관리하는 역할을 수행하며 Data Node는 실제 데이터가 저장되고 연산 기능을 수행합니다. Search Node는 Snapshot으로 부터 인덱스 데이터를 가져와 데이터를 검색할 수 있는 기능을 제공합니다.

Snapshot으로부터 데이터를 가져오는데 인덱스의 크기가 크면 매우 오래 걸릴 수 있으며 데이터를 가져오는 과정에서 네트워크 비용이 발생할 수 있습니다.

 

Snapshot 생성 시 설정

일반적인 스냅샷과 다르게 Searchable Snapshot 기능을 사용하기 위해서는 Snapshot 생성 시 "storage_type": "remote_snapshot"의 설정이 필요합니다.

PUT _snapshot/스냅샷레포지토리/스냅샷명?wait_for_completion=true
{
  "indices": "*",
  "ignore_unavailable": true,
  "include_global_state": false,
  "partial": false,
  "storage_type": "remote_snapshot"
}

storage_type에 대한 설정은 Opensearch 공식 Document에서는 다음과 같이 설명하였습니다.

 

local indicates that all snapshot metadata and index data will be downloaded to local storage.
remote_snapshot indicates that snapshot metadata will be downloaded to the cluster, but the remote repository will remain the authoritative store of the index data. Data will be downloaded and cached as necessary to service queries. At least one node in the cluster must be configured with the search role in order to restore a snapshot using the type remote_snapshot.
Defaults to local.

 

Searchable Snapshot API

평상시에는 인덱스가 존재하지 않고 필요시 Snapshot에서 복원하여 검색할 수 있도록 합니다.

POST _snapshot/스냅샷레포지토리/스냅샷명/_restore
{
  "indices": "복원인덱스",
  "storage_type": "remote_snapshot",  
  "rename_pattern": "(.+)",
  "rename_replacement": "searchable_$1",
  "index_settings": {
      "index.number_of_replicas": 0
  }
}
  • indices : 스냅샷에 포함된 복원할 인덱스
  • storage_type : search node로 복원하기 위한 설정
  • rename_pattern : searchable snapshot으로 복원한 인덱스의 새로운 이름 규칙
  • rename_replacement : 복원한 인덱스의 이름을 재지정합니다.
  • index.number_of_replicas : 복원한 인덱스의 Replica shard 개수를 설정합니다.

인덱스를 복원하면 "saerchable_원래인덱스명" 형식으로 인덱스가 복원됩니다.

 

복원 결과 샤드 구성

일반적인 인덱스의 Shard 개수는 4개로 설정하였고 Replica Shard는 1개씩 구성하도록 설정하였습니다.

Searchable Snapshot으로 복원한 인덱스는 데이터를 넣을 수 없고 검색 기능만 가능하기 때문에 Replica shard가 불필요하다고 판단하여 저는 복원한 인덱스에는 Replica shard를 구성하지 않았습니다. Searchable Snapshot으로 복원하면 Search Node에만 샤드가 구성되며 복원 완료 시 검색이 가능합니다.

 

 

공식 Opensearch Document

https://opensearch.org/docs/latest/tuning-your-cluster/availability-and-recovery/snapshots/snapshot-restore/

 

Take and restore snapshots

Take and restore snapshots

opensearch.org

Opensearch의 Snapshot은 Opensearch Cluster의 데이터를 안정적으로 백업하고 복원하는 기능을 제공합니다. Snapshot은 인덱스 데이터, 설정, 매핑 및 기타 Opensearch 클러스터 상태 정보를 모두 포함할 수 있어 Cluster 운영에 안정성을 높일 수 있습니다.

 

Dockerfile로 이미지 생성

Opensearch에서는 AWS S3에 Snapshot 기능을 기본적으로 제공하고 있지 않습니다. 그렇기 때문에 Snapshot의 기능을 사용하기 전에 먼저 AWS S3 Plugin을 먼저 설치해야 합니다. Kubernets에서는 매번 재시작할 때마다 플러그인을 설치할 수 없으니 Dockerfile로 AWS S3 Plugin이 설치된 이미지를 생성하여 사용해야 합니다. 한글로 입력된 곳에 옳바른 값을 넣어주세요.

FROM opensearchproject/opensearch:2.8.0

ENV AWS_ACCESS_KEY_ID="에세스키"
ENV AWS_SECRET_ACCESS_KEY="시크릿키"

RUN /usr/share/opensearch/bin/opensearch-plugin install --batch repository-s3
RUN /usr/share/opensearch/bin/opensearch-keystore create

RUN echo $AWS_ACCESS_KEY_ID | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.access_key
RUN echo $AWS_SECRET_ACCESS_KEY | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.secret_key

 

저의 경우 Kubernetes환경에서 Opensearch를 사용하기 위해 Dockerfile을 이용하여 이미지를 만들어서 사용하였지만 만약 호스트 환경의 Opensearch인 경우 굳이 이미지를 만들지 않고 "bin/opensearch-plugin install --batch repository-s3" 명령어로 플러그인 설치를 하고 Opensearch를 재시작하시면 됩니다.

 

Snapshot Repository 생성

Snapshot을 생성하기 전에 먼저 Snapshot을 저장할 수 있는 Repository를 생성해야 합니다. 저는 my_repository라는 이름의 Snapshot Repository를 생성하였습니다. 한글로 입력된 곳에 옳바른 값을 넣어주세요.

PUT _snapshot/my_repository
{
  "type": "s3",
  "settings": {
    "bucket": "버킷",
    "base_path": "저장경로",
    "compress": true
  }
}

 

Snapshot Repository 확인

# Snapshot Repository의 정보
GET _snapshot/my_repository

# Snapshot Repository에 저장된 스냅샷 리스트 확인
GET _snapshot/my_repository/_all

 

Snapshot 백업

Snapshot Repository를 정상적으로 생성하였다면 해당 Repository를 이용하여 Snapshot을 생성할 수 있습니다. 저는 my_snapshot_1이라는 이름으로 스냅샷을 생성하였고 인덱스의 데이터만 스냅샷을 생성하도록 설정하였습니다. 데이터의 양이 많다면 스냅샷을 생성하는데 오랜 시간이 걸립니다. wait_for_completion=true 옵션을 설정하지 않으면 스냅샷이 생성이 완료되었는지 확인할 수 없습니다. 그래서 wait_for_completion=true 옵션을 통하여 스냅샷이 완전히 생성될 때까지 대기하여 정상적으로 생성되었는지 인지할 수 있습니다.

PUT _snapshot/my_repository/my_snapshot_1?wait_for_completion=true
{
  "indices": "*",
  "ignore_unavailable": true,
  "include_global_state": false,
  "partial": false
}
  • indices : 스냅샷 생성할 인덱스 리스트를 입력합니다. default *
  • ignore_unavailable : 유효하지 않는 것은 무시하는지 유무를 정합니다. default false 
  • include_global_state : global 설정 값은 저장하지 않는지 유무를 정합니다. default true
  • partial : 부분 스냅샷 저장을 허용할지 선택합니다. default는 false로 false일 경우 하나의 샤드가 문제가 발생하면 스냅샷이 실패합니다.

 

Snapshot 정보 확인

Snapshot을 생성하였다면 정확하게 생성되었는지 확인합니다. Response 마지막 shards를 보면 total로 총 스냅샷을 찍은 샤드의 개수가 나오고 successful로 스냅샷 생성에 성공한 샤드의 개수가 나옵니다. 그리고 failed를 통해 스냅샷 생성에 실패한 샤드의 개수를 확인할 수 있습니다. 종종 네트워크의 문제로 인해 노드끼리의 통신 문제로 실패한 샤드가 발생할 수도 있습니다.

GET _snapshot/my_repository/my_snapshot_1

## 결과
{
    "snapshots": [
        {
            "snapshot": "my_snapshot_1",
            "uuid": "aMA2T3ZoRliO0my6557-uw",
            "version_id": 136297827,
            "version": "2.8.0",
            "indices": [
                ".opendistro-job-scheduler-lock",
                ".opendistro-ism-config",
                ".opensearch-observability",
                "my-log-2023-07-10"
            ],
            "data_streams": [],
            "include_global_state": false,
            "state": "SUCCESS",
            "start_time": "2023-07-11T12:26:32.958Z",
            "start_time_in_millis": 1689078392958,
            "end_time": "2023-07-11T12:26:35.160Z",
            "end_time_in_millis": 1689078395160,
            "duration_in_millis": 2202,
            "failures": [],
            "shards": {
                "total": 7,
                "failed": 0,
                "successful": 7
            }
        }
    ]
}

 

Snapshot으로 복구

Snapshot으로 인덱스를 복구할 때 중요한 것은 같은 이름의 인덱스가 Cluster이 이미 존재해서는 안된다는 것입니다. 만약 같은 이름의 인덱스가 존재할 경우 인덱스를 삭제하거나 인덱스를 덤프를 생성하고 인덱스를 삭제하도록 합니다. 

# 먼저 실습할 인덱스를 삭제합니다. 예시로 my-log-2023-07-10 인덱스를 삭제합니다.
DELETE my-log-2023-07-10/

# 위에서 삭제한 인덱스를 스냅샷을 통해 복구합니다. 예시로 my-log-2023-07-10 인덱스를 복구합니다.
POST _snapshot/my_repository/my_snapshot_1/_restore
{
  "indices": "my-log-*",
  "ignore_unavailable": true,
  "include_global_state": false,
  "include_aliases": true,
  "partial": false
}

예시로 "my-log-2023-07-10" 인덱스를 삭제하고 위에서 생성한 스냅샷을 이용하여 "my-log-"로 시작하는 인덱스를 복구하였습니다.

 

마지막으로 Snapshot 및 Repository 삭제

이제 더 이상 사용하지 않는 오래된 Snapshot 및 Repository을 삭제합니다.

# 스냅샷을 삭제합니다.
DELETE _snapshot/my_repository/my_snapshot_1

# 스냅샷 Repository를 삭제합니다.
DELETE _snapshot/my_repository

 

Snapshot에 대해 더 자세한 내용은 Opensearch Document를 확인하여 주세요

https://opensearch.org/docs/latest/tuning-your-cluster/availability-and-recovery/snapshots/index/

 

Snapshots

Snapshots

opensearch.org

 

Opensearch SM(Snapshot Management)이란 Snapshot을 생성하고 일정 기간 유지시켜 주며 일정 기간이 지날 경우 자동으로 Snapshot을 삭제하여 Snapshot Repository를 관리해 주는 역할을 수행합니다. Opensearch SM을 통하여 매일 스냅샷을 생성하여 안정적인 클러스터 운영이 가능해집니다.

먼저 시작하기 전에 스냅샷을 생성하기 위해 Snapshot Repository가 생성되어 있어야 합니다. Snapshot Repository 생성에 대해서는 이 전 글을 확인하여 주세요.

https://stdhsw.tistory.com/entry/Opensearch-Snapshot-AWS-S3%EB%B0%B1%EC%97%85-%EB%B0%8F-%EB%B3%B5%EA%B5%AC

 

SM Policy 생성하기

SM Policy 생성을 통하여 매일 자동적으로 스냅샷이 생성되고 생성된지 오래된 스냅샷을 자동적으로 삭제할 수 있습니다. 

POST _plugins/_sm/policies/my-policy
{
  "description": "Daily opensearch snapshot",
  "creation": {
    "schedule": {
      "cron": {
        "expression": "0 1 * * *",
        "timezone": "UTC"
      }
    },
    "time_limit": "1h"
  },
  "deletion": {
    "schedule": {
      "cron": {
        "expression": "0 1 * * *",
        "timezone": "UTC"
      }
    },
    "condition": {
      "max_age": "7d",
      "max_count": 14,
      "min_count": 7
    },
    "time_limit": "1h"
  },
  "snapshot_config": {
    "date_format": "yyyy-MM-dd-HH:mm",
    "timezone": "UTC",
    "indices": "*",
    "repository": "my_repository",
    "ignore_unavailable": "true",
    "include_global_state": "false",
    "partial": "false",
    "storage_type": "remote_snapshot"
  }
}

 

creation에서는 스냅샷을 생성하는 정책을 정의합니다.

  • schedule.cron.expression : 매번 반복적으로 스냅샷을 생성할 시간을 설정합니다.
  • schedule.cron.timezone : 반복적으로 작업될 타임존을 설정합니다.
  • time_limit : 스냅샷을 생성하는데 최대 시간을 설정합니다. 스냅샷을 생성할 때 지정한 시간이 넘어가면 실패로 처리됩니다.

deletion에서는 스냅샷을 삭제하는 정책을 정의합니다.

  • schedule.cron.expression : 매번 반복적으로 스냅샷을 삭제할 시간을 설정합니다.
  • schedule.cron.timezone : 반복적으로 작업될 타임존을 설정합니다.
  • time_limit : 스냅샷을 삭제하는데 최대 시간을 설정합니다. 스냅샷을 삭제할 때 지정한 시간이 넘어 가면 실패로 처리됩니다.
  • condition.max_age : 생성된 스냅샷이 보존되는 시간을 설정합니다.
  • condition.max_count : 최대로 가지고 있을 수 있는 스냅샷의 개수를 설정합니다.
  • condition.min_count : 최소로 유지할 스냅샷의 개수를 설정합니다.

snapshot_config에서는 스냅샷을 생성할 때 설정 값을 정의합니다.

  • date_format : 생성된 스냅샷의 이름 format을 설정합니다. ("폴리스명-yyyy-MM-dd-HH:mm-해쉬값" 형식으로 스냅샷이 생성됩니다.)
  • timezone : date_format에서 사용되는 타임존을 설정합니다.
  • indices : 스냅샷을 생성할 인덱스 리스트를 설정합니다.
  • repository : 스냅샷을 저장할 Repository를 설정합니다.
  • ignore_unavailable : 유효하지 않은 값을 무시하는지 설정합니다.
  • include_global_state : Cluster 상태 값을 포함할 것인지 설정합니다.
  • partial : 부분 스냅샷 저장을 허용할지 선택합니다. default는 false로 false일 경우 하나의 샤드가 문제가 발생하면 스냅샷이 실패합니다.
  • storage_type : searchable snapshot을 적용할 경우 remote_snapshot를 설정하고 아닐 경우 local로 설정합니다.

 

SM Policy 확인하기

SM Policy를 정상적으로 생성되었는지 확인합니다.

GET _plugins/_sm/policies/my-policy/_explain

 

 

SM Policy Start & Stop

자동적으로 스냅샷을 관리하는 기능을 잠시 중단하는 기능을 제공하고 있습니다.

# SM Policy 중지
POST _plugins/_sm/policies/my-policy/_stop

# SM Policy 시작
POST _plugins/_sm/policies/my-policy/_start

 

SM Policy 삭제

더 이상 사용되지 않는 SM Policy가 있다면 삭제합니다.

DELETE _plugins/_sm/policies/my-policy

 

 

스냅샷을 통한 데이터 복구는 이전 글을 확인하여 주세요.

https://stdhsw.tistory.com/entry/Opensearch-Snapshot-AWS-S3%EB%B0%B1%EC%97%85-%EB%B0%8F-%EB%B3%B5%EA%B5%AC

 

+ Recent posts