분산처리

kafka의 기본 구성요소들 broker, topic, partition

aeongsseu 2023. 1. 14. 15:49

kafka는 다음과 같은 기본 구성요소들이 있습니다.

1. producer(publisher, source application)

2. consumer(subscriber, target application)

3. broker

4. topic

5. partition

 

이번글에선 broker,topic,partition에 대해 알아보겠습니다.

 

broker

broker는 실제 컴퓨터 한대의 논리적인 단위입니다.

producer와 consumer bootstrap.server설정에 넣던 주소가 broker의 주소인 것이죠

broker는 보통 고가용성을 위해 최소 3대 이상 구동됩니다.

broker들의 한 묶음이 kafka 클러스터 입니다.

 

topic

topic은 직역하면 주제입니다.

topic은 데이터를 나누는 카테고리라 생각하시면 됩니다.

producer가 특정 topic에 대한 데이터를 kafka cluster에 보내면 해당 topic을 구독하는 consumer group에서 해당 데이터를 소비해갑니다.

kafka를 설명할때 신문을 예시로 많이 드는데, OO일보를 구독하면 해당 신문사에서 발행한 신문이 집앞으로 배달되는 것처럼 말이죠.

 

partition

partition은 실제로 데이터가 저장되는 곳입니다.

한 topic안에 여러 partition이 존재할 수 있는데, 이는 성능향상을 위해서입니다.

일반적인 분산시스템에서 4개의 프로듀서가 전송하는데 1초가 걸리는 데이터를 하나의 파티션에 보냈다면 1초만 걸릴겁니다.

하지만 kafka의 경우 데이터의 순서를(offset) 보장해야하므로 4초가 걸리게 됩니다.

하지만 partition이 2개라면? 4/2초 만큼 걸리게 되겠죠.

그러면 partition이 많을수록 좋을까요?

 

카프카는 고가용성을 위해서 리플리케이션을 지원합니다. 리플리케이션이란 아래서 설명하겠지만 쉽게 말해 원본 데이터를 복제해두는 것인데, 카프카에서는 파티션마다 리플리케이션이 동작하게 되어 한 개의 리더와 나머지 파티션은 팔로워의 역할을 하게 됩니다. 따라서 만약 브로커에 장애가 발생했을 경우 각 파티션들의 리더를 선출해야 하므로 파티션의 수가 증가함에 따라 시간이 새로운 리더 선출에 대한 시간이 비례하여 상승하게 됩니다. 또 kafka는 모든 파일에 대해 핸들을 열고 파티션 수가 많을 수록 참조하는 수가 많아지므로 리소스를 낭비하게 됩니다.

 

또한 카프카에서 파티션을 증가하는 것은 아무 때나 변경이 가능하지만, 맘대로 파티션 수를 줄일 수는 없습니다(토픽을 통째로 지워야함). 따라서 파티션의 수를 정할 때 원하는 목표 처리량의 기준을 잡고 조금씩 파티션의 수를 늘려가며 적당하게 개수를 유지하는 것이 좋습니다.

카프카에서는 브로커당 약 2천 개 정도의 최대 파티션 수를 권장하고 있습니다.

 

그럼 또 왜 파티션 개수를 줄일 수 없는지 궁금하신분들이 계실겁니다. 저처럼 말이죠.

사실 파티션의 어떤 이론적인 구조 때문이 아닌 사실 카프카를 이루는 여러 설게 요인이 복합적으로 적용되어서라고 합니다.

다수 브로커에 분배되어있는 세그먼트를 다시 재배열하는것에 상당한 리소스가 사용되기 때문이라고 하네요.

 

replication

위에서 브로커를 여러대 구동한다 했는데, 실제로 producer가 데이터를 발행하고 consumer가 소비해가는 leader partition이 있는 브로커를 제외한 나머지 브로커에는 leader partition을 읽어서 복제해두는 follower partition이 존재합니다.

한 브로커에 하나의 토픽에대해 한개의 파티션만 두므로 replication 개수는 broker개수를 넘을 수 없습니다.

 

config

브로커는 여러 설정값이 있습니다. 이러한 설정의 대부분은 기본값이 제공되지만 다음 3가지 설정은 반드시 설정해줘야 합니다.

  • broker.id
  • log.dirs
  • zookeeper.connect

 broker.id 는 같은 카프카 클러스터에서 현재 브로커를 식별하기 위한 숫자입니다. 따라서 다른 브로커와 다른 숫자를 설정해야 합니다. 일반적으로는 0 혹은 1부터 순차적으로 설정합니다.

 log.dirs 설정은 브로커가 프로듀서로부터 받는 메시지들을 저장할 위치 경로를 지정하는 설정입니다. 기본 값은  /tmp/kafka-logs입니다. 여기서 주의해야 할 것은 기본 값이 /tmp/ 하위에 지정되기 때문에 OS 설정에 따라 임의로 삭제될 수 있습니다. 그러므로 안전한 별도의 위치로 꼭 지정해주시길 바랍니다.

 zookeeper.connect 는 카프카 클러스터의 메타 정보를 저장할 주키퍼에 관한 호스트 연결 정보를 가집니다. 호스트 연결 정보는 hostname:port로 구성되며, 동일한 주키퍼 클러스터의 여러 노드를 ', '로 구분한 문자열로 지정할 수 있습니다. 예를 들어 'zookeeper01:2181, zookeeper02:2181'와 같이 지정할 수 있습니다. 또한 주키퍼 내부에서 데이터를 저장할 위치를 함께 설정할 수 있습니다. 이럴 경우에는 'zookeeper01:2181, zookeeper02:2181/my/path'와 같이 설정하면 됩니다.