카프카, 산전수전 노하우
발표자(peter.ko)
kakao corp.(인프라2팀)
- 카카오 인프라팀 소속
- 페이스북 KAFKA 한국 사용자 그룹 개설자

(facebook.com/groups/kafkakorea/)
- <카프카, 데이터 플랫폼의 최강자> 저자 

예스24 IT 분야 1위(이틀..;)
- Popit.kr 저자, 개인 브런치 운영 중
고승범 (peter.ko)
‣ 카프카의 현황
‣ 트러블 슈팅
‣ Shrinking ISR
‣ Rack Power
‣ 프로듀서와 컨슈머
‣ 운영
오늘 나눌 이야기
카프카의 현황
주키퍼 3EA
카프카 3EA
카프카 클러스터
2 클러스터 / 10EA 7 클러스터 / 130EA
7 클러스터 / 130EA
B IDC
카프카
카프카
카프카
카프카
주키퍼
A IDC
카프카
카프카카프카
주키퍼 추천
카카오스토어
다음검색
카카오톡
다음메일
카카오스토리
카카오톡치즈
카카오TV
다음웹툰
카카오선물하기
카카오내비
카카오버스
카카오맵
카카오게임
카카오i
260,000,000,000 / day
240 TB / day 370 TB / day
가동률 99.99%
1시간 / 2년
트러블슈팅
1. Shrinking ISR
ISR이란?
‣ In-Sync Replicas(ISR)
‣ 리플리케이션 구성원은 리더와 팔로워
‣ 리더만 읽고 쓰기
‣ 팔로워들은 리더를 주기적으로 동기화
‣ ISR의 구성원만이 리더의 자격을 갖는다.
카프카 클러스터
peter-topic

partition-0
peter-topic

partition-0
peter-topic

partition-0
ISR & RF3
ISR ISR
Broker1 Broker2 Broker3
카프카 클러스터
peter-topic

partition-0
peter-topic

partition-0
peter-topic

partition-0
Shrinking ISR
ISR
Broker1 Broker2 Broker3
카프카 문제 있나요?
카프카 클러스터
Broker5Broker4Broker3 Broker6 Broker7
topic01 topic01 topic01
topic02 topic02 topic02
topic03 topic03 topic03
topic04topic04
topic05 topic05
[2000-00-00 00:00:00,001] INFO Partition [__consumer_offsets,19] on broker 5: Shrinking ISR for
partition [__consumer_offsets,19] from 3,4,5 to 5 (kafka.cluster.Partition)
[2000-00-00 00:00:00,002] INFO Partition [__consumer_offsets,29] on broker 5: Shrinking ISR for
partition [__consumer_offsets,29] from 4,5,6 to 5 (kafka.cluster.Partition)
[2000-00-00 00:00:00,003] INFO Partition [__consumer_offsets,9] on broker 5: Shrinking ISR for
partition [__consumer_offsets,9] from 3,5,2 to 5 (kafka.cluster.Partition)
Broker5
Broker4
Broker3
Broker6
Broker7
카프카 클러스터
0.10.1.0 버그
카프카 버전 업그레이드
‣ 다운타임을 가질 수 있는 환경
‣ 전체 브로커 종료 후 버전 업그레이드 진행
‣ 다운타임을 가질 수 없는 환경
‣ 클러스터내 브로커 한대씩 버전 업그레이드를 진행
‣ 카카오에서는..
‣ 크리티컬 이슈가 발생하거나 신규 기능이 추가되는 경우
다운타임없이 버전 업그레이드 진행
2. Rack Power
IDC
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
Rack
카프카 클러스터
RACK1 RACK2 RACK3
Broker1
Web1
Broker2
Web2
Broker3
모든 브로커 다운
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: B
peter-topic

message: B
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: B
peter-topic

message: B
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: B
peter-topic

message: B
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: B
peter-topic

message: B
peter-topic

message: C
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: B
peter-topic

message: B
peter-topic

message: C
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: B
peter-topic

message: B
peter-topic

message: C
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: B
peter-topic

message: B
peter-topic

message: C
peter-topic

message: D
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: B
peter-topic

message: C
peter-topic

message: D
peter-topic

message: B
peter-topic

message: C
peter-topic

message: D
peter-topic

message: B
peter-topic

message: C
peter-topic

message: D
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: B
peter-topic

message: B
peter-topic

message: C
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: B
peter-topic

message: B
peter-topic

message: C
peter-topic

message: D
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: D
peter-topic

message: D
peter-topic

message: D
카프카 클러스터
RACK1 RACK2 RACK3
Broker1 Broker2 Broker3
peter-topic

message: A
peter-topic

message: A
peter-topic

message: A
peter-topic

message: D
peter-topic

message: D
peter-topic

message: D
서비스의 영속성, 데이터 정합성
프로듀서와 컨슈머
1. 프로듀서
프로듀서
‣ 프로듀서는 파티션의 리더로 직접 메시지를 전송
‣ 특정 파티션 또는 랜덤 파티션으로 전송
‣ 빠른 전송 속도 보장
‣ 효율성이 좋은 배치 처리 가능
‣ 설정을 통해 배치 크기나 지연시간 조정
프로듀서 ACKS
‣ ACKS = 0
‣ 매우 빠르게 전송할 수 있지만, 파티션의 리더가 받았는지 알 수 없음
‣ ACKS = 1(Strongly Recommend)
‣ 메시지 전송도 빠른편이고, 파티션의 리더가 받았는지 확인
‣ 가장 많이 사용되고, 최근 대부분의 기본값으로 사용
‣ ACKS = ALL
‣ 메시지 전송 속도는 가장 느리지만, 손실 없는 메시지 전송 가능
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
RF3
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A
ack
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A message: A message: A
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A message: A message: A
message: B
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A message: A message: A
message: B
ack
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A message: A message: A
message: B
ack
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A message: A message: A
message: B
ack
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A
message: B
message: Amessage: A
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A
message: B
message: Amessage: A
message: C
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A
message: B
message: Amessage: A
message: C
ack
message: C
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A
message: B
message: Amessage: A
message: Cmessage: C
message: D
Broker1 Broker2 Broker3
프로듀서 ack=1
peter-topic peter-topic peter-topic
message: A
message: C
message: Amessage: A
message: Cmessage: C
message: Dmessage: Dmessage: D
특정 파티션이 이상해요..
문제 있나요?
프로듀서 KEY
Topic: peter-topic, Partition: 1, Offset: 33, Key: a, Received message: Apache Kafka is 1
Topic: peter-topic, Partition: 1, Offset: 34, Key: a, Received message: Apache Kafka is 2
Topic: peter-topic, Partition: 1, Offset: 35, Key: a, Received message: Apache Kafka is 3
Topic: peter-topic, Partition: 1, Offset: 36, Key: a, Received message: Apache Kafka is 4
Topic: peter-topic, Partition: 1, Offset: 37, Key: a, Received message: Apache Kafka is 5
Topic: peter-topic, Partition: 1, Offset: 31, Key: None, Received message: Apache Kafka is 9
Topic: peter-topic, Partition: 1, Offset: 32, Key: None, Received message: Apache Kafka is 10
Topic: peter-topic, Partition: 0, Offset: 23, Key: None, Received message: Apache Kafka is 1
Topic: peter-topic, Partition: 0, Offset: 24, Key: None, Received message: Apache Kafka is 4
Topic: peter-topic, Partition: 0, Offset: 25, Key: None, Received message: Apache Kafka is 7
2. 컨슈머
컨슈머
‣ 컨슈머는 파티션의 리더에게 "fetch" 요청을 하는 역할
‣ 컨슈머는 위치를 기록하고 있는 오프셋으로부터 메시지를 가져온다.
‣ 컨슈머의 목적은 컨슈머가 가능한 최대 속도로 가져갈 수 있도록 하는 것
파티션의 오프셋 순서대로
파티션의 오프셋 순서대로
컨슈머 그룹
‣ 하나의 토픽을 여러 컨슈머들이 구독
‣ 컨슈머 그룹으로 그룹핑하여 컨슈머를 확장할 수 있다.
‣ 프로듀서가 토픽으로 보내는 메시지 비율을 높인다면?
‣ 컨슈머는 프로듀서의 속도를 따라가지 못하게 된다.
하나의 파티션에는 하나의 컨슈머만 가능
하나의 파티션에는 하나의 컨슈머만 가능
컨슈머 그룹을 이용한 멀티 컨슈머
LAG이 뭔가요?
Burrow
‣ 카프카 컨슈머 Lag Checking
‣ HTTP
‣ Go
‣ https://github.com/linkedin/Burrow
Consumer group
운영
미사용 토픽
토픽 수가 늘기만 하는데,
좋은 방법은 없을까?
JMX로 토픽 상태값을 수집 저장 후 조건에 일치하는 토픽 삭제
topic01
topic02
topic04
topic03
‣ 브로커의 로그
‣ 서비스 영속성, 데이터 정합성
‣ 프로듀서
‣ 컨슈머
‣ 좋은 애플리케이션인 카프카를 적극 활용!!
마무리
감사합니다!!

카프카, 산전수전 노하우