관리 메뉴

The Nirsa Way

[Apache Kafka] 적절한 파티션 수를 구하는 방법 본문

Development/Apache Kafka

[Apache Kafka] 적절한 파티션 수를 구하는 방법

KoreaNirsa 2025. 7. 21. 14:32
반응형

 

적절한 파티션 수를 구하는 방법

컨플루언트 Docs를 보면 max(t/p, t/c) partitions와 같은 공식을 기준으로 파티션 수를 계산하라는 언급이 있습니다. 

https://docs.confluent.io/kafka/operations-tools/partition-determination.html

 

현재 저는 Key 기반으로 카프카를 실습중이며 컨플루언트의 기술 블로그 중 내용을 보면 Key 기반으로 메시지를 전송하는 경우 주의해야 한다는 내용이 작성되어 있습니다. 해시 함수를 이용해 Key를 라우팅하게 되는데 파티션 수가 증가하면 다른 파티션으로 라우팅 될 가능성이 생겨 순서 보장이 깨질 수 있다는 내용입니다.

그렇기 때문에 보통 오버 파티셔닝을 하여 파티션 수를 계산할 때 현재가 아니라 향후 1~2년간의 예상 처리량을 기준으로 파티션을 결정한다고 합니다.

https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/

 

이제 파티션 수를 결정해 볼텐데, 아래와 같은 예상 시나리오를 기반으로 진행합니다. 향후 2년 내 3,000 TPS까지 증가가 예상되는 상황이며 서비스 초기에는 적은 수의 브로커로 시작하여 추후 확장 시 브로커를 늘리기 위한 시나리오 입니다.

  1. 하루에 약 100만건의 주문 발생
  2. 현재 TPS (초당 주문 수): 평균 500 TPS, 피크 시 1,000 TPS
  3. 2년 내 3배 성장 예상하며 최대 TPS는 3,000TPS 까지 증가 예상

위의 시나리오로 인해 향후 2년 TPS를 기준으로 t는 3,000으로 지정하겠습니다. 이번에는 c를 구해야 하는데 c는 각 Consumer 인스턴스가 처리 가능한 TPS라고 생각하시면 됩니다.

각 Consumer 인스턴스는 500 TPS까지 처리 가능하다는 전제를 깔고 c는 500이라고 가정하겠습니다. 만약 값을 구해보시려면 카프카에 인스턴스를 1개만 올려놓고 최대 TPS를 어느정도까지 버틸 수 있는지 벤치마킹을 따로 돌려서 진행하시면 됩니다.

bin/kafka-consumer-groups.sh --bootstrap-server 192.168.223.128:9092 --describe --group order-group --members

 

참고로 Consumer 인스턴스 수를 구하는 방법은 아래의 내용들을 확인해보시면 되는데, 우선 저의 현재 Consumer 인스턴스를 확인해보면 order-group의 Consumer 인스턴스 수는 1입니다.

bin/kafka-consumer-groups.sh --bootstrap-server 192.168.223.128:9092 --describe --group order-group --members

 

이번에도 컨플루언트의 Docs를 보면 Consumer Group 내에서 파티션당 최대 하나의 Consumer 인스턴스를 가질 수 있다고 합니다. 그 이상은 Idle 상태가 되기 때문에 아주 간단히는 파티션 수 = Consumer 인스턴스 수라고 보시면 됩니다.

조금 더 보면 ceil(t/c)로 나누어 생각해야 하는데 초당 메시지 수(TPS)와 Consumer 1개가 처리 가능한 TPS를 구해야 합니다. 위의 시나리오에서 t는 3,000이고 Consumer 인스턴스 1개당 500 TPS까지 감당이 가능하다면 필요한 인스턴스 수는 6가 될겁니다. 

https://docs.confluent.io/kafka/operations-tools/partition-determination.html?utm_source=chatgpt.com

 

 

이제 마지막으로 파티션에서 가능한 처리량을 구해야 하는데 메시지 크기, 로직 등 다양한 요인에서 영향을 받으므로 벤치마킹을 진행해보아야 합니다. 벤치마킹하여 성능을 테스트 하는것은 추후 포스팅하도록 하겠습니다. 현재는 파티션당 처리량(p)은 700TPS로 지정하겠습니다.

최종적으로 정리해보면 다음과 같습니다.

  1. t : 3,000
  2. c : 500
  3. p : 700

계산식을 대입했을 때 max(4.29, 6) 이므로 파티션은 6개 정도가 적절하며, 오버 파티셔닝을 권장하기에 상황에 따라 1.5배 ~ 2배 가량 여유를 두어 9~12개로 늘리는 것도 좋다고 보입니다. 또는 애초에 확장성을 두어 더 많은 파티션을 잡아두는 것도 좋다고 보입니다. (너무 많은 파티션은 오히려 성능에 좋지 않지만, 수십개 수준에서는 대부분 영향이 거의 없다고 보입니다) 

이러한 케이스는 계산식을 도입하여 파티션 수를 구했을 뿐 여러가지 요인에 따라 달라지므로 너무 맹신해서는 안됩니다.

또한 아래의 내용을 보면 브로커당 파티션 수는 2000~4000개를 넘기지 않는것이 좋다는 언급도 있으니 너무 많아도 여러 문제로 인해 좋지 않은 케이스가 있습니다.

https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/?utm_source=chatgpt.com

 

반응형