일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 무료 오라클 데이터베이스
- ORA-00922
- Orace 18c
- Oracle 사용자명
- 서평단
- oracle 18c
- ora-01722
- Oracle Express Edition
- 오라클 캐릭터셋 변경
- 오라클 캐릭터셋 조회
- 윈도우 Oracle
- oracle
- 오라클 캐릭터셋 확인
- Oracle 윈도우 설치
- Oracle 18c 설치
- Oracle 초기 사용자
- ORA-12899
- 비전공자를 위한 데이터베이스 입문
- Oracle 테이블 대소문자
- Oracle 18c HR schema
- Oracle 사용자명 입력
- Oracle 테이블 띄어쓰기
- Oracle 18c HR
- 무료 오라클 설치
- Today
- Total
The Nirsa Way
[Apache Kafka] 적절한 파티션 수를 구하는 방법 본문
적절한 파티션 수를 구하는 방법
컨플루언트 Docs를 보면 max(t/p, t/c) partitions와 같은 공식을 기준으로 파티션 수를 계산하라는 언급이 있습니다.
현재 저는 Key 기반으로 카프카를 실습중이며 컨플루언트의 기술 블로그 중 내용을 보면 Key 기반으로 메시지를 전송하는 경우 주의해야 한다는 내용이 작성되어 있습니다. 해시 함수를 이용해 Key를 라우팅하게 되는데 파티션 수가 증가하면 다른 파티션으로 라우팅 될 가능성이 생겨 순서 보장이 깨질 수 있다는 내용입니다.
그렇기 때문에 보통 오버 파티셔닝을 하여 파티션 수를 계산할 때 현재가 아니라 향후 1~2년간의 예상 처리량을 기준으로 파티션을 결정한다고 합니다.
이제 파티션 수를 결정해 볼텐데, 아래와 같은 예상 시나리오를 기반으로 진행합니다. 향후 2년 내 3,000 TPS까지 증가가 예상되는 상황이며 서비스 초기에는 적은 수의 브로커로 시작하여 추후 확장 시 브로커를 늘리기 위한 시나리오 입니다.
- 하루에 약 100만건의 주문 발생
- 현재 TPS (초당 주문 수): 평균 500 TPS, 피크 시 1,000 TPS
- 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가 될겁니다.
이제 마지막으로 파티션에서 가능한 처리량을 구해야 하는데 메시지 크기, 로직 등 다양한 요인에서 영향을 받으므로 벤치마킹을 진행해보아야 합니다. 벤치마킹하여 성능을 테스트 하는것은 추후 포스팅하도록 하겠습니다. 현재는 파티션당 처리량(p)은 700TPS로 지정하겠습니다.
최종적으로 정리해보면 다음과 같습니다.
- t : 3,000
- c : 500
- p : 700
계산식을 대입했을 때 max(4.29, 6) 이므로 파티션은 6개 정도가 적절하며, 오버 파티셔닝을 권장하기에 상황에 따라 1.5배 ~ 2배 가량 여유를 두어 9~12개로 늘리는 것도 좋다고 보입니다. 또는 애초에 확장성을 두어 더 많은 파티션을 잡아두는 것도 좋다고 보입니다. (너무 많은 파티션은 오히려 성능에 좋지 않지만, 수십개 수준에서는 대부분 영향이 거의 없다고 보입니다)
이러한 케이스는 계산식을 도입하여 파티션 수를 구했을 뿐 여러가지 요인에 따라 달라지므로 너무 맹신해서는 안됩니다.
또한 아래의 내용을 보면 브로커당 파티션 수는 2000~4000개를 넘기지 않는것이 좋다는 언급도 있으니 너무 많아도 여러 문제로 인해 좋지 않은 케이스가 있습니다.