#log-storage
글
-
Kafka 소스 파헤치기 6: 브로커가 레코드를 받아 쓰기까지 — 레코드 배치 형식과 Produce 요청 처리
프로듀서가 보낸 레코드 배치는 61바이트 헤더와 varint 로 줄인 레코드로 되어 있습니다. 그 바이트를 파일에서 직접 한 칸씩 읽어 보고, Produce 요청 하나가 KafkaApis → ReplicaManager → Partition → UnifiedLog → LogValidator → LogSegment 를 지나 파일에 닿는 길을 소스와 브로커 TRACE 로그로 따라갑니다. 브로커가 배치를 풀지 않고 헤더 몇 칸만 고쳐 그대로 쓰는 설계(CRC 가 그대로인 것을 확인), 토픽의 compression.type 이 다르면 다시 압축하는 경우, acks=0/1/all 이 응답 시점을 바꾸는 자리까지 손으로 만든 Produce 요청으로 확인합니다.
-
Kafka 소스 파헤치기 7: 로그 저장소 — 세그먼트, 인덱스, 보존과 압축
파티션 폴더의 00000000000000003830.log 같은 파일이 언제 새로 생기고, 오프셋 하나를 파일의 바이트 위치로 어떻게 바꾸고, retention.ms 가 지난 세그먼트를 누가 언제 지우고, cleanup.policy=compact 가 같은 키의 옛 값을 어떻게 걷어 내는지 UnifiedLog·LocalLog·LogSegment·OffsetIndex·LogCleaner 소스로 따라갑니다. 세그먼트 롤의 다섯 조건, 4KB마다 한 항목만 적는 희소 인덱스와 mmap, .deleted 로 이름을 바꾼 뒤 지우는 두 단계, 키의 MD5로 만드는 SkimpyOffsetMap, 브로커가 죽었다 살아날 때의 복구 지점을 예제로 확인합니다.
-
Kafka 소스 파헤치기 9: 복제 — ISR, 하이 워터마크, 그리고 acks=all의 기다림
팔로워 브로커의 ReplicaFetcherThread 가 리더에게 Fetch 를 보내 로그를 따라 쓰고, 리더는 그 Fetch 의 오프셋으로 팔로워의 위치를 알아 하이 워터마크를 올립니다. ISR 에서 빠지는 기준(replica.lag.time.max.ms 와 lastCaughtUpTimeMs), ISR 변경을 컨트롤러에 알리는 AlterPartition, acks=all 요청이 DelayedProduce 로 퍼거토리에서 기다리는 조건과 min.insync.replicas 가 거절하는 자리, 리더가 바뀐 뒤 리더 에포크로 갈라진 로그를 잘라 내는 길을 Partition.scala·AbstractFetcherThread.scala 로 따라가고, 브로커 셋을 멈추고 죽이는 예제로 확인합니다.