
Apache Kafka는 ZooKeeper라고 하는 컴포넌트들과 Cluster로 구성되어 있고 Kafka Cluster 내에는 여러개의 Broker들로 구성되어 있다.

Kafka Broker : Topic과 Partition에 대한 Read 및 Write를 관리하는 소프트웨어다. Kafka Server라고 부르기도 한다. Topic내의 Partition들을 분산, 유지 및 관리해준다. 각각의 Broker들은 ID로 식별된다.(단 ID는 숫자)
Kafka Cluster : 여러개의 Broker들로 구성된다. Client는 특정 Broker에 연결하면 전체 Cluster에 연결된다. 최소 3대 이상의 Broker를 하나의 Cluster로 구성해야 한다. (4대 이상을 권장한다.)

Broker ID와 Partition Id 간에는 아무런 관계가 없다. Broker에는 하나 이상의 Topic이 저장되며 Topic은 하나 이상의 Partition으로 나눠진다. Topic을 구성하는 Partition들은 여러 Broker 상에 분산된다. Topic 생성 시 kafka가 자동으로 Topic을 구성하는 전체 Partition들을 모든 Broker에게 할당해주고 분배해준다.

모든 kafka Broker는 BootStrap Server라고 부른다. Client(Producer, Consumer)가 Broker에 접속을 할 때 BootStrap Server라는 Parameter를 통해서 접속한다.
Client가 특정 하나의 Broker에만 연결을 하면 자동으로 Broker가 Broker 전체 List를 전달해준다. Client는 이 정보를 통해서 내가 접속해야(Read/Write) 하는 Topic 그리고 그 Topic을 구성하는 Partition이 어디에 있는지 알게 되고 Client는 자동으로 자기가 필요한 Broker들로 연결된다. 하지만 특정 Broker 장애를 대비하여 전체 Broker List(IP, Port)를 파라미터로 입력하는 것이 권장된다.

Zookeeper는 Broker를 관리(Broker 들의 목록/설정을 관리) 하는 소프트웨어다.
Zookeeper는 변경사항에 대해 Kafka에 알린다. (Topic 생성/제거, Broker 추가/제거 등)
Zookeeper 없이는 Kafka가 작동할 수 없다. (2022년에 Zookeeper를 제거한 정식 버전 출시 예정중)
Zookeeper는 홀수의 서버로 작동하게 설계되어 있다. (최소 3, 권장 5)
Zookeeper에는 Leader(writes)가 있고 나머지 서버는 Follwer(reads)다.

Zookeeper는 분산형 Configuration 정보 유지, 분산 동기화 서비스를 제공하고 대용량 분산 시스템을 위한 네이밍 레지스트리를 제공하는 소프트웨어다.
분산 작업을 제어하기 위한 Tree 형태의 데이터 저장소
--> Zookeeper를 사용하여 멀티 Kafka Broker들 간의 정보(변경 사항 포함) 공유, 동기화 등을 수행한다.
위의 그림을 보면 가운데 있는 Zookeeper Server 2가 Leader 역할을 하고 양쪽에 있는 1,3번은 Follower 역할을 하고 있다.
Zookeeper는 Kafka에 Broker가 몇대며 Topic이 몇개고 Partition이 몇개인지 같은 정보들을 가지고 있다. 그 정보들을 Leader가 메인으로 가지고 있고 Follower가 복제해서 가지고 있으며 밑에 있는 Broker들 쪽으로 동기화해서 내려주는 구조다.