카프카의 내부 동작 원리와 구현
컨트롤러
컨트롤러는 리더 선출을 담당한다
- 카프카 클러스터 중 하나의 브로커가 컨트롤러 역할을 한다
- 파티션의 ISR 리스트 중에서 리더를 선출한다
- 리더를 선출하기 위한 ISR 리스트 정보는 안전한 저장소에 보관되어 있어야 하는데, 가용성 보장을 위해 주키퍼에 저장되어있다
- 컨트롤러는 브로커가 실패하는 것을 예의주시 한다
- 브로커 실패가 감지되면 즉시 ISR 리스트 중 하나를 새로운 파티션 리더로 선출한다
- 그리고 새로운 리더의 정보를 주키퍼에 기록하고, 변경된 정보를 모든 브로커에게 전달한다
- 파티션의 리더가 다운됐다는 것은 해당 파티션의 리더가 없는 상태를 의미하며, 프로듀서나 컨슈머가 해당 파티션으로 읽기나 쓰기가 불가능하다
- 카프카 클라이언트가 읽기/쓰기를 실패하게 되면 클라이언트에 설정되어 있는 재시도 숫자만큼 재시도를 하게 된다
- 클라이언트들이 재시도 하는 시간 내에 리더 선출 작업이 빠르게 이뤄져야 한다
예시를 통한 리더 선출 과정
토픽 이름 | peter-test02 |
---|
파티션 수 | 1 |
리플리케이션 팩터 수 | 2 |
브로커 배치 | 1,3 브로커 |
현재 리더 위치 | 1번 브로커 |
예기치 않은 장애로 인한 리더 선출 과정
장애 상황을 연출하기 위해 0번 파티션의 리더가 있는 1번 브로커를 강제로 종료하고 새로운 파티션의 리더가 선출되는 과정

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

- 관리자가 브로커 종료 명령어를 실행하고, SIG_TERM 신호가 브로커에게 전달된다
- SIG_TERM 신호를 받은브로커는 컨트롤러에게 알린다
- 컨트롤러는 리더 선출 작업을 진행하고, 해당 정보를 주키퍼에게 기록한다
- 컨트롤러는 새로운 리더 정보를 다른 브로커들에게 전송한다
- 컨트롤러는 종료 요청을 보낸 브로커에게 정상 종료한다는 응답을 보낸다
- 응답을 받은 브로커는 캐시에 있는 내용을 디스크에 저장하고 종료한다
제어된 종료와 급작스러운 종료의 가장 큰 차이점은?
- 가장 큰 차이점은 다운타임(downtime)이다.
- 제어된 종료를 사용하면 브로커가 종료되기전, 컨트롤러는 해당 브로커가 리더로 할당된 전체 파티션에 대해 리더 선출 작업을 진행하기 때문에 카프카 내부적으로 파티션들의 다운타임을 최소화 할 수 있다
- 물론 제어된 종료라 할지라도 리더 선출 작업 시간 동안 일시적으로 다운타임이 발생한다
- 하지만 리더 선출 작업 대상 파티션들의 리더들이 활성화된 상태에서 컨트롤러는 순차적으로 하나의 파티션마다 리더를 선출하게 되므로, 결과적으로 각 파티션들은 다운타임을 최소화 할 수 있다
브로커 장애로 인한 리더 선출 작업
- 이미 대상 파티션들의 리더가 종료된 상태
- 파티션들의 다운 타임은 새로운 리더 선출 작업이 될 때까지 지속되고 있다
- 컨트롤러는 순차적으로 하나의 파티션마다 리더를 선출
- 첫 번재 대상 파티션의 다운타임은 길지 않지만, 마지막 파티션의 다운타임은 꽤 오랜시간이 걸린다
- 제어된 종료의 경우 브로커는 자신의 모든 로그를 디스크에 동기화 한 후 종료되므로, 브로커가 재시작할 때 로그 복구 시간이 짧다
- 제어된 종료를 사용하려면
controlled.shutdown.enable = true
설정이 브로커의 설정 파일인 server.properties
에 적용되어야 한다
kafka-config
명령어를 --broker
옵션과 확인하고자 하는 브로커의 아이디를 명시하면 현재 브로커 설정 확인 가능
kafka-config --bootstrap-server kafka1:9091 --broker 1 --describe -all
- 현재 브로커의 제어된 종료 설정 상태를 확인해보고, 적용되어있지 않다면 적용하는 것을 추천한다