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

 

+ Recent posts