수평 스케일링
수평 스케일링 (horizontal-scaling)
수평 스케일링은 기존 노드를 키우는 대신 Qdrant 클러스터에 노드를 더 추가하는 것을 의미해요. 데이터가 더 이상 한 노드에 맞지 않을 때 Qdrant가 처리하는 방식이며, 동시에 Qdrant 내결함성(fault tolerance)을 뒷받침하는 메커니즘이기도 합니다. 이 페이지는 내부적으로 어떻게 동작하는지를 다뤄요. 샤딩, 복제, Raft 합의, 일관성 보장이 그것이죠.
> 출처: [Qdrant 공식 문서 — horizontal-scaling](https://qdrant.tech/documentation/scaling/horizontal-scaling)
이러한 메커니즘이 내결함성과 장애 조치 측면에서 무엇을 얻어다 주는지는 탄력성 문서를, 실용적인 설정 단계는 분산 배포 문서를 참고하세요.
Qdrant 노드를 몇 개나 운영해야 하나요? (How Many Qdrant Nodes Should I Run?)
이상적인 Qdrant 노드 수는 비용 절감, 탄력성, 성능/확장성을 서로 어떻게 가치 있게 여기느냐에 따라 달라져요.
노드 1개 (One Node)
노드 하나는 비용이 가장 낮고 설정도 쉽지만 고가용성(high availability)은 제공하지 않아요. 프로덕션 환경에는 권장되지 않습니다. 단점:
- 탄력성: 노드 재시작 중에 사용자가 다운타임을 겪어요. 노드의 데이터가 영구적으로 손실되거나 손상되면, 스냅샷이나 백업 외에는 복구할 수 없어요.
- 성능: 단일 서버의 리소스로 제한됩니다.
노드 2개 (Two Nodes)
노드 두 개는 단일 노드의 두 배 용량을 주고, 복제된 샤드를 가진 2-노드 Qdrant 클러스터는 유지보수 같은 이벤트에서 한 노드가 꺼져 있어도 대부분의 읽기/쓰기 요청에 응답할 수 있어요. 하지만 진정한 고가용성은 주지 않습니다. 단점:
- 클러스터 전체 연산에 대한 고가용성이 없음: 컬렉션 생성, 편집, 삭제 같은 연산을 의미해요. 한 노드가 꺼져 있으면 클러스터가 컬렉션 연산을 수행할 수 없어요. 그러려면 노드의 50% 이상이 가동 중이어야 하는데, 이는 3+ 노드 클러스터에서만 가능하기 때문이에요. 진정한 고가용성이 필요 없다면 이 정도로 감당할 수 있어요.
- 데이터 무결성: 두 노드 중 하나의 데이터가 영구적으로 손실되거나 손상되면 스냅샷이나 백업 외에는 복구할 수 없어요. 복구 연산이 클러스터의 50% 이상이 건강할 것을 요구하므로, 단일 노드의 영구 손실을 복구할 수 있는 건 3+ 노드 클러스터뿐이에요.
- 비용: 샤드를 복제하려면 데이터를 두 번 저장해야 해요.
노드 3개 이상 (Three or More Nodes)
노드 3개 이상은 복제 인자가 2 이상인 한 고가용성 클러스터를 제공해요. 노드 3개 이상과 복제가 있는 클러스터는 노드 하나가 꺼져 있어도 모든 연산을 수행할 수 있어요. 로드 밸런싱에서 오는 성능 이점도 얻고, 백업이나 스냅샷 없이도 단일 노드의 영구 손실을 복구할 수 있어요(그래도 백업은 여전히 강력히 권장됩니다). 프로덕션 환경에 권장되는 구성입니다. 단점:
- 비용: 샤드를 복제하려면 데이터를 두 번 저장해야 해요.
- 비용: 더 큰 클러스터는 더 작은 클러스터보다 비쌉니다.
어떤 구성이 당신에게 맞나요? (Which Configuration Is Right for You?)
요약하면:
- 노드 1개는 비-프로덕션 워크로드에 적합해요.
- 노드 2개는 진정한 고가용성 없이 노드 1개보다 더 큰 용량을 줘요.
- 노드 3개 이상과 복제 인자 2 이상이 프로덕션의 황금 표준이에요.
샤딩 (Sharding)
Qdrant 컬렉션은 하나 이상의 샤드로 분할돼요. 각 샤드는 컬렉션이 지원하는 모든 연산을 수행할 수 있는 독립적인 포인트 저장소입니다. 각 샤드는 컬렉션 포인트의 서로 다른 일부를 보유해요.
Qdrant는 두 가지 방식 중 하나로 샤드에 포인트를 분산합니다.
- 자동 샤딩(기본): 일관 해싱(consistent hashing) 알고리즘으로 포인트가 샤드에 할당돼요. 수동 배치 없이 각 샤드가 겹치지 않는 포인트 부분집합을 관리합니다.
- 사용자 정의 샤딩: 각 포인트를 직접 고른 샤드에 업로드하므로, 연산이 필요한 샤드만 겨냥할 수 있어요. 테넌트나 리전을 전용 샤드로 격리하는 데 유용합니다.
Raft 합의 덕분에 모든 노드가 샤드가 어디에 저장되어 있는지 알고 있어서, 어느 단일 노드로 보낸 검색 요청도 자동으로 클러스터 나머지로 퍼져 전체 결과를 모아요.
경험 법칙으로, 노드당 최소 샤드 2개를 만드세요. 리샤딩(resharding)은 Qdrant Cloud에서만 가능하고 그 외에는 컬렉션 재생성이 필요하므로, 클러스터가 리샤딩 없이 성장할 수 있게 하려는 거예요. 큰 성장이 예상된다면 12개 샤드가 흔한 시작점인데, 노드 1개에서 2, 3, 6, 12개로 확장할 때 고르게 나눠지기 때문이에요. 그 이상은 더 작은 클러스터에서 별 이점 없이 오버헤드만 늘어납니다.
샤드 수를 설정하고, 사용자 정의 샤딩을 활성화하고, 노드 간 샤드 이동을 하는 방법은 분산 배포의 'Sharding' 섹션을 참고하세요.
복제 (Replication)
Qdrant는 클러스터의 노드 간에 샤드를 복제해, 샤드의 여러 사본을 클러스터에 퍼뜨려 담을 수 있게 해요. 이를 통해 모든 복제본이 잃어버려도 되는 경우를 제외하면 노드 실패 시 데이터 가용성을 보장합니다.
기본적으로 Qdrant에는 primary나 secondary 복제본이 없어요. 쓰기는 샤드의 모든 활성 복제본에 병렬로 실행되고, 어떤 복제본이든 읽기나 쓰기를 제공할 수 있어요. 'leader' 복제본은 컬렉션이 medium 또는 strong 쓰기 순서로 구성되었을 때만 존재하며, 그때도 고정된 게 아니라 동적으로 선출되고, 일관성을 위해 쓰기를 직렬화할 뿐 영구적인 primary가 되려는 게 아니에요. 복제 설정 방법은 'Replication factor'와 'Creating new shard replicas' 섹션을 참고하세요.
각 복제본은 세 가지 상태 중 하나예요. active(건강하고 트래픽 제공), dead(헬스 체크에 응답하지 않거나 트래픽 제공 실패), partial(active가 되기 전 재동기화 중). dead 복제본은 다른 피어로부터 트래픽 수신을 멈추고, 스스로 복구되지 않으면 수동 개입이 필요할 수 있어요. 이 상태 모델은 업데이트 중 일부 복제본만 실패할 때도 데이터를 일관되고 사용 가능하게 유지해 줘요.
일관성 보장 (Consistency Guarantees)
복제는 일관성에 영향을 줘요. 기본적으로 Qdrant는 가용성과 처리량을 우선시하므로, 같은 문서에 대한 동시 업데이트는 복제본을 일시적으로 불일치 상태로 만들 수 있어요. 쓰기 일관성 인자, 읽기 일관성, 쓰기 순서 옵션을 사용하면 워크로드가 요구할 때 그 보장을 강화할 수 있습니다. 설정 세부사항은 'Consistency Guarantees' 문서를 참고하세요.
Raft 합의 (Raft Consensus)
Qdrant는 Raft 합의 프로토콜을 사용해 클러스터 토폴로지와 컬렉션 구조에 관한 일관성을 유지해요. Raft 합의는 데이터 자체가 아니라 클러스터 메타데이터에만 적용됩니다.
- 컬렉션 연산은 합의의 일부예요. 모든 연산이 내구성 있고 궁극적으로 모든 노드에서 실행되도록 보장하죠. Qdrant가 연산을 수행하기 전에 과반수의 노드가 적용할 연산에 동의해야 해요.
- 포인트 연산은 합의 인프라를 거치지 않아요. Qdrant는 낮은 오버헤드의 포인트 연산을 위해 강력한 트랜잭션 보장을 맞바꿉니다. 원자적 분산 업데이트를 보장하진 않지만, 연산이 완료될 때까지 기다려 쓰기 결과를 확인할 수 있어요.
합의 상태를 확인하려면 Check Cluster Status API를 사용하세요.
고가용성을 위해 투표 노드(voting node)를 최소 3개 운영하세요. 2-노드 클러스터는 어느 한 노드가 없으면 과반수를 형성할 수 없어서, 두 노드가 다시 통신할 수 있을 때까지 Raft가 리더를 선출하거나 확인하지 못해요. 이 전환 상태(실패 후 새 리더 선출 중이든 시작 중이든) 동안 Qdrant는 컬렉션 업데이트 연산을 거부합니다.
Qdrant는 클러스터 상태를 변경한 연산의 Raft 로그를 유지해요. Raft 로그가 무한정 커지는 것을 막기 위해 Qdrant는 합의 체크포인팅(consensus checkpointing)을 사용합니다.
어디로 갈까 (Where to Go Next)
- Resilience: 이 메커니즘이 내결함성, Multi-AZ, 장애 조치 측면에서 무엇을 얻어다 주는지.
- Distributed Deployment: 실용적 설정 — 분산 모드 활성화, 샤딩, 복제, 노드 실패 복구.
- Vertical Scaling: 노드를 추가하는 대신 기존 노드 리사이즈.