운영 중인 Kafka 클러스터에 브로커를 추가하는 작업은 브로커 설치 · 기동과 기동 후 파티션 재배치(reassignment) 두 단계로 나뉜다. 브로커를 추가해도 기존 토픽 파티션은 자동으로 옮겨가지 않으므로 재배치를 하지 않으면 새 브로커는 비어 있는 채로 부하를 받지 않는다. 시작 전에 클러스터가 KRaft 모드인지 ZooKeeper 모드인지 확인한다(Kafka 4.0 부터 ZooKeeper 는 제거됐다).
기존과 동일한 Kafka 버전을 설치하고 server.properties(KRaft 는 kraft/server.properties) 에서 다음을 맞춘다.
broker.id(KRaft 는 node.id) — 클러스터 안에서 유일해야 한다.zookeeper.connect, KRaft 모드는 controller.quorum.voters 와 process.roles 를 기존 클러스터와 동일하게.listeners / advertised.listeners — 새 브로커의 실제 접근 주소.log.dirs — 디스크 용량 확인.KRaft 모드는 기동 전에 기존 클러스터의 cluster.id 로 스토리지를 포맷한다. 새 ID 를 만들면 안 된다.
bin/kafka-storage.sh format \
--config config/kraft/server.properties \
--cluster-id <기존_CLUSTER_ID>
bin/kafka-server-start.sh -daemon config/server.properties
# 합류 확인
bin/kafka-broker-api-versions.sh --bootstrap-server <기존_브로커>:9092
옮길 토픽을 JSON 으로 적고 새 브로커를 포함한 전체 브로커 ID 로 계획을 생성한다.
{
"topics": [
{"topic": "my-topic-a"},
{"topic": "my-topic-b"}
],
"version": 1
}
bin/kafka-reassign-partitions.sh \
--bootstrap-server <BROKER>:9092 \
--topics-to-move-json-file topics-to-move.json \
--broker-list "1,2,3,4" \
--generate
출력된 "Proposed partition reassignment configuration" 을 reassignment.json 으로 저장한 뒤 실행한다. 운영 클러스터에서는 재배치 트래픽이 정상 트래픽을 잠식하지 않도록 --throttle 을 반드시 건다.
bin/kafka-reassign-partitions.sh \
--bootstrap-server <BROKER>:9092 \
--reassignment-json-file reassignment.json \
--throttle 50000000 \
--execute
bin/kafka-reassign-partitions.sh \
--bootstrap-server <BROKER>:9092 \
--reassignment-json-file reassignment.json \
--verify
--verify 에서 모두 completed 가 되면 throttle 이 자동 해제된다. 파티션 균형을 더 정교하게 잡으려면 Cruise Control 을 검토한다.
ulimit -n, 디스크 I/O, 네트워크 대역폭을 기존 브로커와 동등하게 맞춘다.bootstrap.servers 는 일부 브로커만 적어도 동작하지만 가용성을 위해 새 브로커도 추가한다.broker.rack 을 지정해 복제본이 같은 랙에 몰리지 않게 한다.