본문 바로가기

Kafka

[Spring + Kafka] 간단 실습 * 본 글에서는 Spring + Kafka를 매우 간단하게 적용해 볼 예정이다. kafka 간단 정리 Porudcer는 Topic에 데이터를 적재하고, Consumer는 Topic에서 데이터를 가져와 처리한다. Topic은 키 값에 따라 여러 파티션으로 나눠서 적재(파티셔닝)되고, Consumer Group의 포함된 하나의 Comsumer가 하나의 Partition을 담당하여 데이터를 처리한다. Consumer가 데이터를 처리하면, ACK를 날려 데이터를 처리했다고 표시한다. ACK를 날리는 방법은 여러 가지가 존재한다. Kafka의 자세한 설명은 다음 링크를 통해서 확인할 수 있다.https://yeongchan1228.tistory.com/52 [Kafka] Apache Kafka란? 데이터가 흐르는.. 더보기
[Kafka] Exactly Once Semantics(EOS) * Producer가 데이터를 전달하는 방식 At-Most-Once Semantics(최대 한 번) 확인 시간이 초과되거나 오류가 반환될 때, Producer가 재시도를 하지 않으면, 데이터가 Kafka Topic에 기록되지 않아 Consumer에 전달되지 않을 수 있다. 중복 가능성을 피하기 위해서 때때로 허용한다. At-Least-Once Semantics(최소 한 번) Producer가 Kafka Broker로부터 ack를 수신하고 acks=all이면, 메시지가 Kafka Topic에 최소 한 번 작성되었음을 보장한다. ack가 시간 초과되거나 오류를 수신하면, 메시지가 Kafka Topic에 기록되지 않았다고 가정하고 데이터를 재전송할 수 있다. Broker가 ack를 보내기 직전에 실패했지만, .. 더보기
[Kafka] Kafka Log File * Topic, Partition, Segment 구조(Multi Partition을 통한 병렬 처리 구조일 경우) Partition은 Broker들에게 분산되며, 각 Partition은 Segment File들로 구성된다. Rolling Strategy: log.segment.bytes(default 1GB), log.roll.hours(default 168 hours) Log Segment File Data File이라고 부른다. 첫 번째로 저장되는 데이터의 Offset이 파일명이 된다. Segment File이 생성되는 위치는 각 Broker의 server.properties 파일 안의 log.dirs 파라미터로 정의한다. -> 콤마를 사용하여 여러 디렉터리 지정 가능 log.dirs=/data/k.. 더보기
[Kafka] Partition Assignment Strategy * Partition Assignment Strategy 설정은 Consumer의 설정 파라미터 중에서 partition.assignment.strategy 값을 아래 표와 같이 변경하여 할당 방식을 조정할 수 있다. org.apache.kafka.clients.consumer.RangeAssignor (default) Topic 별로 작동하는 Default Assignor org.apache.kafka.clints.consumer.RoundRobinAssignor Round Robin 방식으로 Consumer에게 Partition 할당 org.apache.kafka.clients.consumer.StickyAssignor 최대한 많이 기존의 Partition 할당을 유지하면서, 최대 균형을 이루는 할당.. 더보기
[Kafka] Replication (2) In-Sync Replicas 리스트 관리 Leader가 관리한다. 메시지가 ISR 리스트의 모든 Replica에서 수신되면 Commit된 것으로 간주한다. Kafka Cluster의 Controller가 모니터링하는 ZooKeeper의 ISR 리스트에 대한 변경 사항은 Leader가 관리한다. Follower가 실패하는 경우, Leader에 의해 ISR 리스트에서 삭제되고 Leader는 새로운 ISR을 사용하여 Commit한다. (1)에서 replica.lag.time.max.ms 이내에 Follower가 fetch하지 않으면, ISR에서 제거한다. Broker 1이 ZooKeeper에게 ISR 변경을 알린다. ZooKeeper는 Partition Metadata에 대한 변경 사항을 Controller.. 더보기
[Kafka] Replication (1) Broker에 장애가 발생할 경우, 장애가 발생한 Broker의 Partition들은 모두 사용할 수 없게 되는 문제가 발생하여 Producer는 데이터를 전송할 수 없고, Consumer는 데이터를 받아서 처리할 수 없다. 또한, 장애가 발생하면 CURRENT-OFFSET, LOG-END-OFFSET, Consumer Lag 등의 정보들도 사라지게 된다. -> 다른 Broker에서 장애가 발생한 Partition을 대신해서 새로운 Partition을 만들어도 장애가 해결되지 않는 이유(OFFSET 정보, 기존 정보들은 복수할 수 없다) Replication 위 상황을 대비하기 위한 기술로, Partition을 복제하여 다른 Broker 상에 복제물(Replicas)을 만들어서 장애를 미리 대비한다. 메.. 더보기
[Kafka] Consumer (2) 지난 글 요약 Consumer는 메시지를 가져오기 위해서 Partition에 연속적으로 Poll을 하고 가져온 위치를 나타내는 offset 정보를 __consumer_offsets Topic에 저장하여 관리한다. 동일한 group.id로 구성된 모든 Consumer들은 하나의 Consumer Group을 형성하고 Consumer Group의 Consumer들은 작업량을 어느 정도 균등하게 분할한다. 이때, 데이터는 Partition에 균등하게 존재해야 한다. 동일한 Topic에서 Consume 하는 여러 Consumer Group이 존재할 수 있다. Partition Assignment Partition을 Consumer에게 Assign(할당)할 때 하나의 Partition은 지정된 Consumer Gr.. 더보기
[Kafka] Consumer (1) Partition으로부터 Record(데이터)를 가져와서 활용하는 애플리케이션 Consumer는 각각의 고유의 속도로 Partition(Commit Log)으로부터 순서대로 Read를 수행한다. * Consumer Group 다른 Consumer Group에 속한 Consumer들은 서로 관련이 없으며(독립적), Partition에 있는 Event(Message)를 동시에 다른 위치에서 Read 할 수 있다. Consumer Group은 각 Consumer의 Group Id가 같은 Consumer의 모임이다. Consumer Group의 Consumer들은 작업량을 어느 정도 균등하게 분할한다. * Consumer Offset: Consumer Group이 읽은 위치를 표시한다. Consumer가 자동이.. 더보기