DBAtlas · 데이터베이스 운영 아틀라스

Elasticsearch 복원력: replica + 스냅샷 + CCR

증상

목표: replica 샤드, 전용 master/data 노드, 스냅샷 백업(SLM), cross-cluster replication(CCR)으로 Elasticsearch의 복원력을 구축한다.

1. 역할 분리: 전용 master 노드와 data 노드

클러스터 안정성을 위해 투표하는 master-eligible 노드(가급적 3개, 홀수 과반수)를 데이터 워크로드에서 분리한다. elasticsearch.yml의 node.roles로 역할을 지정하고 discovery를 위한 seed host를 정의한다. master 3개가 split-brain을 방지한다.

Elasticsearch

# elasticsearch.yml on master nodes:
# node.roles: [ master ]
# on data nodes:
# node.roles: [ data, ingest ]
# discovery.seed_hosts: [ m1, m2, m3 ]
# cluster.initial_master_nodes: [ m1, m2, m3 ]

2. 인덱스 replica 수를 설정한다

number_of_replicas는 각 primary 샤드에 대해 유지하는 사본 수다. data 노드를 잃어도 데이터를 사용할 수 있도록 최소 1이어야 한다. 운영 중인 인덱스에서 동적으로 변경할 수 있으며, replica 수는 data 노드 수보다 작아야 한다.

Elasticsearch

PUT /orders/_settings
{
  "index": { "number_of_replicas": 1 }
}
# default via template (composable template; the old _template API is legacy):
# PUT _index_template/order-tpl { "index_patterns": ["order*"], "template": { "settings": { "number_of_replicas": 1 } } }

3. 스냅샷 리포지토리를 정의한다

백업은 repository에 저장된다: 공유 파일 시스템(fs) 또는 S3/GCS/Azure 플러그인. 클러스터가 삭제되어도 데이터를 복구할 수 있도록 repository는 클러스터 외부의 내구성 있는 스토리지에 있어야 한다.

Elasticsearch

PUT /_snapshot/backup_repo
{
  "type": "fs",
  "settings": { "location": "/mnt/es_backups", "compress": true }
}

4. SLM으로 자동 스냅샷을 스케줄링한다

Snapshot Lifecycle Management(SLM)는 정기적으로 스냅샷을 생성하고 retention 정책을 적용한다. cron 식으로 빈도, 포함할 인덱스, 보관할 스냅샷 수를 정의한다.

Elasticsearch

PUT /_slm/policy/daily_backup
{
  "schedule": "0 30 1 * * ?",
  "name": "<daily-{now/d}>",
  "repository": "backup_repo",
  "config": { "indices": ["*"] },
  "retention": { "expire_after": "30d", "min_count": 5, "max_count": 50 }
}

5. 스냅샷과 복원을 검증한다

SLM 정책을 수동으로 실행해 동작을 확인한다. 스냅샷 상태는 SUCCESS여야 한다. 테스트하지 않은 백업은 백업이 아니므로 복원 테스트를 정기적으로 수행한다.

Elasticsearch

POST /_slm/policy/daily_backup/_execute
GET /_snapshot/backup_repo/_all
# restore:
POST /_snapshot/backup_repo/<snapshot_name>/_restore

6. Cross-Cluster Replication(CCR)으로 원격 DR을 구성한다

리전 간 재해 복구를 위해 두 번째 클러스터(follower)가 원격 primary 클러스터(leader)의 인덱스를 따른다. 먼저 remote cluster를 정의한 뒤 follower 인덱스를 leader에 연결하면 leader의 변경이 자동으로 흐른다. CCR은 Platinum(상용) 기능이다.

Elasticsearch

# define the remote cluster on the follower cluster:
PUT /_cluster/settings
{ "persistent": { "cluster": { "remote": { "primary": { "seeds": ["leader1:9300"] } } } } }
# create the follower index:
PUT /orders-follower/_ccr/follow
{ "remote_cluster": "primary", "leader_index": "orders" }
DBAtlas에서 열기 →