kmg28801 / kafka-study

1 stars 0 forks source link

[실전 카프카 개발부터 운영까지] 4장. 카프카의 내부 동작 원리와 구현 #14

Open kmg28801 opened 1 year ago

taewoo-kim123 commented 1 year ago

4장 카프카의 내부 동작 원리와 구현

이번장에서 배울 내용

4-1 카프카 리플리케이션

descrive로 방금 생성한 토픽을 출력

/usr/local/kafka/bin/kafka-topics.sh
--bootstrap-server peter-kafka01.foo.bar:9092 --topic peter--test01 --describe

image

  1. peter-test01 토픽은 파티션 : 1, 리플리케이션 팩터 : 3
  2. peter-test01 의 토픽의 파티션 0 에 대한 상세정보
    • 리더는 브로크 1을 나타내고, 리플ㄹ케이션들은 브로커 1,2,3에 있음
    • 뒤에있는 ISR은 동기화 되고있는 리플리케이션들이 브로커 1,2,3을 의미
  3. peter-test01 토픽으로 test message1을 전송하고 세그먼트 파일의 내용을 확인하면 1,2,3 브로커가 동일한 메세지를 가지고 있음 세그먼트 파일의 내용 확인하는 명령어
    /usr/local/kafka/bin/kafka-dump-log.sh --print-data-log --files /data/kafka-logs/peter-test01-0/0000000000000000.log

image

  1. 시작 오프셋 0
  2. 메시지 카운트 1
  3. 프로듀서를 통해 보넨 메시지가 test message1 이라는걸 알 수 있음
    • peter-kafka02,peter-kafka03 도 동일한 결과
    • N개의 리플리케이션이 있는경우 N-1 개의 브로커 장애가 발생해도 메세지 손실 없이 안정적으로 메세지 주고받기 가능. (일반적으로 3개를 권장한다고 함)

      4-1.2 리더와 팔로워

      image

    • 파티션의 리더라는 부분은 리플리케이션중 하나가 선정되며, 모든 읽기와 쓰기는 그 리더를 통해서만 가능
    • 프로듀서는 모든 리플리케이션 리더에게만 메세지를 전송, 컨슈머는 리더로부터 메세지를 수신
    • 팔로워는 단순히 대기가 아니라 리더에 문제가 발생할 경우를 대비, 언제든지 리더가 될 준비를 함
    • 파티션 리더가 새로운 메세지를 받았는지 확인하고 새로운 메세지가 있다면 리더로부터 복제

4-1.3 복제유지와 커밋

image

4-1.4 리더와 팔로워의 단계별 리플리케이션 동작

image

  1. 리더만 0번 오프셋에 message1 이라는 메세지를 가지고 있음

image

  1. 팔로워들이 리더에게 0범 오프셋 메세지를 가져오는 fetch 요청을 보낸 후, message1 을 인지하고, 리플리케이션 실행
  2. 하지만 리더는 팔로워들이 0번 오프셋에 대한 리플리케이션 동작이 성공했는지 모름(RabitMQ는 Ack 통해 메세지 받았는지 알수있다고 함)

image

  1. 리더가 1번 오프셋에 새로운 메세지 message2를 프로듀서로 받고 저장
  2. 0번 오프셋에 대한 복제를 마친 팔로워들이 1번 오프셋 복제를 요청함
  3. 팔로워들이 1번 오프셋 요청을 하면, 이 요청을 받은 리더는 팔로워들이 0번에 대한 복제가 성공했음을 인지하고, 0번 오프셋에 커밋을 하고, 하이워터마크를 증가
  4. 팔로워가 0번 오프셋에 대한 복제를 성공하지 못했다면 팔로워는 0번에 대한 복제요청을 보냄
  5. 리더는 팔로워들이 보내는 복제 요청을 보고 어디까지 성공했는지 인지 가능
  6. 팔로워들로 부터 1번 오프셋 메세지에 대한 리플리케이션 요청을 받은 리더는 0번 오프셋 message1 메시지가 커밋되었다는 내용도 같이 전달

image

  1. 리더의 응답을 받은 모든 팔로워들은 0번 오프셋 메세지가 커밋되었다는 사실을 인지하고, 리더와 동일하게 커밋함
  2. 그리고 1번 오프셋 메세지인 message2를 복제함
  3. 이 방법을 통해 파티션 내에서 리더와 팔로워 간 메세지의 최신 상태를 유지함

4-1.5 리더에포크와 복구

리더에포크

리더에포크 사용하지 않은 경우

image

  1. 리더가 message1수신, 0번에 저장, 팔로워는 0번 오프셋 가져오기 요청
  2. 팔로워가 message1메세지를 복제하고
  3. 리더는 하이워터마크를 1로 올림
  4. 리더는 message2를 저장
  5. 팔로워는 또 요청을 보내고, 응답으로 하이워터의 변화를 감지, 자기도 올림
  6. 팔로워는 message2를 저장
  7. 팔로워가 2번 오프셋에 대한 요청을 보내고, 리더는 message2가 복제되었음을 인지하고 하이워터마크를 2로 올림
  8. 팔로워는 1번(책이 오타인듯??)에 대한 message2 복제를 완료했지만 아직 리더한테 하이워터마크 올리라는 내용은 전달 못받음
  9. 팔로워가 다운됨 image image
  10. 팔로워는 자기가 가지고있는 메세지들중 자신의 워터마크보다 높은 메세지들은 신뢰할 수 없다고 생각함 그래서 message2를 삭제함
  11. 팔로워는 리더로부터 1번 오프셋의 새로운 메세지 요청을 함
  12. 근데 이순간 리더가 다운되면서 유일한 팔로워가 리더로 승격됨

리더에포크 사용하는 경우

  1. 팔로워는 복구동작 하면서 리더에게 리더에포크 요청을 보냄
  2. 요청받은 리더는 리더에포크의 응답으로 1번 오프셋의 message2까지 라고 팔로워한테 보냄
  3. 팔로워는 자신의 하이워터마크보다 높은 1번 오프셋의 message2를 삭제하지 않고 리더의 응답을 확인한 후 message2 까지 자신의 하이워터마크로 상향조정 image
  4. 이 이후 리더가 예상치 못한 장애로 다운되면서 팔로워가 새로운 리더로 승격되어도 message2는 삭제되지 않았고, 메세지 손실은 발생하지 않음

리더에포크 사용하지 않고, 리더와 팔로우 둘다 장애가 난 상황

image

  1. 팔로워는 아직 message2를 받지 못한 상태
  2. 이때 리더랑 팔로워 둘다 장애 발생

image

  1. 팔로워가 먼저 복구됨
  2. 리더가 없으므로 팔로워가 리더로 승격됨
  3. 프로듀서로 부터 message3 를 받고 1번 오프셋에 저장함

image

  1. 구 리더도 장애가 복구됨
  2. 이미 리더가 존재하므로 복구된 브로커가 팔로워가 됨
  3. 리더와 메세지 정합성을 위해 하이워터 비교를 하니 둘다 오프셋 1이라고해서, 메세지를 삭제하지 않음 image
  4. 리더가 프로듀서로부터 message4를 받고 저장함
  5. 팔로워는 message4를 복제준비함
    • 리더와 팔로워가 서로 가지고있는 메세지가 다름

리더에포크 사용하고, 리더와 팔로우 둘다 장애가 난 상황

image

  1. 이전 상황과 동일하고, 구리더가 장애에서 복구됨
  2. 이미 리더가 있어서 자신이 뉴팔로워가 됨
  3. 뉴팔로워는 뉴리더한테 리더에포크 요청을 함
  4. 뉴리더는 자신이 팔로워였을때 하이워터마크였던 0번 오프셋까지 유효하다고 응답함
  5. 뉴팔로워는 메세지 일관성을 위해 1번 오프셋인 message2를 삭제함
  6. 뉴팔로워는 뉴리더한테 1번오프셋인 message3 복제준비를 함
    • 리더와 팔로워가 서로 가지고있는 메세지가 같다

(실습 생략)

4-2 컨트롤러

image

image

4-3 로그(로그 세그먼트)

4-3.1 로그 세그먼트 삭제

4-3.2 로그 세그먼트 컴팩션

_consumer_offset

image

kmg28801 commented 1 year ago