Open kmg28801 opened 1 year ago
replication factor
/usr/local/kafka/bin/kafka-topics.sh --bootstrap-server kafka1:9092 --create --topic peter-test01 --partitions 1 --replication-factor 3
(실습에서는 리플리케이션 팩터 옵션을 3으로 설정)
descrive로 방금 생성한 토픽을 출력
/usr/local/kafka/bin/kafka-topics.sh --bootstrap-server peter-kafka01.foo.bar:9092 --topic peter--test01 --describe
peter-test01
ISR
test message1
/usr/local/kafka/bin/kafka-dump-log.sh --print-data-log --files /data/kafka-logs/peter-test01-0/0000000000000000.log
peter-kafka02
peter-kafka03
ISR(InsyncReplica)
describe
커밋
하이워터마크
test message2
replication-offset-checkpoint
message1
fetch
message2
메세지 주고받는 기능
푸쉬
풀
리더에포크
1번 오프셋의 message2까지
message3
message4
(실습 생략)
갑작스러운 종료과정
하나의 파티션에 대해 리더 선출은 0.2초만에 완료됨
근데 1만개면, 2000초가 걸림(분으로 환산하면 3분이 조금 넘는 시간)
카프카 1.1.0부터 리더선출 작업속도가 빨라졌음 (https://www.confluent.io/blog/apache-kafka-supports-200k-partitions-per-cluster/)
제어된 종료과정을 그림을 나타냄
SIG_TERM
제어된 종료과정과 갑작스러운 종료과정의 가장큰 차이는 다운타임임
다운타임
카프카 내부적으로 파티션들의 다운타임을 최소화 할 수 있음
그 이유는 브로커가 종료되기 직전 컨트롤러가 해당 브로커가 리더선출 작업을 진행하기 때문임
제어된 종료더라도 일시적인 다운타임은 발생함
메시지(레코드)
세그먼트(로그 세그먼트)
롤링
로그 세그먼트 삭제
컴펙션
server.properties
log.cleanup.policy
delete
retention.byte
메세지(레코드)
_consumer_offset
카프카의 내부 토픽으로, 컨슈머 그룹을 저장하는 토픽
컨슈머 그룹이 어디까지 읽었는지를 나타내는 오프셋 커밋 정보가 키(컨슈머 그룹명, 토픽명) 벨류(오프셋 커밋 정보) 형태로 메세지가 저장됨
로그컴팩션은 메세지의 키값을 기준으로 과거 정보는 중요하지 않고 가장 마지막 값 일 경우에 사용된다
예를 들어서 구매 상태 정보가 주문완료 -> 배송준비 -> 배송 중 -> 배송 완료 일때
주문완료
배송준비
배송 중
배송 완료
구매한 사용자의 아이디(메세지의 키)를 기준으로 최종상태(메세지의 밸류)만 사용자에게 노출하면 되므로 카프카의 로그 컴팩션 기능을 활용할 수 있음
value 는 필수지만, 키는 필수가 아니라 로그 컴팩션 기능을 사용하려면 키값을 필수값으로 전송해야함
빠른 장애 복구 : 로그를 전체 다 보지 않아도 되므로 복구시간을 줄일 수 있음
토픽
파티션
중요한 사실은 실제로 리플리케이션되는 것은 토픽이 아니라 토픽을 구성하는 각각의 파티션들이라는 점입니다. (책 p.115)
프로듀서
리더
컨슈머
4장 카프카의 내부 동작 원리와 구현
이번장에서 배울 내용
4-1 카프카 리플리케이션
4-1.1 리플리케이션 동작 개요
replication factor
라는 옵션을 설정해야함(실습에서는 리플리케이션 팩터 옵션을 3으로 설정)
descrive로 방금 생성한 토픽을 출력
peter-test01
토픽은 파티션 : 1, 리플리케이션 팩터 : 3peter-test01
의 토픽의 파티션 0 에 대한 상세정보ISR
은 동기화 되고있는 리플리케이션들이 브로커 1,2,3을 의미peter-test01
토픽으로test message1
을 전송하고 세그먼트 파일의 내용을 확인하면 1,2,3 브로커가 동일한 메세지를 가지고 있음 세그먼트 파일의 내용 확인하는 명령어peter-kafka02
,peter-kafka03
도 동일한 결과4-1.2 리더와 팔로워
4-1.3 복제유지와 커밋
ISR(InsyncReplica)
라는 논리적 그룹으로 묶여있음, 이 그룹에 속해있는 팔로워만 리더 자격을 가짐describe
명령어에서 존재했던ISR
이 동기화 되고있는 그룹을 의미커밋
을 표시 -> 커밋이 되었다라는건 모든 리플리케이션이 전부 메세지 복제를 했다는것을 의미하이워터마크
라고 부름test message2
는 못읽음test message1
,test message2
를 읽어감(test message2
는 아직 복제 전)test message2
를 복제 못한 팔로워가 리더가 됨test message2
가 없음커밋된 위치가 매우 중요함
replication-offset-checkpoint
라는 파일에 마지막 커밋 오프셋 위치를 저장함 (실습 생략...)4-1.4 리더와 팔로워의 단계별 리플리케이션 동작
message1
이라는 메세지를 가지고 있음fetch
요청을 보낸 후,message1
을 인지하고, 리플리케이션 실행message2
를 프로듀서로 받고 저장message1
메시지가 커밋되었다는 내용도 같이 전달message2
를 복제함메세지 주고받는 기능
에 집중푸쉬
가 아니라 팔로워의풀
방식이라 리더의 부하를 덜어줌4-1.5 리더에포크와 복구
리더에포크
리더에포크 사용하지 않은 경우
message1
수신, 0번에 저장, 팔로워는 0번 오프셋 가져오기 요청message1
메세지를 복제하고message2
를 저장message2
를 저장message2
가 복제되었음을 인지하고 하이워터마크를 2로 올림message2
복제를 완료했지만 아직 리더한테 하이워터마크 올리라는 내용은 전달 못받음message2
를 삭제함message2
가 손실됨리더에포크 사용하는 경우
리더에포크
요청을 보냄리더에포크
요청을 보냄1번 오프셋의 message2까지
라고 팔로워한테 보냄message2
를 삭제하지 않고 리더의 응답을 확인한 후message2
까지 자신의 하이워터마크로 상향조정message2
는 삭제되지 않았고, 메세지 손실은 발생하지 않음리더에포크 사용하지 않고, 리더와 팔로우 둘다 장애가 난 상황
message2
를 받지 못한 상태message3
를 받고 1번 오프셋에 저장함message4
를 받고 저장함message4
를 복제준비함리더에포크 사용하고, 리더와 팔로우 둘다 장애가 난 상황
message2
를 삭제함message3
복제준비를 함(실습 생략)
4-2 컨트롤러
갑작스러운 종료과정
하나의 파티션에 대해 리더 선출은 0.2초만에 완료됨
근데 1만개면, 2000초가 걸림(분으로 환산하면 3분이 조금 넘는 시간)
카프카 1.1.0부터 리더선출 작업속도가 빨라졌음 (https://www.confluent.io/blog/apache-kafka-supports-200k-partitions-per-cluster/)
제어된 종료과정을 그림을 나타냄
SIG_TERM
신호가 브로커에 전달됨SIG_TERM
신호를 받은 브로커는 컨트롤러한테 알림제어된 종료과정과 갑작스러운 종료과정의 가장큰 차이는
다운타임
임카프카 내부적으로 파티션들의 다운타임을 최소화 할 수 있음
그 이유는 브로커가 종료되기 직전 컨트롤러가 해당 브로커가 리더선출 작업을 진행하기 때문임
제어된 종료더라도 일시적인 다운타임은 발생함
4-3 로그(로그 세그먼트)
메시지(레코드)
는세그먼트(로그 세그먼트)
에 저장됨롤링
전략을 이용로그 세그먼트 삭제
랑컴펙션
기법이 존재함4-3.1 로그 세그먼트 삭제
server.properties
에서log.cleanup.policy
를delete
로 설정해야함 (기본값으로 설정되어있음)retention.byte
라는 옵션을 통해 지정된 크기로도 로그 세그먼트를 삭제 가능4-3.2 로그 세그먼트 컴팩션
메세지(레코드)
의 키값을 기준으로 마지막 데이터만 보관함_consumer_offset
카프카의 내부 토픽으로, 컨슈머 그룹을 저장하는 토픽
컨슈머 그룹이 어디까지 읽었는지를 나타내는 오프셋 커밋 정보가 키(컨슈머 그룹명, 토픽명) 벨류(오프셋 커밋 정보) 형태로 메세지가 저장됨
로그컴팩션은 메세지의 키값을 기준으로 과거 정보는 중요하지 않고 가장 마지막 값 일 경우에 사용된다
예를 들어서 구매 상태 정보가
주문완료
->배송준비
->배송 중
->배송 완료
일때구매한 사용자의 아이디(메세지의 키)를 기준으로 최종상태(메세지의 밸류)만 사용자에게 노출하면 되므로 카프카의 로그 컴팩션 기능을 활용할 수 있음
value 는 필수지만, 키는 필수가 아니라 로그 컴팩션 기능을 사용하려면 키값을 필수값으로 전송해야함
장점
빠른 장애 복구 : 로그를 전체 다 보지 않아도 되므로 복구시간을 줄일 수 있음