개발 중이던 Elasticsearch 서버에서 메모리 부족 현상으로 인해 인덱스들이 모두 날아간 일이 있었다.
다행히 개발 환경이라 큰 문제가 되진 않았지만, 운영 환경이었다면 큰 사고로 이어졌을 수 있었다.
이후 데이터를 다시 저장하면서, 스냅샷 백업 및 자동화 설정을 함께 진행했다.
Docker 환경 기준으로 정리해본다.
🔧 환경 개요
- 환경: Docker + Elasticsearch 8.5
- 운영 방식: docker-compose
- 문제: 메모리 부족 → 인덱스 유실
- 목표: 백업과 복원이 가능한 구조 확보
📁 Docker 설정
1. elasticsearch.yml 환경변수 설정
environment:
- node.name=single-node
- cluster.name=medeasy-elastic-cluster
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- xpack.security.enabled=false
- network.host=0.0.0.0
- path.repo=/usr/share/elasticsearch/backup
path.repo는 스냅샷을 저장할 경로이며, 컨테이너 외부에서 접근 가능해야 한다.
2. 호스트 디렉토리 마운트
volumes:
- ./esdata:/usr/share/elasticsearch/data
- ./esbackup:/usr/share/elasticsearch/backup
컨테이너는 언제든 재생성될 수 있으므로, 데이터를 외부 디스크에 연결해두는 것이 필수다.
3. 디렉토리 권한 설정
sudo mkdir -p ./esbackup
sudo chown -R 1000:1000 ./esbackup
Elasticsearch 컨테이너의 UID는 일반적으로 1000이다.
권한이 없으면 스냅샷을 저장할 수 없다.
📦 스냅샷 저장소 및 생성
저장소 등록
PUT _snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/usr/share/elasticsearch/backup",
"compress": true
}
}
compress: true로 설정하면 백업 용량을 줄일 수 있다.
수동 스냅샷 생성
PUT _snapshot/my_backup/search_history_snapshot
{
"indices": "search_history",
"include_global_state": false
}
include_global_state: false는 클러스터 설정 정보 제외.
스냅샷 복원
POST _snapshot/my_backup/search_history_snapshot/_restore
{
"indices": "search_history",
"rename_pattern": "search_history",
"rename_replacement": "search_history_restored"
동일한 인덱스를 덮어쓰지 않고, 이름을 바꿔서 복원할 수 있다.
🕓 자동 백업 (SLM: Snapshot Lifecycle Management)
정책 등록
PUT _slm/policy/daily-medicine-backup
{
"schedule": "0 0 1 * * ?",
"name": "<medeasy-snap-{now/d}>",
"repository": "my_backup_repo",
"config": {
"indices": ["medicine_data", "search_history", "user_search_history", "search_popular"],
"ignore_unavailable": true,
"include_global_state": false
},
"retention": {
"expire_after": "14d",
"min_count": 2,
"max_count": 10
}
}
항목 설명
schedule | Cron 표현식으로 백업 주기 설정 |
name | 날짜 기반으로 스냅샷 이름 자동 생성 |
ignore_unavailable | 일부 인덱스가 없어도 실행 유지 |
retention | 최대 보관 개수 및 기간 제한 설정 |
정책 수동 실행 (테스트)
POST _slm/policy/daily-medicine-backup/_execute
정책이 제대로 동작하는지 확인할 때 사용했다.
🔍 상태 확인 명령어 모음
GET _slm/policy # 정책 목록
GET _slm/policy/daily-medicine-backup
GET _slm/stats # 실행 통계
GET _snapshot/my_backup/_all # 저장된 스냅샷 확인
🧠 실무 팁
- 스냅샷은 Elasticsearch 내부에서만 복원 가능하다
- 일반 파일처럼 직접 옮겨서 사용할 수는 없다. 동일한 path.repo 설정이 필요하다.
- 운영 서버에서는 반드시 디스크 사용량을 체크해야 한다
- 스냅샷이 쌓이면서 공간 부족 문제가 생길 수 있다.
- 인덱스 이름에 날짜 패턴을 포함하면 정리/검색이 쉬워진다
- 예: search_history-2025.03.21
- 스냅샷은 Elasticsearch에만 국한된 백업이다
- DB나 외부 저장소, 로그 등은 별도의 백업 전략이 필요하다.
'Elasticsearch' 카테고리의 다른 글
[Elasticsearch] 도큐먼트 저장 방식과 작동 원리 정리 (0) | 2025.03.24 |
---|---|
[Elasticsearch 보안 설정] 비밀번호 인증 활성화 및 Spring, Kibana 연동 (0) | 2025.03.22 |
[ElasticSearch] 인기 검색어 쿼리 구현 (0) | 2025.03.11 |
[ElasticSearch] ElasticSearch Native Query 최신 버전 작성 (0) | 2025.03.04 |
[ElasticSearch] bool 타입 minimum_should_match 오류 (0) | 2025.03.04 |