콘텐츠로 이동
Study NoteKafka

3. 클러스터

복제는 “몇 부를 두는가”가 아니라 “몇 부가 따라와야 성공으로 치는가”까지 정해야 완성된다

이 장에서 처음 나오는 말5개
복제 계수Replication Factor (RF)
파티션 하나를 몇 부 두는가. RF=3이면 같은 파티션이 브로커 세 대에 있다.
리더 / 팔로워Leader / Follower
파티션 복제본 중 읽기·쓰기를 받는 한 부가 리더, 리더를 따라 복사하는 나머지가 팔로워다.
ISRIn-Sync Replicas
리더를 "충분히 따라잡고 있는" 복제본의 명단. 유실 없는 장애 극복(failover)의 근거가 되는 집합이다.
컨트롤러Controller
"어느 브로커가 어느 파티션의 리더인가" 같은 클러스터 메타데이터를 관리하고 리더 선출을 하는 역할.
KRaftKafka Raft
컨트롤러들이 Raft 합의로 메타데이터를 관리하는 방식. 별도 ZooKeeper 클러스터를 없앤 현재의 표준 구조다.

브로커 — 파티션이 흩어지는 곳

섹션 제목: “브로커 — 파티션이 흩어지는 곳”

브로커는 Kafka 서버 프로세스 하나다. 토픽의 파티션들은 여러 브로커에 흩어져, 토픽 하나의 용량과 처리량이 브로커 한 대에 묶이지 않는다.

문제는 브로커가 죽을 때다 — 그 브로커에만 있던 파티션은 통째로 사라진다. 그래서 복제가 필요하다.

파티션마다 복제본을 RF부 둔다. 그중 리더 한 부만 프로듀서·컨슈머를 상대하고, 팔로워들은 리더에서 데이터를 당겨 와 복사한다.

프로듀서와 컨슈머가 파티션 리더 브로커만 상대하고, 리더가 팔로워 둘에게 복제하는 구조
  • 리더가 죽으면 팔로워 중 하나가 새 리더로 선출된다 — 클라이언트는 잠깐의 재시도 후 새 리더로 붙는다. 이 짧은 전환이 Kafka의 고가용성이다
  • 리더 역할은 파티션 단위라, 브로커들이 서로 다른 파티션의 리더를 나눠 맡는다 — 부하가 자연히 분산된다
  • 프로덕션 기본값은 RF=3이다. RF=2는 한 대 장애 중 남은 한 대가 단일 장애점이 되고, RF=1은 브로커 장애 = 데이터 유실이다

ISR — “따라온 복제본”의 명단

섹션 제목: “ISR — “따라온 복제본”의 명단”

복제가 있어도 질문이 남는다 — 팔로워가 미처 복사하기 전에 리더가 죽으면? 그 답을 주는 장치가 ISR이다.

  • 리더는 “충분히 따라잡고 있는” 복제본 명단(ISR)을 유지한다. 뒤처진 팔로워는 명단에서 빠지고, 따라잡으면 다시 들어온다
  • 리더 선출은 ISR 안에서만 한다 — 명단에 있는 복제본은 커밋된 데이터를 다 갖고 있으므로, 유실 없이 리더를 넘길 수 있다
  • ISR 밖 복제본을 리더로 뽑는 것(unclean leader election)은 유실을 감수하는 선택이라 기본값으로 꺼져 있다

여기에 나사가 둘 더 있다. 셋이 한 세트다 —

나사누가 조이나의미
replication.factor=3토픽 설정세 부를 둔다
min.insync.replicas=2토픽/브로커 설정최소 두 부가 살아 있어야 쓰기를 받는다
acks=all프로듀서 설정ISR 전원이 받았을 때만 성공으로 친다 (4장)

컨트롤러와 KRaft — 클러스터의 머리

섹션 제목: “컨트롤러와 KRaft — 클러스터의 머리”

“파티션 0의 리더는 브로커 1”이라는 메타데이터 자체는 누가 관리하는가 — 컨트롤러다. 브로커 생사를 감시하고, 죽으면 새 리더를 선출해 전파한다.

  • 예전 (~3.x): 이 일을 별도 시스템 ZooKeeper에 맡겼다 — Kafka를 쓰려면 ZooKeeper 클러스터를 하나 더 운영해야 했다
  • 지금 (4.0~): 컨트롤러 노드들이 Raft 합의로 메타데이터를 직접 관리한다(KRaft). ZooKeeper는 코드에서 제거됐다. 운영 대상이 하나로 줄었고, 파티션이 아주 많은 클러스터의 장애 복구도 빨라졌다

노드는 역할을 갖는다 —

역할하는 일언제
broker데이터 저장·서빙프로덕션 기본
controller메타데이터·리더 선출 (보통 3대)프로덕션 기본 — broker와 분리
combined (겸임)둘 다개발·소규모. 데이터 부하가 합의 지연을 만들 수 있어 프로덕션 비권장

Strimzi에서는 이 역할 배치를 KafkaNodePool로 선언한다 (9장).

  • 파티션은 브로커들에 흩어지고, 복제(RF=3)로 브로커 장애를 견딘다 — 읽기·쓰기는 리더로만
  • ISR은 “따라온 복제본” 명단 — 명단 안에서만 리더를 뽑기에 장애 극복이 유실 없이 된다
  • 표준 조합: RF=3 + min.insync.replicas=2 + acks=all. 하나만 빠져도 구멍
  • 메타데이터는 KRaft 컨트롤러(보통 3대)가 관리 — ZooKeeper는 이제 없다