open:kafka

Kafka

zaomlnu.jpg

ejjlpmd.jpg

  • 메시지 데이터를 여러 컨슈머에게 허용
  • 높은 처리량을 위한 메시지 최적화
  • 스케일 아웃 가능
  • 관련 생태계 제공
  • 토픽은 메시지를 구분하는 단위: 파일시스템의 폴더와 유사
  • 한 개의 토픽은 한 개 이상의 파티션으로 구성
    • 파티션은 메시지를 저장하는 물리적인 파일
  • 파티션은 추가만 가능한(append-only) 파일
    • 각 메시지 저장 위치를 오프셋offset이라고 함
    • 프로듀서가 넣은 메시지는 파티션의 맨 뒤에 추가
    • 컨슈머는 오프셋 기준으로 메시지를 순서대로 읽음
    • 메시지는 삭제되지 않음(설정에 따라 일정 시간이 지난 뒤 삭제)
  • 프로듀서는 라운드로빈 또는 키로 파티션 선택
    • 같은 키를 갖는 메시지는 같은 파티션에 저장 → 같은 키는 순서 유지
  • 컨슈머는 컨슈머그룹에 속함
  • 한 개 파티션은 컨슈머그룹의 한 개 컨슈머만 연결 가능
    • 즉 컨슈머그룹에 속한 컨슈머들은 한 파티션을 공유할 수 없음
    • 한 컨슈머그룹 기준으로 파티션의 메시지는 순서대로 처리
  • 파티션 파일은 OS 페이지캐시 사용
    • 파티션에 대한 파일 IO를 메모리에서 처리
    • 서버에서 페이지캐시를 카프카만 사용해야 성능에 유리
  • Zero Copy
    • 디스크 버퍼에서 네트워크 버퍼로 직접 데이터 복사
  • 컨슈머 추적을 위해 브로커가 하는 일이 비교적 단순
    • 메시지 필터, 메시지 재전송과 같은 일은 브로커가 하지 않음
      • 프로듀서, 컨슈머가 직접 해야 함
    • 브로커는 컨슈머와 파티션 간 매핑 관리
  • 묶어서 보내기, 묶어서 받기 (batch)
    • 프로듀서 : 일정 크기만큼 메시지를 모아서 전송 가능
    • 컨슈머 : 최소 크기만큼 메시지를 모아서 조회 가능
  • 낱개 처리보다 처리량 증가
  • 처리량 증대(확장)가 쉬움
    • 1개 장비의 용량 한계 → 브로커 추가, 파티션 추가
    • 컨슈머가 느림 → 컨슈머 추가 (+파티션 추가)
  • 리플리카 : 파티션의 복제본
    • 복제수(replication factor) 만큼 파티션의 복제본이 각 브로커에 생김
  • 리더와 팔로워로 구성
    • 프로듀서와 컨슈머는 리더를 통해서만 메시지 처리
    • 팔로워는 리더로부터 복제
  • 장애 대응
    • 리더가 속한 브로커 장애시 다른 팔로워가 리더가 됨

Consumer들의 집합, 여러개의 Partition으로 이루어진 토픽을 Partition 별로 할당받아 메시지를 처리
메시지는 Consumer Group 내에서는 단 한번 처리된다.

Consumer Group에 Consumer가 추가, 삭제되면 담당 Partition을 재조정 Reassign 하는 작업

이 작업이 일어나면 전체 Consumer가 메시지 수신이 순간 중단 되는 현상 발생

  • 실행된 카프카 애플리케이션 서버 중 1대
  • 3대 이상의 브로커로 클러스터 구성
  • 주키퍼와 연동 (~2.5.0버젼)
    • 주키퍼의 역할 : 메타데이터(브로커id, 컨트롤러id 등) 저장
  • n개 브로커 중 1대는 컨트롤러(Controller) 기능 수행
    • 컨트롤러 : 각 브로커에게 담당파티션 할당 수행. 브로커 정상 동작 모니터링 관리. 누가 컨트롤러 인지는 주키퍼에 저장.

zaafetc.jpg

  1. 프로튜서는 레코드를 생성하여 브로커로 전송
  2. 전송된 레코드는 파티션에 신규 오프셋과 함께 기록됨
  3. 컨슈머는 브로커로 부터 레코드를 요청하여 가져감(polling)
  • open/kafka.txt
  • 마지막으로 수정됨: 2021/11/08 01:07
  • 저자 127.0.0.1