LiteFS Cloud로부터의 재해 복구
경고: 이 섹션의 문서는 더 이상 사용되지 않으며, 2024년 10월 15일에 폐지된 제품을 다루고 있어요. LiteFS 자체는 LiteFS Cloud 서비스의 폐지에 영향받지 않아요. LiteFS Cloud에서 연결을 해제하는 방법과 기타 재해 복구 옵션에 대해 커뮤니티 게시물에서 자세히 알아보세요: Sunsetting LiteFS Cloud.
LiteFS Cloud를 사용하는 가장 큰 장점은, 클러스터의 모든 노드를 잃는 불행한 상황이 벌어졌을 때 복원할 백업이 있다는 점이에요. 이 문서에서는 모든 노드를 잃었을 때 LiteFS Cloud에서 클러스터를 어떻게 복원하는지 보여줄게요.
중요: 이 문서의 단계는 LiteFS 클러스터의 모든 노드를 잃었을 때만 따라야 해요. 그렇지 않으면 LiteFS Cloud 백업에서 복원할 수 있어요.
출처: 문서
본문
프라이머리 노드만으로 앱 시작하기
여러 노드보다 단일 노드를 복구하는 것이 더 간단하므로, 시작할 때는 모든 레플리카 노드를 제거하고 프라이머리 노드만 실행하는 것이 좋아요. 이 페이지까지 오기 전에 앱이 아직 재시작되지 않았다면, 프라이머리 노드만으로 앱을 재시작하고 다음 단계로 넘어가세요!
앱이 이미 여러 노드로 재시작되었다면, 레플리카를 모두 일시적으로 제거해야 해요.
Fly 플랫폼에서 앱을 실행 중이라면, 앱을 실행하는 Machine을 다음으로 볼 수 있어요:
fly status
대략 다음과 같은 결과가 보일 거예요:
Machines
PROCESS ID VERSION REGION STATE ROLE CHECKS LAST UPDATED
app 784e900c2de378 1 ams started primary 2023-07-10T13:05:40Z
app e784e471b39208 1 ord started replica 2023-07-10T13:01:16Z
그런 다음 replica로 표시된 각 Machine을 파괴하세요:
fly machines destroy e784e471b39208
끝나면 fly status를 다시 실행해 프라이머리만 실행 중인지 확인할 수 있어요.
올바른 클러스터 id 찾기
앱이 재시작되면 LiteFS는 새 클러스터 id를 생성해요. 이는 LiteFS Cloud에 저장된 클러스터 id와 다릅니다. 이는 안전 조치예요. 실수로 앱에 잘못된 LiteFS Cloud 토큰을 설정해도 클러스터의 데이터를 실수로 덮어쓰지 않도록 하기 위해서죠. LiteFS 로그에 이와 유사한 오류 메시지가 보일 거예요:
level=INFO msg="backup stream failed, retrying: fetch position map: backup client error (422): cluster id mismatch, expecting \"LFSC25AD000F32ED02A9\""
Fly 플랫폼에서 실행 중이라면 로그를 다음으로 볼 수 있어요:
fly logs
로그 메시지 끝에 명시된 클러스터 id를 기록하세요. 예시에서는 LFSC25AD000F32ED02A9예요. 이 값을 복사해 나중에 사용하세요.
클러스터 id 업데이트하기
이제 올바른 클러스터 id를 얻었으니, 프라이머리 노드에 연결해 클러스터 id 파일을 업데이트할 수 있어요. 앱이 Fly 플랫폼에 배포되어 있다면, 다음으로 연결하세요:
fly ssh console
그런 다음 clusterid 파일을 업데이트하세요:
echo LFSC25AD000F32ED02A9 > /var/lib/litefs/clusterid
이후 LiteFS를 재시작해야 해요. Fly 플랫폼을 사용 중이라면 ssh 세션을 닫고 앱을 재시작하세요:
fly app restart
로그를 다시 확인해 클러스터 id 오류 메시지가 더 이상 없는지 확인하세요! 계속하기 전에 앱을 살펴보고 기대한 데이터가 보이는지도 확인해야 해요.
Consul 키 오류 해결하기
Fly 플랫폼에서 실행 중이라면(또는 다른 곳에서 lease 관리를 위해 Consul을 사용한다면), 로그에 다음 오류가 보일 수 있어요:
2023-07-10T13:30:25Z app[784e900c2de378] ams [info]level=INFO msg="cannot connect, \"consul\" lease already initialized with different ID: LFSCA5E3680C1C2FCFFE"
이를 해결할 두 가지 옵션이 있어요:
- LiteFS가 사용하는 Consul 키 값을 변경하기. 쉬운 방법이지만, Consul에 불필요한 키가 남아요.
또는:
- Consul에서 "잘못된" 키를 제거하기. 더 어렵지만 더 깔끔해요.
쉬운 옵션: Consul 키 변경하기
litefs.yml 파일에서 lease.consul.key 값을 간단히 업데이트할 수 있어요. 이전 키는 Consul에 계속 남지만, LiteFS는 신경 쓰지 않아요. 예를 들어 Consul 키 값 끝에 -v2를 추가할 수 있어요:
lease:
type: consul
...
consul:
url: "${FLY_CONSUL_URL}"
key: "litefs/${FLY_APP_NAME}-v2" # added '-v2'
Fly 플랫폼을 사용 중이라면 앱을 재배포하세요:
fly deploy
더 깔끔한 옵션: Consul에서 잘못된 키 제거하기
먼저 이미지에 consul을 추가해야 해요. ssh로 프라이머리 노드에 연결해 설치하세요. 설치 방법은 다음과 같아요:
# For debian/ubuntu-based images before bookworm
apt-get install consul
# From official source:
# https://developer.hashicorp.com/consul/install?product_intent=consul#Linux
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/hashicorp.list
apt update && apt install consul
# For alpine-based images
apk add consul
FLY_CONSUL_URL을 얻으세요:
echo $FLY_CONSUL_URL
이 URL 형식은 https://:{TOKEN}@{HOST}/{PREFIX}예요. 각 값을 따로 필요해요. litefs.yml 파일의 lease.consul.key 값도 필요해요.
그런 다음 Consul CLI로 키를 삭제하세요:
export TOKEN=(copy the token you found from your consul url)
export HOST=(copy the host you found from your consul url)
export PREFIX=(copy the prefix you found from your consul url)
export LITEFS_CONSUL_KEY=(copy the key from your litefs.yml file)
# and then delete the key!
consul kv delete -http-addr=https://$HOST -token=$TOKEN $PREFIX/$LITEFS_CONSUL_KEY/clusterid
이 작업이 끝나면 LiteFS를 재시작하세요. 앱이 Fly 플랫폼에 배포되어 있다면 앱을 재시작해 이 작업을 할 수 있어요:
fly app restart
레플리카 다시 추가하기
프라이머리 노드가 LiteFS Cloud에 다시 연결되고 데이터가 복구되었다면, 다시 확장하면 돼요.
Fly 플랫폼을 사용 중이라면 대략 다음과 같을 거예요(ord를 새 레플리카를 실행할 region으로 바꿔서):
fly machines clone --select --region ord