블로그

카프카 kafka 정리 1

아파치 카프카 입문 강의를 듣고 정리한 내용입니다카프카란분산형 데이터 처리 및 전송데이터 손실 없이 복구 가능낮은 지연과 대용량 데이터 처리비동기 처리데이터 처리 통일화 카프카 토픽메세지가 생산되고 소비되는 주제카프카(브로커)에 여러 토픽이 있고 토픽에 여러 파티션이 있다토픽은 이름을 가질 수 있다.(데이터 특징을 기반으로 명명)producer로부터 파티션에 데이터가 쌓인다offset(index)은 0부터 시작된다consumer로 먼저 적재된 오래된 데이터부터 빠져나간다데이터를 가져가도 데이터는 파티션에 유지된다다른 consumer(target)에 넣을 수도 있다파티션이 두 개 이상인 경우데이터를 보낼 때 키를 지정해서 파티션을 지정한다파티션 삭제시간을 설정한다 kafka broker카프카가 설치되어있는 서버단위보통 3개 == 한 클러스터 내에 여러 대의 브로커(서버)파티션 1, 리플리케이션 1파티션 1, 리플리케이션 2 (=원본 하나, 복제본 하나)파티션 1, 리플리케이션 3 (=원본 하나, 복제본 둘)리더 파티션(원본), 팔로워 파티션(복제) == in sync replica고가용성 - 팔로워 싱크 맞춤으로써 파티션 복구가 가능하다ack 옵션 - 0, 1, all0일 경우, 리더 partition에 데이터 전송 후 응답 x1일 경우, 리더 partition에 데이터 전송 후 응답 o2일 경우, 모든 partition에 복제까지 확인 후 응답 o kafka 파티셔너데이터를 토픽의 어떤 파티션에 넣을지 결정한다메세지 키 또는 값에 따라 위치가 결정된다또는 UniformStickyPartitioner로 설정한다메세지 키가 있는 경우, hash값에 따라 결정 (순서 o)키를 사용할 경우, 키 수 == 파티션 수여야 효과 있음메세지 키가 없는 경우, 각 파티션에 배치단위 라운드로빈 방식으로 넣어진다(분배)파티셔너 인터페이스를 통해 커스텀 파티셔너 사용 가능우선순위 큐 컨슈머 그룹Partition에 접근하는 Consumer 관리Consumer들이 파티션의 어떤 offset을 소비해야하는지 관리한다하나의 파티션에 하나의 컨슈머 인스턴스만 접근할 수 있도록 관리반대로 컨슈머는 여러 개의 파티션 소비 가능즉, 파티션의 개수 >= 컨슈머의 개수컨슈머그룹에서 컨슈머가 소비하는 offset 정보는 토픽별로 분리되어있다.파티션은 한 번 늘리면 줄일 수 없다는 점 주의컨슈머는 브로커로부터 메세지를 pull하는 방식 <> push 컨슈머 랙(Consumer Lag)카프카 프로듀서가 토픽의 파티션에 데이터를 저장하며 offset이 생성됨컨슈머 랙은 프로듀서가 넣은 데이터의 오프셋과 컨슈머가 가져간 오프셋과의 차이를 의미파티션 수에 따라 랙은 여러개가 존재할 수 있음랙 필수 발생 records leg max 컨슈머 랙 모니터링 - 카프카 버로우(Burrow)DB에 넣고 그라파나로 모니터링도 가능하지만 컨슈머에 디펜던시가 걸려있기 떄문에 컨슈머에서 랙을 수집하는 것은 비용이 듬버로우 특징버로우는 링크드인에서 golang 언어로 개발된 오픈소스카프카 클러스터가 여러 개여도 버로우 어플리케이션 하나로 모니터링 가능컨슈머의 status 확인 가능 - 오프셋 불균형에 따라 warning, error ...Http api 제공 카프카, 레빗엠큐, 레디스 큐메세징 플랫폼 - 메세지 브로커, 이벤트 브로커메세지 브로커; 레빗엠큐, 레디스큐이벤트 브로커로 활용 불가 미들웨어에 사용(메세지, 인증, DB 등 플랫폼)메세지 처리 후 삭제이벤트 브로커; 카프카인덱스를 통해 개별 엑세스필요한 시간 동안 유지큐에 저장단일 진실 공급원(이벤트 저장 한 곳에)장애 지점에서 장애 처리많은 양의 실시간 데이터 스트림 처리 주키퍼 - 클러스터의 서버들이 공유하는 데이터를 관리(클러스터 관리)카프카의 메타데이터 정보를 저장, 카프카의 상태관리 등 목적으로 이용주키퍼 제거됨 -> 카프카 내부에 메티데이터 저장하는 방식으로 변경메타데이터용 프로토콜인 카프카 라프트 또는 크라프트로 대체됨 카프카 스트림즈카프카에 저장된 데이터 처리 및 분석하는 라이브러리 카프카와 완벽호환스케줄링이 필요없다스트림즈DSL - 이벤트 기반 데이터 처리 관련 메서드 제공프로세서API를 통해 로직 작성 가능상태 기반 분산 저장상태 변환 정보를 변경 로그 토픽에 저장장애 처리 가능 카프카 커넥트 - 반복적인 데이터 파이프라인  개발싱크 커넥터 - DB에 데이터 저장(컨슈머 역할)소스 커넥터 - DB로부터 데이터를 가져와서 토픽에 넣는 프로듀서 역할커넥트; 커넥터를 실행단일 실행모드 커넥트분산모드 커넥트여러 개의 프로세서(커넥트)를 하나의 클러스터로 묶음장애 시 복구 가능 카프카 사용법카프카 관련 설정; producer, topic프로듀서RestController API파라미터를 통해 객체 전달 EventDtoKafkaTemplate.send("topic", eventDto)토픽에 요청 쌓음컨슈머; consumerFactory@EnableKafka@KafkaListener("topic", groupId, containerFactory)토픽 꺼내와서 처리listen(ConsumerRecord) 메서드poll recordsrecord.value()   

kafka

카프카 kafka 정리 2

도서 정리 - 아파치 카프카 애플리케이션 프로그래밍 with 자바 (최원영)카프카 토픽토픽은 관계형DB에서 테이블과 같으며 토픽 안에는 파티션이 있다프로듀서 -> 파티션에 적재 -> 컨슈머모든 파티션에 적재되는 것이 아닌 하나의 파티션에 적재된다queue 자료구조파티션에 들어있는 데이터를 순차적으로 소비한다파티션에 있는 데이터는 삭제되지 않는다 -> 한 번 더 가져갈 수 있다가져간 offset이 커밋(기록)된다   카프카 특징높은 데이터 처리량데이터를 묶어서 송수신하여 네트워크 통신횟수를 최소화파티션에 나눠 병렬처리컨슈머도 파티션 개수만큼 늘려 처리량 높인다직렬화, 역직렬화로 데이터 타입이 상관 없다확장성브로커 늘려서 scale out영속성처리지점을 알면 재처리 가능파일시스템에 저장함으로써 장애발생해도 서버 재가동으로 복구페이지 캐시 메모리에 저장함으로써 속도 개선고가용성프로듀서로 전송받은 데이터는 여러 브로커에 동시 저장(replication)하기 때문에 서버 장애가 발생되어도 처리가 가능하다3대부터 데이터 유실, 지연 없는 완전 복제가 가능하다  카프카 프로듀서와 컨슈머프로듀서 -> 카프카 클러스터(적절한 토픽) -> 컨슈머프로듀서프로듀서 API는 카프카의 시작점send는 비동기 응답메세지 키를 보낼 수도 있고, 커스텀 파티셔너를 생성할 수도 있다파티션 지정 가능 직렬화를 통해 바이너리 데이터(동영상)도 전송 가능컨슈머컨슈머 그룹을 기준으로 오프셋을 관리함poll로 데이터를 가져온다while(true)와 같은 반복문을 통해 지속적인 데이터 처리를 한다poll하고 commitSync를 통해 수동 오프셋 커밋을 하면 데이터 유실 및 중복을 엄격하게 관리 가능commitAsync 덜 엄격한 커밋리밸런싱컨슈머가 추가 또는 제거될 때 파티션을 컨슈멍에 재할당하는 것shutdown hook -> WakeUpException -> 종료처리  카프카 스트림즈토픽 -> 스트림즈(stateless) -> 토픽스트림즈 DSL과 프로세서 API 제공스트림즈 DSL은 많은 기능을 가진 인터페이스를 제공태스크(Task)데이터 처리 최소단위소스(root) 프로세서 -> 스트림 프로세서(처리) -> 싱크 프로세서 Kstream 키 값 형태, Ktable 유니크한 키 기준으로 데이터 처리(최신 데이터)StreamsBuilder.stream()에서 스트림 정의StreamsBuilder.filter()StreamsBuilder.join()StreamsBuilder.to() - sync 프로세서로 보낸다KafkaStreams.start()스트림 빌더에서 정의한 스트림을 실행프로듀서Properties에 각 프로세서 지정Topology.addSource().addProcessor().addSink()카프카 커넥트; 특정 작업을 템플릿화한 것프로듀서소스 커넥터; 데이터 전송SourceConnector설정 정의SourceTask데이터를 토픽으로 전송컨슈머싱크 커넥터; 데이터 처리메서드 재정의하여 사용컨버터 생성하여 사용 가능단일모드 커넥트, 분산모드 커넥트(2대 이상)파티션토픽 안의 파티션 개수를 줄이는 것은 지원하지 않는다파티션 수를 줄이려면 토픽을 삭제해야한다파티션 수는 첫 번째로는 프로듀서의 송신량을 고려하고두 번째로는 컨슈머의 수신량을 고려해야한다보통 컨슈머 처리량에 따라 파티션 개수를 맞춘다파티션은 카프카 병렬처리의 핵심이다컨슈머 처리량을 늘리거나 컨슈머를 추가하여 병렬처리량을 늘려 데이터 처리의 속도를 개선한다(메세지 키를 사용하는 컨슈머의 경우 파티션의 개수가 달라질 경우 특정 메세지 키의 파티션의 순서를 보장받지 못하는 문제가 있을 수 있다) 컨슈머 랙Lag토픽의 최신 오프셋과 컨슈머 오프셋의 차이일시적으로 파티션과 컨슈머를 늘리는 방법도 있다컨슈머 랙 모니터링 툴; 카프카 버로우프로듀서 설정/옵션프로듀서 acks1은 리더 파티션에만 저장all or -1은 전부 저장멱등성 프로듀서; 한 번만 저장enable.idempotence true트랜잭션 transactional.id를 설정하면프로듀서와 컨슈머는 트랜잭션 레코드가 존재하는 데이터만 처리한다멀티스레드 컨슈머카프카 미러메이커  

kafka

채널톡 아이콘