Take and restore snapshots
출처: 문서
본문
스냅샷 생성 및 복원
스냅샷은 즉시 완료되지 않아요. 완료하는 데 시간이 걸리며 클러스터의 완벽한 특정 시점 뷰를 나타내지 않아요. 스냅샷이 진행 중인 동안에도 문서를 인덱싱하고 클러스터에 다른 요청을 보낼 수 있지만, 새 문서와 기존 문서 업데이트는 일반적으로 스냅샷에 포함되지 않아요. 스냅샷에는 OpenSearch가 스냅샷을 시작할 당시 존재했던 기본 샤드가 포함돼요. 스냅샷 스레드 풀의 크기에 따라 서로 다른 샤드가 약간 다른 시간에 스냅샷에 포함될 수 있어요.
샤드를 스냅샷하기 전에 OpenSearch는 샤드를 플러시한 다음 결과 Lucene 커밋의 파일을 복사해요. 따라서 샤드의 스냅샷에는 플러시 전에 해당 샤드에 인덱싱된 모든 작업이 포함되며, 아직 새로고침되지 않아 검색할 수 없는 문서도 포함돼요.
OpenSearch 스냅샷은 증분식이에요. 즉, 마지막 성공적인 스냅샷 이후 변경된 데이터만 저장해요. 자주 스냅샷을 생성하는 경우와 드물게 생성하는 경우의 디스크 사용량 차이는 대개 미미해요.
즉, 일주일 동안 매시간 스냅샷을 생성하는 경우(총 168개 스냅샷) 주말에 단일 스냅샷을 생성하는 것보다 디스크 공간을 훨씬 더 많이 사용하지 않을 수 있어요. 또한 스냅샷을 더 자주 생성할수록 완료 시간이 더 짧아져요. 일부 OpenSearch 사용자는 30분마다 스냅샷을 생성하기도 해요.
스냅샷을 삭제해야 하는 경우 스토리지 위치로 이동하여 파일을 제거하는 대신 OpenSearch API를 사용해야 해요. 클러스터의 증분 스냅샷은 동일한 데이터를 많이 공유하는 경우가 많아요. API를 사용하면 OpenSearch는 다른 스냅샷이 사용하지 않는 데이터만 제거해요. {: .tip }
노드의 데이터 디렉터리를 복사하여 클러스터를 백업하지 마세요. 데이터 디렉터리 복사본은 일관된 백업이 아니며, 이러한 복사본에서 복원하면 실패하거나 데이터가 조용히 손실될 수 있어요. 스냅샷은 클러스터를 백업하는 유일한 신뢰할 수 있는 방법이에요. {: .warning }
일정에 따라 스냅샷을 생성하고 오래된 스냅샷을 자동으로 삭제하려면 스냅샷 관리를 사용해요.
목차
{: .text-delta } - TOC {:toc}저장소 등록
스냅샷을 생성하려면 먼저 스냅샷 저장소를 '등록'해야 해요. 스냅샷 저장소는 단순한 스토리지 위치로, 공유 파일 시스템, Amazon Simple Storage Service(Amazon S3), Hadoop Distributed File System(HDFS) 또는 Azure Storage예요.
노드 수준 저장소 설정
다음 노드 수준 설정은 각 유형의 모든 저장소에 대해 전역적으로 저장소 동작을 제어해요. 이 설정은 opensearch.yml에서 구성하며, 수정하려면 클러스터를 다시 시작해야 해요.
파일 시스템 저장소 설정
repositories.fs.chunk_size(Static, byte unit): 대형 blob 저장 시 파일 시스템 저장소의 기본 청크 크기를 설정해요. 이 설정은 대형 blob 파일을 저장할 때 더 작은 청크로 분할하는 방식을 결정해요. 청크 크기가 클수록 순차 접근 성능이 향상될 수 있지만 메모리 사용량과 네트워크 전송 오버헤드가 증가할 수 있어요. 이 설정은 저장소 설정에서 청크 크기가 명시적으로 지정되지 않은 경우 대체값으로 사용돼요. 기본값은 제한 없음(청크 분할 안 함)이며, 최소값은5바이트예요.
URL 저장소 설정
-
repositories.url.allowed_urls(Static, list): URL 저장소 접근에 허용되는 URL 패턴 목록을 지정해요. 이 보안 설정은 URL 저장소를 생성할 때 사용할 수 있는 URL을 제한하여, 승인되지 않거나 내부 네트워크 리소스에 대한 접근을 방지해요. URL 패턴은 와일드카드를 지원해요(예:http://snapshot.example.com/*). 비어 있는 경우(기본값)path.repo가 구성되지 않으면 URL 저장소가 허용되지 않아요. 이 설정은 서버 측 요청 위조(SSRF) 공격을 방지하는 데 도움을 줘요. 기본값은[](빈 목록)이에요. -
repositories.url.supported_protocols(Static, list): URL 저장소에 지원되는 URL 프로토콜을 정의해요. 이 설정은 URL 저장소에 접근할 때 사용할 수 있는 프로토콜 스키마(예: HTTP, HTTPS, FTP)를 제어해요. 지원되는 프로토콜을 제한하면 잠재적으로 안전하지 않거나 의도하지 않은 프로토콜을 통한 접근을 방지하여 보안을 강화할 수 있어요. 기본값은["http", "https", "ftp", "file", "jar"]예요.
공유 파일 시스템
-
공유 파일 시스템을 스냅샷 저장소로 사용하려면
opensearch.yml에 추가해요:path.repo: ["/mnt/snapshots"]파일 시스템은 모든 클러스터 관리자 노드와 데이터 노드에 동일한 경로로 마운트되어야 해요. RPM 및 Debian 설치에서는 파일 시스템을 마운트하면 돼요. Docker 설치를 사용하는 경우 클러스터를 시작하기 전에
docker-compose.yml의 각 노드에 파일 시스템을 추가해요:volumes: - /Users/jdoe/snapshots:/mnt/snapshots -
그런 다음 REST API를 사용하여 저장소를 등록해요:
PUT /_snapshot/my-fs-repository { "type": "fs", "settings": { "location": "/mnt/snapshots" } }
{% include copy-curl.html %}
location이 상대 경로인 경우 OpenSearch는 첫 번째 path.repo 디렉터리를 기준으로 경로를 확인해요. 예를 들어 path.repo: ["/mnt/snapshots"]인 경우 my-backups 위치는 /mnt/snapshots/my-backups로 확인돼요.
대부분 location 외에는 어떤 매개변수도 지정할 필요가 없어요. 허용된 요청 매개변수는 Create or Update Snapshot Repository API를 참조해요.
URL 저장소
URL 저장소는 URL에 저장된 스냅샷에 대한 읽기 전용 액세스를 제공해요. 예를 들어 다른 클러스터가 쓰는 공유 파일 시스템 저장소 같은 경우에 사용해요. 다음 요청은 공유 파일 시스템 위치에 대한 URL 저장소를 등록해요. file: URL은 path.repo에 나열된 위치를 가리켜야 해요:
PUT /_snapshot/my-url-repository
{
"type": "url",
"settings": {
"url": "file:/mnt/snapshots"
}
}
{% include copy-curl.html %}
URL 저장소에서 스냅샷을 나열하고 복원할 수 있지만, 스냅샷을 생성할 수는 없어요.
Amazon S3
-
Amazon S3 버킷을 스냅샷 저장소로 사용하려면 모든 노드에
repository-s3플러그인을 설치해요:sudo ./bin/opensearch-plugin install repository-s3Docker 설치를 사용하는 경우 Working with plugins를 참조해요.
Dockerfile은 다음과 비슷해야 해요:FROM opensearchproject/opensearch:{{site.opensearch_version}} ENV AWS_ACCESS_KEY_ID <access-key> ENV AWS_SECRET_ACCESS_KEY <secret-key> # Optional ENV AWS_SESSION_TOKEN <optional-session-token> 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 # Optional RUN echo $AWS_SESSION_TOKEN | /usr/share/opensearch/bin/opensearch-keystore add --stdin s3.client.default.session_tokenDocker 클러스터가 시작된 후에는 7단계로 건너뛰어요.
AWS EC2 인스턴스의 OpenSearch 노드가 AWS S3 버킷에 대한 액세스 권한을 부여할 때 정책에 대한 역할을 상속받도록 AWS IAM 인스턴스 프로파일을 사용하는 경우 8단계로 건너뛰어요.
-
AWS 액세스 키와 시크릿 키를 OpenSearch 키스토어에 추가해요:
sudo ./bin/opensearch-keystore add s3.client.default.access_key sudo ./bin/opensearch-keystore add s3.client.default.secret_key -
(선택 사항) 사용자 지정 S3 엔드포인트(예: MinIO)를 사용하는 경우 Amazon EC2 메타데이터 연결을 비활성화해요:
export AWS_EC2_METADATA_DISABLED=trueHelm을 사용하여 OpenSearch를 설치하는 경우 values 파일에서 다음 설정을 업데이트해요:
extraEnvs: - name: AWS_EC2_METADATA_DISABLED value: "true" -
(선택 사항) 임시 자격 증명을 사용하는 경우 세션 토큰을 추가해요:
sudo ./bin/opensearch-keystore add s3.client.default.session_token -
(선택 사항) 프록시를 통해 인터넷에 연결하는 경우 해당 자격 증명을 추가해요:
sudo ./bin/opensearch-keystore add s3.client.default.proxy.username sudo ./bin/opensearch-keystore add s3.client.default.proxy.password -
(선택 사항)
opensearch.yml에 다른 설정을 추가해요:s3.client.default.endpoint: s3.amazonaws.com # S3 has alternate endpoints, but you probably don't need to change this value. s3.client.default.max_retries: 3 # number of retries if a request fails s3.client.default.path_style_access: false # whether to use the deprecated path-style bucket URLs. # You probably don't need to change this value, but for more information, see https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html#path-style-access. s3.client.default.protocol: https # http or https s3.client.default.proxy.host: my-proxy-host # the hostname for your proxy server s3.client.default.proxy.port: 8080 # port for your proxy server s3.client.default.read_timeout: 50s # the S3 connection timeout s3.client.default.use_throttle_retries: true # whether the client should wait a progressively longer amount of time (exponential backoff) between each successive retry s3.client.default.region: us-east-2 # AWS region to use. For non-AWS S3 storage, this value is required but has no effect. -
(선택 사항) AWS 액세스 키와 시크릿 키를 사용하지 않으려면 S3 플러그인이 서비스 계정에 대해 AWS Identity and Access Management(IAM) 역할을 사용하도록 구성할 수 있어요:
sudo ./bin/opensearch-keystore add s3.client.default.role_arn sudo ./bin/opensearch-keystore add s3.client.default.role_session_nameAWS 액세스 키와 시크릿 키를 구성하지 않으려면 다음
opensearch.yml설정을 수정해요.repository-s3플러그인이 파일에 액세스할 수 있는지 확인해요:s3.client.default.identity_token_file: /usr/share/opensearch/plugins/repository-s3/token복사가 어려운 경우
${OPENSEARCH_PATH_CONFIG}폴더에 웹 ID 토큰 파일에 대한 심볼릭 링크를 생성할 수 있어요:ln -s $AWS_WEB_IDENTITY_TOKEN_FILE "${OPENSEARCH_PATH_CONFIG}/aws-web-identity-token-file"다음
opensearch.yml설정에서${OPENSEARCH_PATH_CONFIG}를 기준으로 확인되는 상대 경로를 지정하여 웹 ID 토큰 파일을 참조할 수 있어요:s3.client.default.identity_token_file: aws-web-identity-token-fileIAM 역할은 위 설정 중 하나 이상이 필요해요. 다른 설정은 환경 변수(사용 가능한 경우)에서 가져와요:
AWS_ROLE_ARN,AWS_WEB_IDENTITY_TOKEN_FILE,AWS_ROLE_SESSION_NAME. -
opensearch.yml을 변경한 경우 클러스터의 각 노드를 다시 시작해야 해요. 그렇지 않은 경우 보안 클러스터 설정만 다시 로드하면 돼요:POST /_nodes/reload_secure_settings
{% include copy-curl.html %}
-
S3 버킷이 아직 없으면 생성해요. 스냅샷을 생성하려면 버킷에 액세스할 수 있는 권한이 필요해요. 다음 IAM 정책은 이러한 권한의 예시예요:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetBucketLocation", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListBucketVersions" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::your-bucket" ] }, { "Action": [ "s3:AbortMultipartUpload", "s3:DeleteObject", "s3:GetObject", "s3:ListMultipartUploadParts", "s3:PutObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::your-bucket/*" ] } ] } -
REST API를 사용하여 저장소를 등록해요:
PUT /_snapshot/my-s3-repository { "type": "s3", "settings": { "bucket": "my-s3-bucket", "base_path": "my/snapshot/directory" } }{% include copy-curl.html %}
대부분 bucket과 base_path 외에는 어떤 매개변수도 지정할 필요가 없어요. 허용된 요청 매개변수는 Create or Update Snapshot Repository API를 참조해요.
HDFS
Hadoop Distributed File System(HDFS)을 스냅샷 저장소로 사용하려면 다음 단계를 따라요:
-
스냅샷용 HDFS 디렉터리(예:
/opensearch/repositories/searchable_snapshots)를 생성하고 OpenSearch 사용자에게 읽기 및 쓰기 권한이 있는지 확인해요. -
모든 노드에
repository-hdfs플러그인을 설치해요:sudo ./bin/opensearch-plugin install repository-hdfsDocker 설치를 사용하는 경우 Working with plugins를 참조해요.
Dockerfile은 다음과 비슷해야 해요:FROM opensearchproject/opensearch:{{site.opensearch_version}} RUN /usr/share/opensearch/bin/opensearch-plugin install --batch repository-hdfs -
(선택 사항) HDFS 클러스터가 Kerberos를 사용하는 경우 keytab 파일을 모든 노드에 배포하고 OpenSearch 사용자에게 읽기 액세스 권한이 있는지 확인해야 할 수도 있어요.
-
OpenSearch 클러스터의 모든 노드를 다시 시작해요.
-
OpenSearch 스냅샷 API를 사용하여 저장소를 등록해요:
HDFS 인증 없음:
PUT _snapshot/searchable_snapshots { "type": "hdfs", "settings": { "uri": "hdfs://namenode:8020/", "path": "/opensearch/repositories/searchable_snapshots", "conf.<key>": "<value>" } }{% include copy-curl.html %}
HDFS 인증 사용:
PUT _snapshot/searchable_snapshots { "type": "hdfs", "settings": { "uri": "hdfs://namenode:8020/", "path": "/opensearch/repositories/searchable_snapshots", "security.principal": "opensearch@YOURREALM", "conf.<key>": "<value>" } }{% include copy-curl.html %}
Helm을 사용하여 Microsoft Azure 스토리지 계정 등록
Helm을 사용하여 배포된 OpenSearch 클러스터에 Azure 스토리지 계정을 기반으로 하는 스냅샷 저장소를 등록하려면 다음 단계를 따라요.
-
Azure 스토리지 계정을 생성해요. 그런 다음 스토리지 계정 내에 컨테이너를 생성해요. 자세한 내용은 Introduction to Azure Storage를 참조해요.
-
bash 스크립트를 사용하여 OpenSearch 키스토어 파일을 생성해요. bash 스크립트를 생성하려면 다음 예제의 내용을
create-keystore.sh파일에 복사해요:#!/bin/bash /usr/share/opensearch/bin/opensearch-keystore create echo $AZURE_SNAPSHOT_STORAGE_ACCOUNT | /usr/share/opensearch/bin/opensearch-keystore add --stdin azure.client.default.account echo $AZURE_SNAPSHOT_STORAGE_ACCOUNT_KEY | /usr/share/opensearch/bin/opensearch-keystore add --stdin azure.client.default.key cp /usr/share/opensearch/config/opensearch.keystore /tmp/keystore/opensearch.keystore -
Docker 파일을 생성해요. 이 파일에는 키스토어, OpenSearch 인스턴스 및 Azure 저장소에 대한 세부 정보가 포함되어 있어요. 파일을 생성하려면 다음 예제를 복사하여
Dockerfile로 저장해요:FROM opensearchproject/opensearch:{{site.opensearch_version}} RUN /usr/share/opensearch/bin/opensearch-plugin install --batch repository-azure COPY --chmod=0775 create-keystore.sh create-keystore.sh -
다음
docker build명령을 사용하여 Dockerfile에서 OpenSearch 이미지를 빌드해요:docker build -t opensearch-custom:{{site.opensearch_version}} -f Dockerfile . -
다음 매니페스트와 명령을 사용하여 Azure 스토리지 계정 키가 포함된 Kubernetes 시크릿을 생성해요:
apiVersion: v1 kind: Secret metadata: name: opensearch data: azure-snapshot-storage-account-key: ### Insert base64 encoded key -
다음 추가 값과 함께 Helm을 사용하여 OpenSearch 배포를 진행해요.
AZURE_SNAPSHOT_STORAGE_ACCOUNT환경 변수에 스토리지 계정 값을 지정해요:extraInitContainers: - name: keystore-generator image: opensearch-custom:{{site.opensearch_version}} command: ["/bin/bash", "-c"] args: ["bash create-keystore.sh"] env: - name: AZURE_SNAPSHOT_STORAGE_ACCOUNT value: ### Insert storage account name - name: AZURE_SNAPSHOT_STORAGE_ACCOUNT_KEY valueFrom: secretKeyRef: name: opensearch key: azure-snapshot-storage-account-key volumeMounts: - name: keystore mountPath: /tmp/keystore extraVolumeMounts: - name: keystore mountPath: /usr/share/opensearch/config/opensearch.keystore subPath: opensearch.keystore extraVolumes: - name: keystore emptyDir: {} image: repository: "opensearch-custom" tag: {{site.opensearch_version}} -
스냅샷 API를 사용하여 저장소를 등록해요. 다음 명령과 같이
snapshot_container를 1단계에서 지정한 이름으로 바꿔요:PUT /_snapshot/my-azure-snapshot { "type": "azure", "settings": { "client": "default", "container": "snapshot_container" } }
Microsoft Azure Blob Storage 설정
Azure Blob Storage를 스냅샷 저장소로 사용하려면 다음 단계를 따라요:
-
다음 명령으로 모든 노드에
repository-azure플러그인을 설치해요:./bin/opensearch-plugin install repository-azure -
repository-azure플러그인이 설치된 후 노드를 초기화하기 전에 Azure Blob Storage 설정을 정의해요. 먼저 다음 보안 설정을 사용하여 Azure Storage 계정 이름을 정의해요:./bin/opensearch-keystore add azure.client.default.account
Azure Blob Storage 인증 자격 증명을 설정하려면 다음 옵션 중 하나를 선택해요.
Azure Blob Storage 계정 키 사용
다음 설정을 사용하여 Azure Storage 계정 키를 지정해요:
./bin/opensearch-keystore add azure.client.default.key
공유 액세스 서명(SAS)
공유 액세스 서명(SAS)으로 Azure에 액세스할 때 다음 설정을 사용해요:
./bin/opensearch-keystore add azure.client.default.sas_token
Azure 토큰 자격 증명
opensearch.yml에서 토큰 자격 증명 인증 흐름을 구성할 수 있어요. 이 방법은 SAS 또는 계정 키가 필요한 연결 문자열 인증과는 달라요.
토큰 자격 증명 인증을 사용하려면 토큰 자격 증명 유형을 선택해야 해요. Azure는 여러 토큰 자격 증명 유형을 제공하지만 관리 ID만 지원돼요.
관리 ID를 사용하려면 managed 또는 managed_identity 값을 사용하여 토큰 자격 증명 유형을 opensearch.yml에 추가해요. 이는 관리 ID를 사용하여 토큰 자격 증명 인증을 수행하고 있음을 나타내요:
azure.client.default.token_credential_type: "managed_identity"
Azure 토큰 자격 증명 사용 시 다음 사항에 유의해요:
- 토큰 자격 증명 지원은 기본적으로
opensearch.yml에서 비활성화되어 있어요. - 여러 옵션이 구성된 경우 토큰 자격 증명이 Azure Storage 계정 키 또는 SAS보다 우선해요.
클러스터 간 저장소 공유
동일한 저장소를 둘 이상의 클러스터에 등록할 수 있어요. 예를 들어 프로덕션 클러스터에서 테스트 클러스터로 스냅샷을 복원하는 경우에 사용해요. 하나의 클러스터만 저장소에 써야 해요. 다른 모든 클러스터에서는 readonly 설정을 true로 설정하여 저장소를 등록해요. 읽기 전용 저장소는 스냅샷을 나열하고 복원할 수 있지만 생성할 수는 없어요. 둘 이상의 클러스터가 동일한 저장소에 쓰면 저장소 내용이 손상될 수 있어요:
PUT /_snapshot/my-fs-repository
{
"type": "fs",
"settings": {
"location": "/mnt/snapshots",
"readonly": true
}
}
{% include copy-curl.html %}
스냅샷 형식은 주요 버전 간에 변경될 수 있으므로 OpenSearch의 각 주요 버전에 대해 별도의 저장소를 사용하는 것이 좋아요.
저장소 유지 관리
다음 API를 사용하여 스냅샷 저장소를 유지 관리해요:
- Verify Snapshot Repository API: 모든 노드가 저장소에 액세스할 수 있는지 확인해요. OpenSearch는 저장소를 등록할 때 확인을 수행해요. 이 확인을 건너뛰려면 등록 요청에
?verify=false를 추가하고 나중에POST /_snapshot/<repository>/_verify를 사용하여 저장소를 확인해요. - Cleanup Snapshot Repository API: 더 이상 스냅샷에서 참조되지 않는 데이터(예: 실패한 스냅샷 작업으로 남은 데이터)를 제거해요.
- Delete Snapshot Repository API: 클러스터에서 저장소 등록을 제거해요. 저장소의 스냅샷은 삭제되지 않아요. 다시 사용하려면 저장소를 다시 등록해요.
스냅샷 생성하기
스냅샷을 생성할 때 두 가지 정보를 지정해요:
- 스냅샷 저장소 이름
- 스냅샷 이름
다음 스냅샷은 모든 인덱스와 클러스터 상태를 포함해요:
PUT /_snapshot/my-repository/snapshot-1
{% include copy-curl.html %}
요청 본문을 추가하여 특정 인덱스를 포함하거나 제외하거나 다른 설정을 지정할 수도 있어요. metadata 객체는 스냅샷과 함께 누가, 왜 생성했는지 같은 사용자 지정 정보를 저장해요:
PUT /_snapshot/my-repository/snapshot-2
{
"indices": "opensearch_dashboards*,my-index*,-my-index-2016",
"ignore_unavailable": true,
"include_global_state": false,
"partial": false,
"metadata": {
"taken_by": "ops-team",
"reason": "Backup before upgrading to 3.9"
}
}
{% include copy-curl.html %}
자세한 내용은 Create Snapshot API를 참조하세요.
스냅샷 이름에 날짜를 포함하려면 이름에 date math를 사용하고 URL 인코딩을 해요. 예를 들어, 다음 요청은 nightly- 뒤에 현재 날짜가 붙은 nightly-2026.10.12 같은 스냅샷을 생성해요. 인코딩되지 않은 이름은 <nightly-{now/d}>예요:
PUT /_snapshot/my-repository/%3Cnightly-%7Bnow%2Fd%7D%3E
{% include copy-curl.html %}
스냅샷을 시작한 직후에 확인하려면 다음 요청을 보내요:
GET /_snapshot/my-repository/snapshot-2
{% include copy-curl.html %}
응답은 스냅샷이 아직 진행 중임을 보여줘요:
{
"snapshots": [{
"snapshot": "snapshot-2",
"indices": [
"opensearch_dashboards_sample_data_ecommerce",
"my-index",
"opensearch_dashboards_sample_data_logs",
"opensearch_dashboards_sample_data_flights"
],
"include_global_state": false,
"state": "IN_PROGRESS",
...
}]
}
자세한 내용은 Get Snapshot API를 참조하세요.
계속 진행하기 전에 스냅샷이 완료될 때까지 기다리려면 요청에 wait_for_completion 매개변수를 추가해요. 스냅샷은 완료하는 데 시간이 걸릴 수 있으므로 이 옵션이 사용 사례에 적합한지 고려해 보세요:
PUT _snapshot/my-repository/snapshot-3?wait_for_completion=true
{% include copy-curl.html %}
스냅샷에는 다음과 같은 상태가 있어요:
| 상태 | 설명 |
|---|---|
| SUCCESS | 스냅샷이 모든 샤드를 성공적으로 저장했어요. |
IN_PROGRESS |
스냅샷이 현재 실행 중이에요. |
| PARTIAL | 하나 이상의 샤드가 저장에 실패했어요. 스냅샷을 생성할 때 partial을 true로 설정한 경우에만 발생할 수 있어요. |
| FAILED | 스냅샷에 오류가 발생하여 데이터를 저장하지 못했어요. |
| INCOMPATIBLE | 스냅샷이 이 클러스터에서 실행 중인 OpenSearch 버전과 호환되지 않아요. 충돌 및 호환성을 참조하세요. |
실행 중인 모든 스냅샷의 상태를 확인하려면 다음 요청을 보내요:
GET /_snapshot/_status
{% include copy-curl.html %}
특정 스냅샷의 각 샤드 진행 상황을 보려면 저장소와 스냅샷 이름을 포함해요. 이 요청은 스냅샷이 완료된 경우에도 상세 정보를 반환해요:
GET /_snapshot/my-repository/snapshot-2/_status
{% include copy-curl.html %}
자세한 내용은 Get Snapshot Status API를 참조하세요. 스냅샷이 실행 중인 동안 Get Snapshot API는 스냅샷 작업과 동일한 스레드 풀을 사용하기 때문에 응답이 느릴 수 있으므로 Get Snapshot Status API를 사용하여 진행 상황을 모니터링하세요.
샤드가 스냅샷에 포함되는 동안에는 다른 노드로 재배치될 수 없어요. 결과적으로 실행 중인 스냅샷은 샤드 리밸런싱과 샤드 할당 필터링 효과를 지연시킬 수 있어요. {: .note}
글로벌 클러스터 상태
include_global_state가 true(스냅샷 생성 시 기본값)인 경우 스냅샷은 글로벌 클러스터 상태를 저장해요. 글로벌 상태에는 다음과 같은 클러스터 메타데이터가 포함돼요:
- 영구 클러스터 설정. 일시적인 클러스터 설정은 포함되지 않아요.
- 인덱스 템플릿, 구성 가능한 인덱스 템플릿 및 컴포넌트 템플릿.
- 수집 파이프라인 및 검색 파이프라인.
- 저장된 스크립트.
- 영구 작업. 플러그인은 노드 재시작 후에도 계속되어야 하는 장기 실행 작업(예: 교차 클러스터 복제 작업)에 영구 작업을 사용해요.
글로벌 상태에는 스냅샷 저장소 등록이 포함되지 않아요. 데이터 스트림 정의는 include_global_state 값에 관계없이 스냅샷에 포함된 데이터 스트림에 대해 저장돼요.
글로벌 상태에는 인덱스가 포함되지 않아요. indices 매개변수는 스냅샷에 포함할 인덱스를 결정하며, 시스템 및 숨김 인덱스는 다른 인덱스와 동일하게 취급돼요. indices를 생략하면 스냅샷은 시스템 및 숨김 인덱스를 포함한 모든 열린 인덱스를 포함해요. .opendistro-ism-config 인덱스의 ISM(Index State Management) 정책과 같이 시스템 인덱스에 저장된 플러그인 구성은 해당 인덱스가 스냅샷에 포함된 경우에만 백업돼요.
스냅샷 복원하기
스냅샷을 복원하는 첫 번째 단계는 기존 스냅샷을 검색하는 거예요. 모든 스냅샷 저장소를 보려면 다음 요청을 보내요:
GET /_snapshot/_all
{% include copy-curl.html %}
저장소의 모든 스냅샷을 보려면 다음 요청을 보내요:
GET /_snapshot/my-repository/_all
{% include copy-curl.html %}
그런 다음 스냅샷을 복원하려면 다음 요청을 보내요:
POST /_snapshot/my-repository/snapshot-2/_restore
{% include copy-curl.html %}
스냅샷을 생성할 때와 마찬가지로 요청 본문을 추가하여 특정 인덱스를 포함하거나 제외하거나 다른 설정을 지정할 수 있어요:
POST /_snapshot/my-repository/snapshot-2/_restore
{
"indices": "opensearch_dashboards*,my-index*",
"ignore_unavailable": true,
"include_global_state": false,
"include_aliases": false,
"partial": false,
"rename_pattern": "opensearch_dashboards(.+)",
"rename_replacement": "restored_opensearch_dashboards$1",
"index_settings": {
"index.blocks.read_only": false
},
"ignore_index_settings": [
"index.refresh_interval"
]
}
{% include copy-curl.html %}
자세한 내용은 Restore Snapshot API를 참조하세요.
스냅샷을 복원할 때 include_global_state의 기본값은 false예요. true로 설정하면 OpenSearch는 스냅샷에 저장된 글로벌 클러스터 상태(영구 클러스터 설정, 구성 가능 및 컴포넌트 인덱스 템플릿, 수집 및 검색 파이프라인, 저장된 스크립트, 영구 작업 포함)를 복원해요. 복원된 메타데이터는 클러스터의 해당 메타데이터를 대체해요. 예를 들어, 클러스터에는 있지만 스냅샷에는 없는 영구 작업은 제거되고, 스냅샷의 인덱스 템플릿은 동일한 이름의 기존 템플릿을 덮어써요. 일시적인 클러스터 설정과 등록된 스냅샷 저장소는 스냅샷에 포함되지 않으며 복원되지 않아요. 글로벌 상태에 포함된 메타데이터 목록은 글로벌 클러스터 상태를 참조하세요.
복원 작업 모니터링하기
인덱스의 기본 샤드가 복원되는 동안 인덱스 상태는 yellow이고 활성 기본 샤드가 없어요. 기본 샤드가 복원되면 OpenSearch가 복제본 샤드를 할당하고, 모든 복제본이 할당되면 인덱스 상태가 green이 돼요. 복원 진행 상황을 모니터링하려면 CAT Recovery API 또는 Index Recovery API를 사용해요. 스냅샷에서 복원되는 샤드의 복구 유형은 snapshot이에요.
원격 백업 클러스터 간 스냅샷 복원하기
원격 백업 스토리지를 사용하는 경우 OpenSearch는 인덱스 세그먼트와 트랜스로그를 자동으로 원격 저장소(일반적으로 Amazon S3)에 백업해요. 둘 다 원격 백업 스토리지를 사용하고 서로 다른 원격 저장소 저장소를 사용하는 클러스터 간에 스냅샷을 복원하는 경우 소스 클러스터의 원격 저장소 저장소를 지정해야 해요.
이 절차는 원격 백업 스토리지가 활성화된 클러스터에만 적용돼요. 원격 백업 스토리지가 없는 표준 OpenSearch 클러스터의 경우 이러한 추가 매개변수 없이 표준 스냅샷 복원 프로세스를 사용해요. {: .note}
다음 절차는 클러스터 A에서 클러스터 B로 스냅샷을 복원하며, 두 클러스터 모두 서로 다른 Amazon S3 저장소를 사용하는 원격 백업 스토리지를 사용해요.
사전 요구 사항
시작하기 전에 다음 사전 요구 사항을 충족했는지 확인하세요:
- 두 클러스터가 동일한 OpenSearch 버전을 실행 중이어야 해요.
- 소스 클러스터의 원격 저장소 구성에서 Amazon S3 버킷 이름, 기본 경로, AWS KMS(Key Management Service) 키 ARN(Amazon Resource Name) 및 도메인 ARN을 확보했어야 해요.
단계
소스 클러스터에서 대상 클러스터로 스냅샷을 복원하려면 다음 단계를 완료하세요:
-
소스 클러스터의 스냅샷 저장소를 대상 클러스터에서 읽기 전용으로 등록해요:
PUT /_snapshot/source-cluster-snapshots { "type": "s3", "settings": { "bucket": "source-snapshot-bucket", "base_path": "snapshots", "region": "us-east-1", "readonly": true } }{% include copy-curl.html %}
-
소스 클러스터의 원격 세그먼트 저장소를 대상 클러스터에서 읽기 전용으로 등록해요:
PUT /_snapshot/source-remote-segment-repo { "type": "s3", "settings": { "bucket": "source-segment-bucket", "base_path": "remote-store/segments", "region": "us-east-1", "amazon_es_kms_enc_ctx": "domainARN=arn:aws:es:us-east-1:123456789012:domain/source-cluster", "amazon_es_kms_key_arn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-56ef-78gh-90ij-klmnopqrstuv", "amazon_es_encryption": "true", "remote_store_index_shallow_copy": "true", "readonly": true } }{% include copy-curl.html %}
-
소스 클러스터의 원격 트랜스로그 저장소를 대상 클러스터에서 읽기 전용으로 등록해요:
PUT /_snapshot/source-remote-translog-repo { "type": "s3", "settings": { "bucket": "source-translog-bucket", "base_path": "remote-store/translogs", "region": "us-east-1", "amazon_es_kms_enc_ctx": "domainARN=arn:aws:es:us-east-1:123456789012:domain/source-cluster", "amazon_es_kms_key_arn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-56ef-78gh-90ij-klmnopqrstuv", "amazon_es_encryption": "true", "remote_store_index_shallow_copy": "true", "readonly": true } }{% include copy-curl.html %}
-
소스 스냅샷 저장소에서 스냅샷을 나열할 수 있는지 확인해요:
GET /_snapshot/source-cluster-snapshots/_all{% include copy-curl.html %}
-
소스 세그먼트 및 트랜스로그 저장소를 모두 지정하여 스냅샷을 복원해요:
POST /_snapshot/source-cluster-snapshots/snapshot-1/_restore { "indices": "my-index", "source_remote_store_repository": "source-remote-segment-repo", "source_remote_translog_repository": "source-remote-translog-repo" }{% include copy-curl.html %}
대상 클러스터는 스냅샷 저장소에서 인덱스를 복원하고 복원된 인덱스가 소스 클러스터의 원격 저장소 저장소에서 원격 세그먼트와 트랜스로그를 읽도록 구성해요.
복원 중에 인덱스 이름 충돌이 발생하면 rename_pattern 및 rename_replacement 매개변수를 사용하여 인덱스 이름을 바꾸거나 충돌하는 인덱스를 복원 전에 삭제해요.
{: .tip}
다른 클러스터로 스냅샷 복원하기
스냅샷은 생성한 클러스터에 종속되지 않아요. 다른 클러스터로 스냅샷을 복원하려면 해당 클러스터에서 스냅샷 저장소를 읽기 전용으로 등록한 다음 평소처럼 스냅샷을 복원해요. 자세한 내용은 클러스터 간 저장소 공유를 참조하세요. 대상 클러스터는 소스 클러스터와 크기나 토폴로지가 다를 수 있어요. 다음 사항을 염두에 두세요:
- 대상 클러스터가 더 작은 경우 복원된 인덱스를 저장할 충분한 스토리지가 있는지 확인해요. 필요한 용량을 줄이려면
indices매개변수를 사용하여 일부 인덱스만 복원하거나index_settings매개변수를 사용하여 복제본 수를 줄여요(예:"index_settings": {"index.number_of_replicas": 0}). index.routing.allocation.require.*와 같은 샤드 할당 필터링 설정은 각 인덱스와 함께 복원돼요. 대상 클러스터의 노드가 이러한 설정과 일치하지 않으면 복원된 샤드가 할당되지 않은 상태로 남아요. 할당하려면index_settings를 사용하여 설정을 재정의하거나ignore_index_settings를 사용하여 제거해요.- 스냅샷의 영구 클러스터 설정이 대상 클러스터와 호환되지 않으면 클러스터 상태 복원이 실패해요. 이 경우
include_global_state를false로 설정하여 클러스터 상태 없이 스냅샷을 복원해요.
복원 매개변수에 대한 자세한 내용은 Restore Snapshot API를 참조하세요.
충돌 및 호환성
인덱스를 복원할 때 인덱스 이름 충돌을 피하는 한 가지 방법은 rename_pattern 및 rename_replacement 옵션을 사용하는 거예요. 그런 다음 필요에 따라 _reindex API를 사용하여 두 인덱스를 결합할 수 있어요. 하지만 스냅샷에서 복원하기 전에 충돌을 일으킨 인덱스를 삭제하는 것이 더 간단할 수 있어요.
마찬가지로 별칭이 있는 인덱스를 복원할 때 별칭 이름 충돌을 피하려면 rename_alias_pattern 및 rename_alias_replacement 옵션을 사용할 수 있어요.
스냅샷에서 복원하기 전에 _close API를 사용하여 기존 인덱스를 닫을 수 있지만, 스냅샷의 인덱스는 기존 인덱스와 동일한 수의 샤드를 가져야 해요.
스냅샷에서 복원하기 전에 클러스터에 대한 쓰기 요청을 중단하는 것이 좋아요. 이렇게 하면 다음과 같은 시나리오를 방지하는 데 도움이 돼요:
- 인덱스를 삭제하면 해당 별칭도 삭제돼요.
- 삭제된 별칭에 대한 쓰기 요청이 별칭과 동일한 이름의 새 인덱스를 생성해요.
- 스냅샷의 별칭이 새 인덱스와 이름 충돌로 인해 복원에 실패해요.
호환성은 스냅샷을 생성한 버전이 아니라 스냅샷의 각 인덱스를 생성한 OpenSearch 버전에 의해 결정돼요. 각 인덱스는 현재 주 버전 또는 이전 주 버전에서 생성되어야 해요. 스냅샷의 인덱스가 호환되지 않으면 스냅샷을 복원할 수 없어요. 이전 버전의 OpenSearch로 스냅샷을 복원하는 것은 지원되지 않아요.
스냅샷은 하나의 주 버전까지만 순방향 호환돼요. 이전 OpenSearch 버전에서 생성된 스냅샷은 버전 업그레이드 후에도 원래 스냅샷을 생성한 OpenSearch 버전에서 계속 복원할 수 있어요. 예를 들어, OpenSearch 2.11 또는 이전 버전에서 생성된 스냅샷은 2.12로 업그레이드한 후에도 2.11 클러스터에서 계속 복원할 수 있어요.
이전 주요 OpenSearch 버전에서 생성된 오래된 스냅샷이 있는 경우 스냅샷 버전보다 한 주요 버전 최신인 중간 클러스터에 복원하고, 모든 인덱스를 재인덱싱하고, 새 스냅샷을 생성하고, 원하는 주요 버전에 도달할 때까지 반복할 수 있지만, 새 클러스터에 데이터를 수동으로 인덱싱하는 것이 더 쉬울 수도 있어요.
스냅샷 및 복원 작업 취소하기
진행 중인 스냅샷을 취소하려면 해당 스냅샷을 삭제하세요. OpenSearch가 스냅샷을 중단하고 리포지토리에 기록한 데이터를 제거해요:
DELETE _snapshot/my-repository/my-snapshot
{% include copy-curl.html %}
복원 작업은 표준 샤드 복구 프로세스를 사용하여 스냅샷에서 각 인덱스를 복구해요. 진행 중인 복원을 취소하려면 복원 중인 인덱스를 삭제하세요. 그러면 해당 인덱스에 복원된 모든 데이터가 삭제돼요:
DELETE restored-index
{% include copy-curl.html %}
복원 중인 인덱스를 찾으려면 active_only 매개변수와 함께 CAT Recovery API를 사용하세요. 스냅샷에서 복원 중인 샤드는 복구 유형이 snapshot이에요:
GET _cat/recovery?active_only=true&v&h=index,shard,type,stage,snapshot,bytes_percent
{% include copy-curl.html %}
클러스터 블록의 영향
cluster.blocks.read_only 설정으로 설정된 것과 같은 클러스터 블록은 클러스터 메타데이터를 수정하는 스냅샷 및 복원 작업에 영향을 미쳐요. 읽기 전용 클러스터 블록이 설정된 상태에서는 다음 작업이 영향을 받아요:
- 리포지토리를 등록하거나 삭제하면 클러스터 메타데이터에 쓰기 때문에 실패해요.
- 스냅샷을 복원하면 클러스터 메타데이터에 쓰기 때문에 실패해요.
- 스냅샷을 생성하면 클러스터 메타데이터만 읽기 때문에 성공해요.
- 등록된 리포지토리에서 스냅샷을 나열하고 삭제하는 것은 리포지토리 내용이 클러스터 메타데이터의 일부가 아니기 때문에 성공해요.
index.blocks.write와 같은 인덱스 블록은 인덱스 설정에 저장되며 인덱스와 함께 복원돼요. 복원된 블록을 제거하려면 복원 후 인덱스 설정을 업데이트하거나 ignore_index_settings 매개변수를 사용하여 설정을 제외하세요.
보안 고려 사항
Security 플러그인을 사용하는 경우 스냅샷에 몇 가지 추가 제한 사항이 있어요:
- 스냅샷 및 복원 작업을 수행하려면 사용자에게 기본 제공되는
manage_snapshots역할이 있어야 해요. - 전역 상태나
.opendistro_security인덱스가 포함된 스냅샷은 복원할 수 없어요.
스냅샷에 전역 상태가 포함된 경우 복원을 수행할 때 이를 제외해야 해요. 스냅샷에 .opendistro_security 인덱스도 포함된 경우 해당 인덱스를 제외하거나 포함하려는 다른 모든 인덱스를 나열하세요:
POST /_snapshot/my-repository/snapshot-3/_restore
{
"indices": "-.opendistro_security",
"include_global_state": false
}
{% include copy-curl.html %}
.opendistro_security 인덱스는 민감한 데이터를 포함하고 있으므로 스냅샷을 생성할 때 이를 제외하는 것을 권장해요. 스냅샷에서 인덱스를 복원해야 하는 경우 요청에 관리자 인증서를 포함해야 해요:
curl -k --cert ./kirk.pem --key ./kirk-key.pem -XPOST 'https://localhost:9200/_snapshot/my-repository/snapshot-3/_restore?pretty'
{% include copy.html %}
관리자 인증서를 사용하여 .opendistro_security를 복원하는 것은 전체 클러스터의 보안 상태를 변경할 수 있으므로 강력히 권장하지 않아요. Security 플러그인 구성을 백업 및 복원하는 권장 프로세스는 주의 사항을 참조하세요.
{: .warning}
인덱스 코덱 고려 사항
인덱스 코덱 고려 사항은 Index codecs를 참조하세요.