나의 잡다한 노트 및 메모
ETCD에서 snapshot으로 복구해야하는 케이스 본문
어떤 경우에 복구할 상황이 생길까?
- 데이터 디렉터리 파손/손실
- etcd 노드가 디스크 장애(HDD/SSD 고장)로 인해 /var/lib/etcd 등 data-dir이 복구 불가능하게 손상된 경우,
- 혹은 컨테이너 볼륨이 영구적으로 날아간 경우,
- 이 때, 단순 재부팅으로는 정상 etcd 데이터를 복원할 수 없습니다.
- → 백업(snapshots) 이 없다면 클러스터로 합류해도 데이터가 동기화되지 못하거나, 클러스터가 정상 작동하지 않을 수 있음.
- 라프트(Raft) 상태가 꼬여서 클러스터가 복구 불가
- 노드가 절반 이상 죽었는데, 남은 노드도 뭔가 일관성이 깨져버렸거나,
- 모든 노드에 걸쳐 동시에 문제가 발생해 과반수 동작이 안 되고, 어느 노드도 리더가 되지 못하는 상태가 장기화될 때.
- 이럴 때는 스냅샷을 이용해 “새 클러스터”를 구성하는 게 빠른 해법일 수 있습니다.
- 잘못된 운영(오작동 등)으로 인해 etcd 데이터가 논리적으로 망가졌을 때
- 잘못된 업그레이드, 호환성 문제로 인해 etcd db가 손상되었거나,
- 사람이 실수로 중요 key들을 대규모로 삭제했을 때,
- “시간을 돌려” 이전 상태로 돌아가야 하는 상황(=스냅샷 복원).
단순 다운(서버 재부팅)과 스냅샷 복구의 차이
- 단순히 노드가 다운된 경우(전원 꺼짐, 컨테이너 일시 중단 등)라면, 보통 등d data-dir(영구 볼륨) 이 살아 있기 때문에, 재부팅 후 동일 data-dir로 기동하면 노드가 클러스터에 재합류하며 정상화를 시도합니다.
- 3개 중 2개 다운되어도, 그 2개가 data-dir 무결성을 유지한 채 다시 가동하면 문제없이 클러스터에 복귀해 “Quorum(과반수)”가 살아납니다.
- → 이런 경우에는 스냅샷 복원할 필요가 없음.
- 그러나 노드가 디스크 손상(RAID 파손, 파일 시스템 에러 등)으로 data-dir이 사라졌거나 영구적으로 소실되었다면, 그 노드는 기존 라프트 상태를 전혀 기억하지 못합니다.
- 이 상태로 부팅하면, etcd 스스로 “새 노드”처럼 인식하게 되고, 클러스터에 올바로 합류하기 위해서는 최신 스냅샷(백업)이나 다른 노드에서 받은 Raft 로그 동기화가 필요합니다.
- 만약 이미 클러스터 자체가 고장나서 과반수를 못 이루고 있으면, 자동 동기화도 불가능할 수 있으므로, 결국 스냅샷 복원이 필요합니다.
디스크 손상으로 etcd의 data-dir이 완전히 사라진 노드가 있을 때, 단순히 etcdctl member add 명령만으로 예전 노드가 자동으로 정상 복귀하지는 않습니다.
왜냐하면 해당 노드가 가지고 있던 Raft 메타데이터(클러스터 멤버 ID, 로그 등)가 소실되었기 때문에, 기존 멤버로 인식될 수 없기 때문입니다.
클러스터 멤버십과 데이터 디렉터리
- etcd는 내부적으로 멤버(노드)별로 고유한 ID를 할당하며, Raft 로그와 스토리지(state)를 data-dir에 저장합니다.
- data-dir이 삭제되면, 그 노드는 더 이상 자신의 멤버 ID나 Raft 상태를 알 수 없습니다.
- 클러스터 입장에서는 “원래 있던 멤버”가 사라진 상태이고, “새로운 노드”가 나타나도 멤버십 상 동일 노드로 간주하기 어렵습니다.
어떻게 처리해야 하나?
경우 A. 클러스터가 아직 Quorum을 유지 중인 경우
- 예: 3노드 중 1노드 디스크 손상, 나머지 2노드는 정상(=과반수 생존).
- 원래 망가진 멤버를 etcdctl member remove <ID> 로 제거
- **“새로운 노드”**를 etcdctl member add 해서 클러스터에 참여시킴
- 새 노드는 초기화된 data-dir로 시작하고, 클러스터에서 Raft 로그를 받아 DB 동기화 → 정상 멤버가 됨.
경우 B. 클러스터가 Quorum을 깨져서 동작 불가인 경우
- 예: 3노드 중 2노드 디스크 손상, 1노드만 생존 → 과반수 부족
- 클러스터가 이미 리더를 선출 못하므로, 기존 방식으로 member add/remove가 안 될 가능성이 큼.
- 스냅샷 복원 혹은 --force-new-cluster 등의 재구성 절차를 통해 클러스터를 새로 띄워야 할 수 있음.
- 만약 부분적으로 남은 노드에서만이라도 etcd가 살아 있다면, “줄어든 노드 수로” 클러스터를 강제 구성(재기동)하거나, 백업(snapshots)으로 복원하는 방법을 택해야 합니다.
'DB > etcd' 카테고리의 다른 글
etcdctl 명령어 (0) | 2025.02.19 |
---|