Kafka 입문3
카프카 리플리케이션
데이터 파이프라인의 메인 허브 역할을 하는 카프카 클러스터가 하드웨어의 문제나 점검 등으로 인해 정상적으로 동작하지 못한다거나, 카프카와 연결된 전체 데이터 파이프라인에 영향을 미친다면 매우 심각한 문제로 발생할 수 있기 때문에 안정성을 확보하기 위해 리플리케이션이 동작하게 된다.
동작 원리
- 메시지들을 여러 개로 복제해서 카프카 클러스터 내 브로커들에 분산한다.
- N개의 리플리케이션이 있는 경우 N-1까지의 브로커 장애가 발생해도 메시지 손실 없이 안정적으로 메시지를 주고받을 수 있다.
리더와 팔로워
리더
- 리플리케이션 중 하나가 선정됨, 모든 읽기와 쓰기는 리더를 통해서만 가능
- 프로듀서는 리더에게만 메시지를 전송하고, 컨슈머도 오직 리더로부터 메시지를 가져온다.
팔로워
- 리더에 문제가 발생하거나 이슈가 있을 경우를 대비해 새로운 리더가 될 준비를 한다.
- 파티션의 리더가 새로운 메시지를 받았는지 확인하고, 새로운 메시지가 있다면 리더로부터 복제한다.
복제 유지와 커밋
ISR(InSyncReplica)
- 리더와 팔로워를 묶는 논리적인 그룹
- 해당 그룹 안에 속한 팔로워들만이 새로운 리더의 자격을 가질 수 있음
- ISR 그룹에 속하지 못한 팔로워는 새로운 리더의 자격을 가질 수 없음
ISR 내의 팔로워들은 리더와의 데이터 일치를 유지하기 이해 지속적으로 리더의 데이터를 따라가게 되고, 리더는 ISR내 모든 팔로워가 메시지를 받을 때까지 기다린다.
하지만 팔로워가 네트워크 오류, 브로커 장애 등 여러 이유로 리더로부터 리플리케이션하지 못하는 경우도 발생할 수 있음
이때 팔로워는 리더와의 데이터 불일치 상태에 놓이게 되고, 이 팔로워에게 새로운 리더를 넘겨준다면 데이터의 정합성이나 메시지 손실 등의 문제가 발생함
그럼 리더와 팔로워 중 리플리케이션 동작을 잘하고 있는지 여부 등은 누가 판단하고, 어떤 기준으로 판단할까?
리더는 팔로워가 특정 주기의 시간만큼 복제 요청을 하지 않는다면, 해당 팔로워가 리플리케이션 동작에 문제가 발생했다고 판단해 ISR 그룹에서 추방함
ISR 내에서 모든 팔로워의 복제가 완료되면, 리더는 내부적으로 커밋되었다는 표시를 한다.
하이워터마크
- 커밋 오프셋 위치
- 커밋되었다는 것은 리프리케이션 팩터 수의 모든 리플리케이션이 전부 메시지를 저장했음을 의미
- 컨슈머는 커밋된 메시지만 읽어갈 수 있다. => 메시지의 일관성을 유지하기 위해서
만약 커밋된 메시지만 읽지 않는 상황이라면??
컨슈머 A가 리더로부터 test message 1, test meesage 2를 읽었는데, 리더 브로커에 문제가 발생해 팔로워 중 하나가 새로운 리더가 된 경우
새로운 리더는 아직 이전 리더로부터 test message 2를 가지고 있지 않은 상황에서 컨슈머 B는 test message 1만 컨슘 할 수 있다.
따라서, 동일한 토픽의 파티션에서 컨슘했음에도 메시지가 일치하지 않은 현상이 발생할 수 있음.
그럼 커밋된 위치를 어떻게 알 수 있을까??
모든 브로커는 재시작될 때, 커밋된 메시지를 유지하기 위해 로컬 디스크의 replication-offset-chcekpoint라는 파일에 마지막 커밋 오프셋 위치를 저장함


