실전 카프카 개발부터 운영까지 - 4.카프카의 내부 동작 원리와 구현 (3)

서영민·2022년 8월 30일
0
post-thumbnail

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

컨트롤러

컨트롤러는 리더 선출을 담당한다

  • 카프카 클러스터 중 하나의 브로커가 컨트롤러 역할을 한다
  • 파티션의 ISR 리스트 중에서 리더를 선출한다
  • 리더를 선출하기 위한 ISR 리스트 정보는 안전한 저장소에 보관되어 있어야 하는데, 가용성 보장을 위해 주키퍼에 저장되어있다
  • 컨트롤러는 브로커가 실패하는 것을 예의주시 한다
  • 브로커 실패가 감지되면 즉시 ISR 리스트 중 하나를 새로운 파티션 리더로 선출한다
  • 그리고 새로운 리더의 정보를 주키퍼에 기록하고, 변경된 정보를 모든 브로커에게 전달한다
  • 파티션의 리더가 다운됐다는 것은 해당 파티션의 리더가 없는 상태를 의미하며, 프로듀서나 컨슈머가 해당 파티션으로 읽기나 쓰기가 불가능하다
  • 카프카 클라이언트가 읽기/쓰기를 실패하게 되면 클라이언트에 설정되어 있는 재시도 숫자만큼 재시도를 하게 된다
  • 클라이언트들이 재시도 하는 시간 내에 리더 선출 작업이 빠르게 이뤄져야 한다

예시를 통한 리더 선출 과정

토픽 이름peter-test02
파티션 수1
리플리케이션 팩터 수2
브로커 배치1,3 브로커
현재 리더 위치1번 브로커


예기치 않은 장애로 인한 리더 선출 과정

장애 상황을 연출하기 위해 0번 파티션의 리더가 있는 1번 브로커를 강제로 종료하고 새로운 파티션의 리더가 선출되는 과정

  1. 파티션 0번의 리더가 있는 브로커 1번이 예기치 않게 다운
  2. 주키퍼는 1번 브로커와 연결이 끊어진 후, 0번 파티션의 ISR에서 변화가 생겼음을 감지
  3. 컨트롤러는 주키퍼의 위치를 통해 0번 파티션에 변화가 생긴 것을 감지하고, 해당 파티션 ISR 중 3번을 새로운 리더로 선출
  4. 컨트롤러는 0번 파티션의 새로운 리더가 3이라는 정보를 주키퍼에 기록한다
  5. 이렇게 갱신된 정보는 현재 활성화 상태인 모든 브로커에게 전파된다


제어된 종료 과정

  1. 관리자가 브로커 종료 명령어를 실행하고, SIG_TERM 신호가 브로커에게 전달된다
  2. SIG_TERM 신호를 받은브로커는 컨트롤러에게 알린다
  3. 컨트롤러는 리더 선출 작업을 진행하고, 해당 정보를 주키퍼에게 기록한다
  4. 컨트롤러는 새로운 리더 정보를 다른 브로커들에게 전송한다
  5. 컨트롤러는 종료 요청을 보낸 브로커에게 정상 종료한다는 응답을 보낸다
  6. 응답을 받은 브로커는 캐시에 있는 내용을 디스크에 저장하고 종료한다

제어된 종료와 급작스러운 종료의 가장 큰 차이점은?

  • 가장 큰 차이점은 다운타임(downtime)이다.
  • 제어된 종료를 사용하면 브로커가 종료되기전, 컨트롤러는 해당 브로커가 리더로 할당된 전체 파티션에 대해 리더 선출 작업을 진행하기 때문에 카프카 내부적으로 파티션들의 다운타임을 최소화 할 수 있다
  • 물론 제어된 종료라 할지라도 리더 선출 작업 시간 동안 일시적으로 다운타임이 발생한다
  • 하지만 리더 선출 작업 대상 파티션들의 리더들이 활성화된 상태에서 컨트롤러는 순차적으로 하나의 파티션마다 리더를 선출하게 되므로, 결과적으로 각 파티션들은 다운타임을 최소화 할 수 있다

브로커 장애로 인한 리더 선출 작업

  1. 이미 대상 파티션들의 리더가 종료된 상태
  2. 파티션들의 다운 타임은 새로운 리더 선출 작업이 될 때까지 지속되고 있다
  3. 컨트롤러는 순차적으로 하나의 파티션마다 리더를 선출
  4. 첫 번재 대상 파티션의 다운타임은 길지 않지만, 마지막 파티션의 다운타임은 꽤 오랜시간이 걸린다
  5. 제어된 종료의 경우 브로커는 자신의 모든 로그를 디스크에 동기화 한 후 종료되므로, 브로커가 재시작할 때 로그 복구 시간이 짧다
  6. 제어된 종료를 사용하려면 controlled.shutdown.enable = true 설정이 브로커의 설정 파일인 server.properties에 적용되어야 한다
  7. kafka-config 명령어를 --broker 옵션과 확인하고자 하는 브로커의 아이디를 명시하면 현재 브로커 설정 확인 가능
    • kafka-config --bootstrap-server kafka1:9091 --broker 1 --describe -all
  8. 현재 브로커의 제어된 종료 설정 상태를 확인해보고, 적용되어있지 않다면 적용하는 것을 추천한다
profile
우렁총각

0개의 댓글