반응형
카프카란?
- 아파치 카프카(Apache Kafka)는 분산 스트리밍 플랫폼으로, 대용량의 실시간 데이터 스트림을 처리하기 위해 설계되었다.
- 카프카는 대량의 데이터를 안정적이고 빠르게 처리할 수 있으며, 대규모 분산 시스템에서 확장성과 내결함성을 보장한다.
- 소스애플리케이션과 타겟 애플리케이션의 결합도를 낮추기 위해 등장했다.
카프카 토픽
- 카프카에서 데이터가 들어가는 공간을 토픽이라고 부른다.
- 토픽은 여러 개를 생성할 수 있다. 목적에 따라 이름을 명확하게 적어야 유지보수가 편리하다.
- 데이터베이스 테이블과 파일 시스템의 파일과 유사하다.
- 카프카 프로듀서가 토픽에 데이터를 넣고, 카프카 컨슈머가 데이터를 가져간다.
- 하나의 토픽은 여러 개의 파티션으로 구성된다.
파티션
- 파티션은 0번부터 시작한다.
- 파티션은 큐와 같이 선입선출이다. 즉, 토픽에 컨슈머가 붙으면 데이터를 가장 오래된 순서대로 가져온다.
- 데이터가 파티션에 들어오지 않으면 컨슈머는 데이터가 들어올 때 까지 기다린다. pub-sub 방식인 것 같다.
- 컨슈머가 파티션에서 데이터를 가져가도 파티션 내부의 데이터는 삭제되지 않는다.
- 이 파티션의 남은 데이터는 새로운 컨슈머가 붙었을 때 0번부터 다시 가져갈 수 있다.
여기에는 조건이 있는데 컨슈머 그룹이 달라야 하고 auto.offset.reset = earliest 설정을 주어야한다. - 이 파티션의 데이터를 엘라스틱 서치에 저장하기도 하고 하둡에 저장할 수도 있다.
파티션이 2개인 경우
- 프로듀서가 데이터를 보낼 때 키를 지정할 수 있다.
- 키가 null이고, 기본 파티셔너를 사용한다면 라운드 로빈으로 할당한다.
- 키가 있고, 기본 파티셔너를 사용한다면 키의 해시 값을 구하고, 특정 파티션에 할당한다.
- 참고로 파티션을 늘리는 것은 아주 조심해야 한다고 한다. 파티션은 다시 줄일 수 없기 때문이다.
- 파티션을 늘리면 컨슈머의 개수를 늘려서 데이터 처리를 분산시킬 수 있다.
- 파티션의 데이터가 삭제되는 타이밍은 옵션에 따라 다르다.
카프카 프로듀서
- 데이터를 카프카에 보내는 역할을 한다.
- 즉 데이터를 카프카 토픽에 생성하는 것이다.
- 대량의 데이터를 실시간으로 적재할 때 프로듀서를 사용할 수 있다.
프로듀서의 역할
프로듀서는 총 3가지의 역할을 가지고 있다.
- Topic에 해당하는 메시지를 생성한다.
- 특정 Topic으로 데이터를 Publish한다.
- 카프카 브로커로 데이터를 전송할 때 전송 성공여부를 알 수 있고, 실패한다면 재시도한다.
카프카 브로커
- 카프카 브로커는 카프카가 설치되어 있는 서버 단위를 말한다.
- 보통 3개 이상의 브로커로 구성해 사용하는 것을 권장한다.
Replication
- 레플리케이션(Replication)은 파티션의 복제를 뜻한다.
- 레플리케이션이 1이면 파티션이 1개만 존재한다는 뜻이고, 레플리케이션이 2라면 파티션은 원본 1개와 복제본 1개로 총 2개가 존재하는 것이다. 마찬가지로 레플리케이션이 3이면 원본 1개와 복제본 3개가 존재하는 것이다.
- 브로커에 따라 레플리케이션 개수가 제한된다. 브로커가 3대라면 레플리케이션은 4개가 될 수 없다.
- 원본 파티션은 리더 파티션, 나머지 복제본 파티션은 팔로워 파티션이라고 부른다.
- 리더 파티션, 팔로워 파티션을 합쳐서 ISR, In Sync Replica라고 볼 수 있다.
- 레플리케이션은 파티션의 고가용성을 위해 사용된다.
- 브로커 1개가 고장나면 해당 파티션은 복구할 수 없다. 그러나 레플리케이션을 사용해 브로커가 3대라면 브로커 1개가 죽더라도 팔로워 파티션이 존재하므로 복제본으로 복구가 가능하다. 그럼 나머지 1개가 리더 파티션의 역할을 수행하게 된다.
- 레플리케이션 개수가 많아지면 브로커의 리소스 사용량도 늘어나므로 적절한 레플리케이션 개수를 설정해야 한다.
- 3개 이상의 브로커를 사용하면 레플리케이션을 3으로 설정하는 것을 추천한다고 한다.
리더 파티션(Leader partition)과 팔로워 파티션(Follower partition)
- 프로듀서가 토픽의 파티션에 데이터를 전달한다.
- 이때 데이터를 전달 받는 주체가 리더 파티션이다.
- 프로듀서에는 ack라는 상태 옵션이 있다.
- ack는 0, 1, all 옵션 3개중 1개를 골라서 사용할 수 있다.
- 0일 경우 리더 파티션에 데이터를 전송하고 데이터를 정상적으로 받았는지 응답 값을 받지 않는다. 나머지 파티션에 데이터가 복제되었는지 알 수 없다.
- 1일 경우 리더 파티션에 데이터를 전송하고 데이터를 정상적으로 받았는지 응답 값을 받는다. 다만 나머지 파티션에 복제되었는지 알 수 없다.
- all일 경우 데이터를 정상적으로 받았는지 응답 값을 받고, 팔로워 파티션에 복제되었는지 응답 값을 받는다.
이 옵션을 사용하면 데이터 유실은 없다. 그러다 속도는 느리다.
카프카 컨슈머
- 카프카에서는 컨슈머가 데이터를 가져가더라도 파티션의 데이터가 사라지지 않는다.
카프카 컨슈머 역할
- 컨슈머의 역할은 크게 3가지다.
- 첫 번째는 토픽의 파티션 내부에 있는 데이터를 가져오는 것이다. 이렇게 데이터를 가져오는 것을 폴링이라고 한다.
메시지를 가져와서 특정 데이터베이스에 저장하거나 또 다른 파이프라인에 전달할 수 있다. - 두 번째는 오프셋 위치를 커밋할 수 있다. 오프셋이란 파티션에 있는 데이터의 번호를 뜻한다.
- 세 번째는 컨슈머가 여러개일 경우 병렬 처리를 할 수 있다.
주키퍼
- 카프카 주키퍼(Zookeeper)는 Apache 카프카(Kafka)에서 중앙 집중식 서비스로 사용되며, 클러스터 내의 브로커(Broker)를 관리하고 메시지 전달에 대한 메타데이터를 저장하는 역할을 한다.
- 또한, 카프카 클러스터 내의 리더(Leader)와 팔로워(Follower)를 관리하여 분산 시스템의 일관성과 가용성을 보장한다.
- 그러나 주키퍼는 단계적으로 deprecated 될 예정이라고 한다. Kraft로 대체될 예정이라고 한다.
참고자료
ChatGPT
아파치 카프카 애플리케이션 프로그래밍 with Java
https://www.youtube.com/playlist?list=PL3Re5Ri5rZmkY46j6WcJXQYRlDRZSUQ1j
반응형
댓글