onlybooks / kafka2

실전 카프카 개발부터 운영까지
98 stars 56 forks source link

`leader-epoch-checkpoint` 파일 내용의 포맷에 대한 질문 #9

Closed ssk910 closed 1 week ago

ssk910 commented 1 year ago


1. 서론

안녕하세요. 작가님 책을 읽으면서 카프카에 대해 깊게 개념을 이해하고 있는 중입니다. 책을 보는 도중 설명이 나오지 않는 부분이 있어서 이렇게 깃허브 이슈를 등록해서 여쭤보고자 합니다.

2. 질문

2.1. 질문에 대한 정보

2.2. 질문 내용

리더를 선출할 때마다 leader epoch가 증가하고, leader-epoch-checkpoint 파일 내용에 오프셋 내용이 덧붙여지는 것은 이해했습니다. 아래는 책에 나온 leader-epoch-checkpoint 파일 내용입니다. (일부러 장애를 발생시켜 리더를 선출시킨 상황)

0
3
0 0
1 1
2 2

두 번째 라인 의 값인 3은 현재 leader epoch 번호이고, 그 아래부터는 leader epoch 값에 따라 당연히 세 줄이 추가되었고, 여기부터는 2개의 열로 다음에 받을 오프셋 위치 등이 기록됩니다.

제가 이해가 안가는 것은 첫 번째 라인 입니다. 이 값은 계속 0으로 고정되어 있고, 책에는 이 부분에 대한 설명을 찾을 수 없었습니다. 구글에 검색하면 2개의 열과 오프셋에 대한 내용 뿐이라서 어쩔 수 없이 직접 Apache Kafka 깃허브의 소스를 보게 되었습니다.

아래는 leader-epoch-checkpoint 파일 생성과 관련된 Kafka 3.4.0scala, java 파일입니다.

위 내용을 요약하자면,

사실 분석하지 않아도 친절하게 LeaderEpochCheckpointFile.scala의 55~65 라인에 파일 내용에 대해서 주석을 달아주었는데요.

/**
 * This class persists a map of (LeaderEpoch => Offsets) to a file (for a certain replica)
 *
 * The format in the LeaderEpoch checkpoint file is like this:
 * -----checkpoint file begin------
 * 0                <- LeaderEpochCheckpointFile.currentVersion
 * 2                <- following entries size
 * 0  1     <- the format is: leader_epoch(int32) start_offset(int64)
 * 1  2
 * -----checkpoint file end----------
 */

여기서 말하는 첫번째 라인에 해당되는 LeaderEpochCheckpointFile.currentVersion이 무엇을 뜻하는지 도무지 이해가 가지 않습니다. 이것을 대충 건너뛰고 다음 장으로 넘어가고 싶은데 이 값이 무엇이기에 epoch checkpoint 파일에 기록할 만큼 중요한 것인가 하는 마음에 진도를 나가지 못하겠더라구요.

3. 마무리

제가 얼마나 이 궁금증을 해소하고 싶은지 담고 싶어 내용이 조금 길어지게 되었습니다. 이 부분에 대해 알려주신다면 정말 감사히 읽어보도록 하겠습니다. 감사합니다.

ssk910 commented 1 year ago

페이지 번호를 잘못 기입하여 수정했습니다.

질문에 해당하는 페이지 : ~139~ --> 질문에 해당하는 페이지 : 137

peterko5236 commented 1 year ago

안녕하세요. 독자님의 좋은 질문 감사드립니다. 솔직히 저는 해당 부분에 대해 크게 관심을 갖지 않았지만, 이번에 질문 주셔서 저도 좀 자세하게 검색했습니다. 저 역시 정확한 정보가 없어, 저도 정확하게 말씀드리기는 어렵지만 해당 부분은 단지 파일의 버전 체크 용도로 사용하는 것 같습니다. 일반적으로 파일에 버전 정보를 표시하는 경우가 있는데, 이는 현재 사용 중인 파일의 버전을 쉽게 확인하기 위함입니다. 예를들어 향후 파일 안의 메시지 포맷 등이 변경되는 경우를 고려하여 사전에 파일 버전을 표시하게 됩니다. 향후 파일 포맷이 변경되더라도 파일의 버전 정보를 확인하고 버전별 메시지 처리가 가능하게 됩니다. LeaderEpochCheckpointFile.currentVersion = 0 도 이러한 용도를 위해 사용하고 있는 것으로 추측됩니다.(현재는 0만 사용하는 것으로 확인됩니다.) 많이 찾아보시고, 질문을 주셨는데 명쾌하게 답변을 드리지 못해 죄송합니다. 좋은 질문 주셔서 감사하고, 다음에 또 궁금하신 점 있으시면 언제든지 문의 주시기 바랍니다.

ssk910 commented 1 week ago

안녕하세요. 친절하게 답변해주셔서 정말감사드립니다. 확인해보니 작가님께서 말씀해주신 것처럼 currentVersion파일의 버전 정보가 맞았습니다.

제가 너무 궁금해서 /kafka/server/checkpoints/LeaderEpochCheckpointFile.scala 파일을 작성한 개발자에게 직접 메일로 여쭤보았었는데 아래와 같은 답변을 받았습니다.

This version is just a flag to let the reader know how to read this file. So far, we only have version 0. But supposedly in the future, we'd like to change the file format, this version field will be helpful to let us know if while content format it has.

1년이 훌쩍 지나서야 댓글을 달게 되었네요 ㅎㅎ 이 이슈는 close 하겠습니다. 감사합니다.