노드 장애 복구
노드 장애 복구 (Node Failure Recovery)
여러분, 아무리 잘 운영해도 하드웨어 오작동으로 Qdrant 클러스터의 일부 노드가 복구 불가능한 상태가 될 때가 있어요. Qdrant는 요청에 계속 응답하고 성능 저하까지 피할 수 있는 몇 가지 복구 시나리오를 제공해요. 좋은 시나리오부터 나쁜 시나리오 순으로 살펴볼게요.
복제된 컬렉션으로 복구하기
실패한 노드 수가 컬렉션의 복제 계수(replication factor)보다 적다면, 클러스터는 여전히 읽기, 검색, 업데이트 질의를 수행할 수 있어야 해요.
실패한 노드가 다시 시작되면, 합의(consensus)가 복제 프로세스를 트리거해서 복구 중인 노드가 놓친 업데이트를 받도록 해요.
실패한 노드가 다시 시작되지 않는다면, 3개 이상의 노드 클러스터에서 유실된 샤드를 복구할 수 있어요. 더 작은 클러스터에서는 유실된 샤드를 복구할 수 없는데, 복구 연산이 Raft를 거치고 Raft는 노드의 >50%가 정상이어야 하기 때문이에요.
복제된 컬렉션으로 노드 재생성하기
노드가 실패하고 복구가 불가능하다면, 죽은 노드를 합의에서 제외하고 새 노드를 만들어야 해요:
- 실패한 노드를 합의에서 제외하려면 remove peer API를 사용해요. 필요한 경우
force플래그를 적용해요. - 새 노드를 만들고, 실행 중인 클러스터 노드 중 하나의 URL을
--bootstrapCLI 매개변수로 지정해서 기존 클러스터에 연결되도록 해요. - 새 노드가 준비되고 클러스터와 동기화되면, 컬렉션 샤드가 충분히 복제되었는지 확인해요.
- 자가 호스팅(self-hosting) 시 Qdrant는 샤드를 자동으로 균형 조정(balance)하지 않아요. 이는 비용이 큰 연산이기 때문이에요. 새로 연결된 노드에 새 레플리카를 만들려면 Replicate Shard Operation을 사용해요. Qdrant Cloud에서는 복제 계수가 충족되지 않으면 시스템이 자동으로 새 노드에 샤드를 복제해요.
스냅샷에서 복구하기
샤드를 복구할 수 없고 클러스터에 다른 사본도 없다면, 스냅샷(snapshot)에서 복구할 수 있어요.
먼저 실패한 노드를 분리하고 새 노드를 만들어요:
- 실패한 노드를 합의에서 제외하려면 remove peer API를 사용해요. 필요한 경우
force플래그를 적용해요. - 실행 중인 클러스터 노드 중 하나의 URL을
--bootstrapCLI 매개변수로 지정해서 새 노드를 기존 클러스터에 연결해요. - 컬렉션 스냅샷 복구 API를 사용해 컬렉션을 복구해요. 서비스가 지정된 컬렉션 스냅샷을 다운로드하고 그 데이터로 샤드를 복구해요. 스냅샷 복구는 분산 모드에서 단일 노드 배포와 다르게 동작해요. 합의가 모든 컬렉션 메타데이터를 관리하므로, 메타데이터 복구에 스냅샷이 필요하지 않아요. 하지만 스냅샷을 사용해 컬렉션의 유실된 샤드를 복구할 수는 있어요.
컬렉션의 모든 샤드가 복구되면 컬렉션은 다시 운영 가능한 상태가 돼요.
합의 체크포인팅 (Consensus Checkpointing)
클러스터는 Raft 합의를 사용해 클러스터 메타데이터를 관리하고, 모든 노드가 클러스터 상태에 대해 일관된 관점을 갖도록 보장해요. Qdrant는 클러스터 상태를 변경한 연산의 Raft 로그를 유지해요. 노드가 클러스터에 합류하면 로그를 재생(replay)해 현재 상태를 따라잡을 수 있어요.
Raft 로그가 무한정 커지는 것을 막기 위해 Qdrant는 합의 체크포인팅을 사용해요. 모든 노드가 동의한 클러스터 상태의 일관된 스냅샷을 주기적으로 만들고, 그다음 로그를 잘라내는 방식이에요. 이 기능이 없으면 오랫동안 운영된 클러스터에 합류하는 노드는 전체 로그를 재생해야 하고, 로그가 커질수록 느려져요.
체크포인트를 강제하려면 필요한 노드에서 /cluster/recover API를 호출해요:
POST /cluster/recover
이 API는 리더가 아닌 어떤 노드에서든 트리거할 수 있어요. 현재 합의 리더에게 스냅샷을 만들라는 요청을 보내고, 리더는 그 스냅샷을 요청한 노드에게 다시 보내 적용하게 해요.
어떤 경우에는 이 API를 사용해 스냅샷 생성을 강제함으로써 불일치한 클러스터 상태에서 복구할 수도 있어요.