이슈
데이터 보호를 위해서 일정 주기로 엘라스틱서치 데이터를 스냅샷으로 보관해둘 필요성이 생겼다. 확인해보니 SLM(snapshot lifecycle management) API 를 사용하면 자동으로 스냅샷을 기록할 수 있다고 한다.
해결
-
Elasticsearch 8.4.3 버전 기준
우선 엘라스틱 실행 시 ELASTICSEARCH_FS_SNAPSHOT_REPO_PATH
환경변수에 스냅샷 경로를 지정해주어야한다. 그렇지않으면
Doesn’t match any of the locations specified by path.repo because this setting is empty
와 같은 오류가 발생한다. bitnami helm 차트의 경우 values.yaml 파일에 snapshotRepoPath
값을 수정해주면 되고 그 외의 경우에는 ENV 등으로 변수 설정이 필요하다.
# bitnami 차트는 이 키값을 변경한다.
snapshotRepoPath: "<스냅샷 데이터를 저장할 PV마운트 경로>"
환경변수를 설정했으면 엘라스틱서치를 다시 실행해준다. 그리고 아래 요청을 cURL 이나 kibana 를 통해서 입력해주면 된다.
# 리포지토리 등록
PUT _snapshot/backup
{
"type": "fs",
"settings": {
"location": "<스냅샷 데이터를 저장할 PV마운트 경로>"
}
}
# 리포 등록 확인
GET _snapshot/backup?pretty
# 검증
POST _snapshot/backup/_verify?pretty
# SLM security privileges 등록
POST _security/role/slm-admin
{
"cluster": [ "manage_slm", "cluster:admin/snapshot/*" ],
"indices": [
{
"names": [ ".slm-history-*" ],
"privileges": [ "all" ]
}
]
}
# SLM 규칙 생성 (UTC 기준 매일 18시에 스냅샷 진행)
PUT _slm/policy/cron-snapshots
{
"schedule": "0 0 18 * * ?",
"name": "<cron-snap-{now/d}>",
"repository": "backup",
"config": {
"indices": "*",
"include_global_state": true
},
"retention": {
"expire_after": "30d",
"min_count": 5,
"max_count": 50
}
}
# 생성 확인
GET _slm/policy
의문스러운 점은 파드를 KST 로 설정했음에도 크론탭은 UTC 기준으로 동작하는 점인데, 나중에 시간이 나면 다시 확인해봐야겠다.