도입
처음 클러스터를 배울 때는 흔히 “서버 여러 대를 묶은 것” 정도로 이해합니다. 방향은 맞지만, 실무에서는 그 설명만으로는 부족합니다.
클러스터는 단순히 머신 수를 늘리는 구조가 아니라, 노드, 장애 감지, 상태 동기화, 트래픽 분산, 페일오버, 합의 또는 쿼럼 같은 요소가 함께 설계되어야 비로소 의미를 가집니다. 그래서 클러스터를 이해한다는 것은 인프라를 “여러 대로 나눴다”가 아니라, 장애가 나도 계속 서비스할 수 있는 구조를 만들었다는 관점으로 보는 일에 가깝습니다.
필요성
서버 한 대만으로 운영할 때는 구조가 단순합니다. 하지만 그 서버가 죽으면 서비스도 같이 멈추고, 트래픽이 몰리면 더 이상 확장이 어렵습니다.
클러스터는 바로 이 한계를 줄이기 위한 구조입니다. 여러 노드가 같은 역할을 나눠 처리하거나, 한 노드가 실패했을 때 다른 노드가 이어받을 수 있게 하므로 단일 장애 지점을 줄일 수 있습니다. 또한 처리량을 분산하고, 계획된 유지보수나 일부 장애 중에도 서비스를 계속 제공할 가능성을 높여 줍니다.
- 서버 하나가 죽어도 서비스가 멈추면 안 되는 경우
- 트래픽이 늘어날 때 수평 확장이 필요한 경우
- 읽기·쓰기·작업 처리량을 여러 노드로 나눠야 하는 경우
- 운영 중 배포나 유지보수를 하면서 다운타임을 줄여야 하는 경우
- 컨테이너 워크로드를 여러 머신에 자동 배치해야 하는 경우
정의
클러스터는 보통 노드(node)라고 부르는 여러 컴퓨터가 네트워크로 연결되어, 외부에서는 하나의 서비스 또는 하나의 시스템처럼 보이도록 동작하는 구조를 뜻합니다.
중요한 점은 “여러 대를 묶었다”가 곧바로 클러스터는 아니라는 것입니다. 단순히 같은 프로그램을 여러 서버에 설치한 것만으로는 부족하고, 장애 시 전환, 상태 공유, 부하 분산, 관리 일관성 같은 운영 모델까지 함께 정의되어야 진짜 클러스터라고 부를 수 있습니다.
핵심 원리
클러스터는 보통 세 가지 질문에 답해야 합니다. 첫째, 어떤 노드가 정상인가. 둘째, 어떤 노드가 지금 일을 맡을 것인가. 셋째, 데이터와 상태는 어떻게 일관되게 유지할 것인가.
즉, 클러스터 설계는 머신 수를 늘리는 문제가 아니라 조정(coordination)의 문제입니다. 아무 조정 없이 서버만 늘리면 장애 시 더 혼란스러워질 수 있고, 반대로 조정 원리가 잘 잡혀 있으면 노드 일부가 죽어도 서비스는 계속 유지될 수 있습니다.
기본 구조
| 구성 요소 | 역할 | 실무 포인트 |
|---|---|---|
| Node | 실제 작업을 수행하는 서버 또는 인스턴스 | 물리 서버일 수도, VM이나 컨테이너 호스트일 수도 있음 |
| Cluster Manager / Control Plane | 노드 상태를 보고 배치, 전환, 복구를 조정 | 쿠버네티스에서는 control plane이 이 역할을 맡음 |
| Load Balancer / Entry Point | 외부 요청을 적절한 노드로 분산 | 클러스터와 로드밸런서는 자주 함께 쓰이지만 같은 것은 아님 |
| Health Check / Heartbeat | 노드 생존 여부와 서비스 상태 확인 | 헬스체크 품질이 잘못되면 오동작도 많아짐 |
| Shared or Replicated State | 상태를 공유하거나 복제해 서비스 연속성 확보 | 상태 관리가 가장 어려운 부분인 경우가 많음 |
| Quorum / Fencing | 분할 상황에서 잘못된 이중 활성화를 막음 | 특히 HA 클러스터에서 데이터 무결성과 직결됨 |
클러스터를 간단히 그리면
사용자 요청
↓
로드밸런서 / 진입점
↓
노드 A 노드 B 노드 C
↘ ↓ ↙
상태 저장소 / 복제 / 제어 계층
패턴 1. 고가용성(HA) / 페일오버 클러스터
HA 클러스터는 흔히 failover cluster라고도 부릅니다. 여기서는 한 노드가 서비스를 맡고 있다가, 그 노드가 실패하면 다른 노드가 같은 서비스를 이어받는 구조가 중요합니다.
겉보기에 단순해 보여도 실제로는 어렵습니다. 단순히 다른 서버에서 프로세스를 다시 띄우는 문제가 아니라, 이전 노드가 정말 완전히 손을 뗐는지, 저장소 접근권이 정리됐는지, 클라이언트가 같은 서비스로 계속 보게 되는지까지 보장해야 하기 때문입니다.
예시
정상 상태: Node A가 서비스 담당, Node B는 대기
장애 발생: Node A 장애 감지
전환: 클러스터 관리 계층이 Node B로 서비스 이동
결과: 클라이언트는 가능한 한 같은 서비스가 계속되는 것으로 인식
패턴 2. 로드밸런싱 / 스케일아웃 클러스터
모든 클러스터가 active-passive는 아닙니다. 웹 서버나 API 서버처럼 무상태에 가까운 서비스는 여러 노드가 동시에 요청을 처리하는 active-active 구조가 흔합니다.
이 경우 클러스터 앞에는 보통 로드밸런서가 있고, 요청은 살아 있는 노드들에 분산됩니다. 한 노드가 죽으면 트래픽을 다른 노드가 이어받고, 평상시에는 전체 처리량을 함께 끌어올립니다. 즉, 이 유형은 고가용성과 확장성을 동시에 노립니다.
- 로드밸런서가 요청을 받는다.
- 헬스체크를 통과한 노드들만 풀에 남긴다.
- 요청을 여러 노드에 분산한다.
- 장애 노드는 풀에서 제외한다.
- 새 노드가 추가되면 트래픽을 함께 처리한다.
다만 클러스터와 로드밸런서는 같은 것이 아닙니다. 로드밸런서는 들어오는 트래픽을 나눠 주는 장치이고, 클러스터는 뒤쪽 서버들이 함께 일하도록 조직된 구조입니다. 둘은 자주 같이 등장하지만 책임이 다릅니다.
패턴 3. 쿠버네티스 클러스터
요즘 가장 대표적인 클러스터 예시는 쿠버네티스입니다. 쿠버네티스 클러스터는 control plane과 worker node로 나뉘며, control plane이 전체 상태를 관리하고 worker node가 실제 워크로드를 실행합니다.
이 구조의 장점은 사람 손으로 서버 하나하나를 붙잡지 않아도 된다는 점입니다. 스케줄링, 장애 복구, 재배치, 복제 수 유지 같은 운영을 control plane이 대신 수행하므로, 클러스터가 단순한 서버 묶음을 넘어 오케스트레이션 플랫폼으로 작동하게 됩니다.
Kubernetes Cluster
- Control Plane
- API Server
- Scheduler
- Controller Manager
- etcd
- Worker Nodes
- kubelet
- runtime
- application workloads
쿼럼, 펜싱, 스플릿 브레인
클러스터에서 통신이 끊기면 한쪽은 상대가 죽었다고 생각할 수 있습니다. 그런데 실제로는 둘 다 살아 있다면, 같은 리소스를 두 노드가 동시에 잡으려 하거나 같은 데이터를 동시에 쓰려 드는 문제가 생길 수 있습니다. 이것이 흔히 말하는 split brain입니다.
이 문제를 줄이기 위해 HA 클러스터는 보통 quorum과 fencing을 사용합니다. quorum은 “과반수의 투표가 있는 쪽만 계속 동작한다”는 기준이고, fencing은 응답하지 않거나 위험한 노드를 외부 수단으로 강제로 차단하거나 재부팅해 자원 충돌을 막는 장치입니다.
| 개념 | 무엇을 해결하나 | 핵심 아이디어 |
|---|---|---|
| Quorum | 분할 상황에서 누가 계속 동작할지 결정 | 보통 과반수 기준으로 운영 지속 여부를 정함 |
| Fencing | 문제가 있는 노드가 공유 자원을 계속 잡는 상황 방지 | 외부 장치나 전원 제어로 노드를 강제로 차단 또는 재부팅 |
| Split Brain | 둘 다 자신이 정상이라고 믿고 동시에 활성화되는 위험 | 가장 위험한 데이터 무결성 사고로 이어질 수 있음 |
수평 클러스터와 수직 클러스터
| 구분 | 수직(Vertical) 클러스터 | 수평(Horizontal) 클러스터 |
|---|---|---|
| 구성 | 한 컴퓨터 안에 같은 타입 인스턴스를 여러 개 올림 | 여러 물리/가상 머신에 나눠 배치 |
| 장점 | 관리와 테스트가 비교적 단순할 수 있음 | 장애 분산과 확장성에 유리함 |
| 단점 | 하드웨어 한계와 단일 장애 지점 문제를 크게 줄이지 못함 | 네트워크, 상태 동기화, 운영 복잡도가 올라감 |
| 적합한 경우 | 간단한 분리, 단일 머신 내부 자원 활용 | 실제 서비스 운영, 고가용성, 대규모 확장 |
실무에서는 “클러스터”라고 하면 보통 수평 클러스터를 먼저 떠올리는 경우가 많습니다. 고가용성과 장애 분산이라는 본래 목적에 더 잘 맞기 때문입니다.
한계와 주의점
클러스터를 도입한다고 자동으로 무중단, 무한 확장, 무결성이 생기는 것은 아닙니다. 노드가 많아질수록 오히려 통신 문제, 일부 노드만 느린 상황, 상태 불일치, 롤링 배포 중 이상 상태 같은 새로운 문제가 생깁니다.
특히 상태가 있는 서비스일수록 클러스터 설계가 어렵습니다. 무상태 웹 서버는 비교적 단순하게 여러 대를 늘릴 수 있지만, 데이터베이스나 메시지 시스템, 공유 스토리지가 얽힌 서비스는 복제, 리더 선출, 쿼럼, 펜싱을 함께 봐야 합니다.
- 구성 요소 수 증가로 인한 운영 복잡도 상승
- 노드 간 통신과 동기화 비용
- 상태 저장소와 데이터 무결성 문제
- 장애 원인 파악 난이도 증가
- 로드밸런서, 제어 계층, 공유 스토리지 등 추가 인프라 비용
자주 하는 실수
- 서버 여러 대 = 클러스터라고 생각함
- 로드밸런서만 두고 상태 관리와 장애 전환은 설계하지 않음
- 고가용성 클러스터에서 쿼럼과 펜싱을 가볍게 봄
- 무상태 서비스와 상태 저장 서비스를 같은 방식으로 확장하려 함
- 클러스터 도입만으로 자동 무중단이 된다고 생각함
- 수평 확장 전에 shared state와 session, cache, storage 문제를 정리하지 않음
- 쿠버네티스 클러스터를 단순한 서버 묶음으로만 보고 control plane 중요성을 과소평가함
실무 루틴
- 먼저 이 서비스가 무상태인지 상태 저장형인지 구분한다.
- 고가용성이 목표인지, 처리량 확장이 목표인지 우선순위를 정한다.
- 트래픽 진입점이 로드밸런서인지, 프록시인지, DNS 기반 분산인지 정한다.
- 상태를 공유 저장소에 둘지, 복제할지, 노드에 두지 않을지 결정한다.
- 장애 감지, 페일오버, 쿼럼, 펜싱 전략을 설계한다.
- 배포, 롤링 업데이트, 유지보수 중 행동까지 함께 생각한다.
- 마지막으로야 노드 수와 토폴로지를 확정한다.
디버깅
클러스터 장애를 볼 때 가장 먼저 나눌 질문
- 요청이 잘못 분산되는가?
- 노드가 정말 죽었는가, 아니면 네트워크만 끊겼는가?
- 상태 저장소가 일관적인가?
- 페일오버 조건이 충족되었는가?
- control plane / manager가 정상 판단을 하고 있는가?
요약
- ✅ 클러스터는 두 대 이상 노드가 함께 하나의 작업이나 서비스를 수행하도록 구성된 구조다.
- ✅ 목적은 보통 고가용성, 부하 분산, 수평 확장, 병렬 처리에 있다.
- ✅ HA 클러스터의 핵심은 장애 시 안전한 failover다.
- ✅ 로드밸런싱 클러스터는 여러 노드가 동시에 트래픽을 처리한다.
- ✅ 쿠버네티스 클러스터는 control plane과 worker node로 나뉘는 대표적 현대 클러스터다.
- ✅ 쿼럼과 펜싱은 split brain와 데이터 손상을 막는 핵심 장치다.
- ✅ 수평 클러스터는 고가용성과 확장성에, 수직 클러스터는 단순한 자원 활용에 더 가깝다.
- ✅ 클러스터는 서버를 많이 두는 문제가 아니라, 여러 노드를 안전하게 조정하는 문제다.