이 글의 코드 및 정보들은 책을 바탕으로 작성하였습니다.
카프카 파티션 설정
-
카프카 데이터 모델글을 통해
-
토픽의 파티션을 늘리고
-
그 수만큼 프로듀서도 늘려줘야
-
카프카를 효율적으로 사용할 수 있음을 알았다.
-
그런데 여기서 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개 정도의 최대 파티션 수를 권장한다.