Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- springboot
- Apache Kafka
- 백트래킹
- 백준
- 알고리즘
- 월미도
- 자료구조
- JPA
- 스프링
- Spring
- VPC
- Spring Boot
- 카프카
- 인천여행
- 스프링 부트
- 로드밸런서
- 쿠버네티스
- Kafka
- aws
- Elasticsearch
- gcp
- 클라우드 컴퓨팅
- Docker
- DFS
- 스프링부트
- 클라우드
- 프로그래밍문제
- 코드업
- 오일러프로젝트
- Spring Data JPA
Archives
- Today
- Total
GW LABS
실전 카프카 개발부터 운영까지 (3) - 카프카 기본 개념과 구조 본문
카프카 아키텍처
3.1.1 리플리케이션
- 각 메시지들을 여러 개로 복제해서 카프카 클러스터 내 브로커들에 분산시키는 동작
- topic의 replication-factor 옵션으로 브로커에 분산할 수 있음
- 리플리케이션 기준
- 테스트/개발환경: 리플리케이션 펙터 수를 1로 설정
- 운영 환경(로그성 메시지로서 약간의 유실 허용): 리플리케이션 팩터 수를 2로 설정
- 운영 환경(유실 허용하지 않음): 리플리케이션 팩터 수를 3으로 설정
3.1.2 파티션
- 토픽의 처리량을 높이기 위해 병렬 처리가 가능하게 만든 것을 의미
- 파티션의 수만큼 컨슈머를 연결할 수 있음
- 파티션은 늘리는 것은 가능하지만 줄일 수는 없다!
- 2~4로 설정 후 LAG 등의 지표를 통해 늘려나가는 것이 좋다
3.1.3 세그먼트
- 파티션 안에 N개의 세그먼트로 메시지가 저장 된다.
3.2.1 분산 시스템
- 높은 처리량과 가용성을 보장
- 브로커를 추가하는 방식으로 확장이 용이
3.2.2 페이지 캐시
- 카프카는 OS의 페이지 캐시를 활용하는 방식으로 설계되어 있음
- 직접 디스크 I/O를 하지 않고 물리 메모리 중 애플리케이션이 사용하지 않는 일부 잔여 메모리를 활용
3.2.3 배치 전송 처리
- 네트워크 오버헤드를 줄이고 처리속도를 증가시키는 배치 전송을 지원
3.2.4 압축 전송
- 메시지 전송 시에 압축 기능을 제공하고 있음
- gzip, snappy, lz4, zstd 등의 타입을 지원
- 높은 압축률: gzip, zstd
- 빠른 응답 속도: lz4, snappy
3.2.5 토픽, 파티션, 오프셋
- 토픽 > 파티션 > 오프셋
- 파티션의 메시지가 저장되는 위치를 오프셋이라고 부름
- 오프셋은 순차적으로 증가하는 숫자(64비트 정수)
3.2.6 고가용성 보장
- 노드 장애 대응 외의 리플리케이션 기능을 제공
- 리플리케이션 기능은 토픽을 복제하는 것이 아닌 파티션을 복제
3.3.1 프로듀서 디자인
- 레코드: 토픽, 파티션, 키, 밸류로 구성
- 파티셔너: 레코드에 파티션이 지정되지 않았다면 키를 가지고 파티션을 선택하는 로직 수행
- 프로듀서는 send() 메소드 동작 이후 레코드들을 파티션별로 모았다가 배치전송을 수행
3.3.2 프로듀서의 주요 옵션
- bootstrap.servers: 클라이언트가 카프카 클러스터에 처음 연결하기 위한 호스트와 포트 정보
- client.dns.lookup: 클라이언트가 연결 실패시 다른 IP로 시도하는 설정
- acks: 프로듀서가 카프카 토픽의 리더 측에 메시지를 전송한 후 요청을 완료하기를 결정하는 옵션
- 0: 빠른 전송을 의미하지만, 일부 메시지 손실 가능성
- 1: 리더가 메시지를 받았는지 확인하지만, 모든 팔로워를 확인하지 않음
- all(-1): 팔로워도 메시지를 받았는지 체크
- buffer.memory: 프로듀서가 카프카 서버로 데이터를 보내기 위해 잠시 대기할 수 있는 전체 메모리 바이트
- compression.type: 프로듀서가 메시지 전송 시 선택할 수 있는 압축 타입. none, gzip, snappy, lz4, zstd
- enable.idempotence: 멱등성 옵션. 중복없는 전송이 가능하다.
- max.in.flight.requests.per.connection은 5이하, retries는 0 이상, aks는 all로 설정해야 함
- max.in.flight.requests.per.connection: 하나의 커넥션에서 프로듀서가 최대한 ACK 없이 전송할 수 있는 요청 수. 메시지의 순서가 중요하다면 1로 설정하는 것이 좋음
- retries: 일시적인 오류로 인해 전송에 실패한 데이터를 다시 보내는 횟수
- batch.size: 배치 전송시 사이즈
- linger.ms: 배치 형태의 메시지를 보내기 전 추가적인 메시지를 기다리는 시간
- transactional.id: ‘정확히 한 번 전송’을 위해 사용하는 옵션. enable.idempotence를 true로 설정해야 함
3.3.3 프로듀서 예제
- 결과확인 하지 않는 방식
- 동기 방식
- Future 타입으로 받아온 레코드 메타 데이터의 결과를 기다리는 방식으로 구현
- 비동기 방식
- 콜백을 구현하여 레코드 전송시에 콜백을 함께 보냄
3.4.1 컨슈머의 기본 동작
- 컨슈머 그룹: 하나 이상의 컨슈머가 속한 그룹
- 각 파티션의 리더에게 카프카 토픽에 저장된 메시지를 가져오기 위한 요청전송
- 파티션 수와 컨슈머 수는 일대일로 매핑되는 것이 이상적
3.4.2 컨슈머의 주요 옵션
- bootstrap.servers: 브로커의 정보 입력
- fetch.min.bytes: 한 번에 가져올 수 있는 최소 데이터 크기. 만약 지정한 크기보다 작은 경우, 요청에 응답하지 않고 데이터가 누적될 때까지 기다린다.
- group.id: 컨슈머가 속한 컨슈머 그룹을 식별하는 식별자.
- heartbeat.interval.ms: 컨슈머 상태체크를 위한 하트비트 인터벌. session.timeout.ms보다 낮은 값으로 설정해야 하며 일반적으로 1/3으로 설정
- max.partition.fetch.bytes: 파티션당 가져올 수 있는 최대 크기
- session.timeout.ms: 컨슈머가 종료된 것인지 판단하는 지표. 만약 종료되었다고 판단되면 컨슈머 그룹에서 제외하고 리밸런싱을 시작
- enable.auto.commit: 백그라운드로 주기적으로 오프셋을 커밋
- auto.offset.reset: 카프카에서 초기 오프셋이 없거나 현재 오프셋이 더 이상 존재하지 않는 경우에 다음 옵션들로 reset
- earliest: 가장 초기의 오프셋값으로 설정
- latest: 가장 마지막의 오프셋값으로 설정
- none: 이전 오프셋값을 찾지 못하면 에러
- fetch.max.bytes: 한 번의 가져오기 요청으로 가져올 수 있는 최대 크기
- group.instance.id: 컨슈머의 고유한 식별자. 설정된다면 static 멤버로 간주되어 불필요한 리밸런싱을 하지 않음
- isolation.level: 트랜잭션 컨슈머에서 사용되는 옵션으로, read_uncommitted는 기본값으로 모든 메시지를 읽고, read_committed는 트랜잭션이 완료된 메시지만 읽음
- max.poll.records: poll() 요청으로 가져오는 최대 메시지 수
- partition.assignment.strategy: 파티션 할당 전략
- fetch.max.wait.ms: fetch.min.bytes에 의해 설정된 데이터보다 적은 경우 요청에 대한 응답을 기다리는 최대 시간
3.4.3 컨슈머 예제
- 오토 커밋
- 오프셋을 주기적으로 커밋하므로 관리자가 오프셋을 따로 관리하지 않아도 됨
- 컨슈머 종료 등이 빈번히 일어나면 일부 메시지를 못가져오거나 중복으로 가져올 가능성
- 동기 가져오기
- poll()을 이용해 메시지를 가져온 후 처리까지 완료하고 현재 오프셋을 커밋(consumer.commitSync())
- 속도는 느리지만 메시지 손실은 거의 발생하지 않음
- 그래도 메시지 중복이슈는 피할 수 없음
- 비동기 가져오기
- consumer.commitAsync()를 사용하여 비동기 커밋
- 비동기 방식은 오프셋 커밋 실패시 재시도를 하지 않음(마지막 오프셋만 커밋되면 순서상 문제 없기 때문)
- 이렇게하여 비동기 방식의 중복을 최대한 줄임
스프링부트 카프카어드민, 프로듀서, 컨슈머 구성법
'Book-Review > Programing' 카테고리의 다른 글
실전 카프카 개발부터 운영까지 (5) - 프로듀서의 내부 동작 원리와 구현 (0) | 2022.09.04 |
---|---|
실전 카프카 개발부터 운영까지 (4) - 카프카의 내부 동작 원리와 구현 (0) | 2022.09.03 |
실전 카프카 개발부터 운영까지 (2) - 카프카 환경 구성 (0) | 2022.08.31 |
실전 카프카 개발부터 운영까지 (1) - 카프카 개요 (0) | 2022.08.31 |
기초부터 다지는 ElasticSearch 운영 노하우 (7) - 검색 엔진으로 활용하기 (0) | 2022.08.30 |
Comments