Gidhub BE Developer

Kafka 파티션 설정시 고려할 점

2019-11-27
goodGid

이 글의 코드 및 정보들은 을 바탕으로 작성하였습니다.

카프카 파티션 설정

  • 카프카 데이터 모델글을 통해

  • 토픽의 파티션을 늘리고

  • 그 수만큼 프로듀서도 늘려줘야

  • 카프카를 효율적으로 사용할 수 있음을 알았다.

  • 그런데 여기서 2가지 질문을 던질 수 있다.

  1. 무조건 파티션 수를 늘리는게 답일까?

  2. 내 토픽의 적절한 파티션 수는 어떻게 알 수 있을까?


무한 파티션 증가

  • 이전 글에서

  • 토픽의 파티션 수가 증가함에 따라

  • 빠른 전송이 가능하다는 사실을 알았다.

  • 모든것에 장단점이 있듯이

  • 파티션 수를 늘리는게

  • 오히려 카프카에 좋지 않은 영향을 미칠 수도 있다.


장애 복구 시간 증가

  • 카프카는 높은 가용성을 위해

  • 리플리케이션을 지원한다.


  • 브로커에는 토픽이 있고

  • 토픽은 여러 개의 파티션으로 나뉘어 있으므로

  • 브로커에는 여러개의 파티션이 존재한다.


  • 또한 각 파티션마다 리플리케이션이 동작하게 되며

  • 하나는 파티션은 리더

  • 나머지는 파티션의 팔로워가 된다.


  • 만약 브로커가 다운되었는데

  • 파티션의 리더가 해당 브로커에 속해있다면

  • 해당 파티션은

  • 일시적으로 사용할 수 없게 된다.


  • 그러면 카프카는

  • 팔로워 중 하나를 리더로 이동시켜

  • 클라이언트 요청을 처리할 수 있게 한다.


  • 이와 같은 장애 처리는

  • 컨트롤러로 지정된 브로커가 수행한다.

  • 컨트롤러는 카프카 클러스터 내 하나만 존재한다.


  • 만약 컨트롤러 역할을 수행하는 브로커가 다운되면

  • 살아 있는 브로커 중 하나가

  • 자동으로 컨트롤러 역할을 대신한다.

  • (= 살아있는 브로커가 컨트롤러 역할을 하게된다.)


만약 브로커가 다음과 같은 상황에서
1. 총 1,000개의 파티션이 존재 
2. 리더가 해당 브로커에 포함
3. 2개의 리플리케이션 설정 
브로커가 갑자기 종료되면
일시적으로 이 브로커에 있는 1000개의 파티션은 사용할 수 없게 된다.

정상 동작을 하기 위해선
파티션의 리더를 
다른 브로커가 있는 곳으로 이동시켜야 사용할 수 있다.

만약 컨트롤러가 
각 파티션별로 새로운 리더를 선출하는데 
5ms 소요된다고 가정하면

1,000개의 모든 파티션에 대해 
새로운 리더를 선출하는데는 총 5초가 소요되며
일부 파티션의 경우 장애 시간은 5초 이상이어질 수도 있다.

최악의 상황으로 다운된 브로커가
컨트롤러인 경우엔

살아있는 브로커에게 
컨트롤러 역할이 완전히 넘어가기 전까지 
새로운 리더를 선출할 수 없다.

컨트롤러의 Failover는 자동으로 동작하지만 
새 컨트롤러가 초기화하는 동안 
주키퍼에서 모든 파티션의 데이터를 읽어야 한다.

카프카 클러스터에 10,000개의 파티션이 있고
주키퍼에서 데이터를 읽는 데 
파티션당 2ms가 걸린다면
20초가 넘는 시간동안 장애 상황이 발생할 수 있다.

파일 핸들러의 낭비

  • 각 파티션은 브로커의 디렉토리와 매핑되고

  • 저장되는 데이터마다 2개의 파일(인덱스와 실제 데이터)이 있다.


  • 카프카에서는 모든 디렉토리의 파일들에 대해

  • 파일 핸들을 열게 된다.


  • 결국 파티션의 수가 많을수록

  • 파일 핸들 수 역시 많아지게 되어

  • 리소스를 낭비하게 된다.


So What?

  • 이렇게 파티션 수를 무작정 늘리면

  • 우리가 생각하지 못한 문제들이 발생할 수 있다.

  • 따라서 무작정 파티션 수를 늘리기보다는

  • 적절한 값으로 설정해 운영해야한다.


적절한 파티션 수

  • 토픽의 파티션 수를 정하기 위해선

  • 목표 처리량의 기준을 설정해야한다.


  • 프로듀서 입장에서 4개의 프로듀서를 통해

  • 초당 10개의 메시지를 카프카의 토픽으로 보낸다고 하면

  • 카프카의 토픽에서 초당 40개의 메시지를 받아줘야한다.


  • 만약 해당 토픽에서

  • 파티션 1개가 초당 10개의 메시지만 받아준다면

  • 파티션의 수를 1 -> 4개로

  • 목표 처리량을 처리할 수 있게 변경해줘야한다.

  • 그러면 프로듀서 입장에서는 목표 처리량은 달성한다.


  • 하지만 카프카에서는 컨슈머도 고려해줘야한다.

  • 컨슈머 입장에서 8개의 컨슈머를 통해

  • 초당 5개의 메시지를 카프카의 토픽에서 가져온다면

  • 해당 토픽의 파티션 수는 컨슈머 수와 동일하게 8개로 맞추어

  • 컨슈머마다 각 파티션에 접근할 수 있게 해야한다.

  • 왜냐하면 1개의 파티션에는 1개의 컨슈머만 접근이 가능하기 때문이다.

  • 이렇게 목표치를 갖고

  • 파티션 수를 할당하는 것이 가장 이상적인 방법이다.


주의 사항

  • 카프카에서 파티션 수의 증가는 자유롭지만

  • 파티션 수를 줄이는 방법은 제공하지 않는다.

  • 그렇기 때문에 파티션 수를 줄이고 싶다면

  • 토픽을 삭제하는 방법말고는 해결책이 없다.


  • 그렇기 때문에

  • 적절한 파티션 수를 측정하기 어려운 경우에는

  • 일단 적은 수의 파티션으로 운영해보고

  • 프로듀서 또는 컨슈머에서

  • 병목 현상이 발생하면

  • 파티션 수와 프로듀서 또는 컨슈머를 늘려나가는 방법으로

  • 적정 파티션 수를 설정해야한다.


  • 참고로 카프카에서는 브로커당

  • 약 2,000개 정도의 최대 파티션 수를 권장한다.


Reference


Recommend

Index