데이터 엔지니어 기술 블로그

[🧙Kafka] 카프카 개념 - 신뢰성 있는 데이터 전달 본문

데이터 엔지니어링

[🧙Kafka] 카프카 개념 - 신뢰성 있는 데이터 전달

jun_yeong_park 2021. 4. 14. 13:54
반응형

신뢰성 있는 데이터 전달

카프카는 웹 클릭 로그 수집, 신용카드 트랜잭션 등 다양한 방면에서 사용된다. 카프카는 신뢰성과 속도 등 사이에서

구성으로 유연하게 조절할 수 있다.

 

신뢰성 보장

1. 카프카는 메시지 순서를 보장한다.

2. 카프카에 메시지를 쓸 때 리플리카에 메시지를 복제하는 작업의 구성으로 신뢰성을 조절할 수 있다. 만약 acks 를 높게 두고 요청에 실패했다면 프로듀서에서 다시 재시도 할 수 있다.

    - acks = 0 메시지를 보내고 확인을 하지 않는다.

    - acks = 1 리더가 메시지를 썼는지 확인한다.

    - acks = all 모든 동기화 리플리카에 복제되었는지 확인한다.

3. 최소한 하나의 리플리카가 살아있다면 메시지는 유실되지 않는다.

4. 컨슈머는 모든 리플리카에 커밋된 메시지만 읽을 수 있다.

 

복제(replication)

아래의 조건을 모두 만족한다면 연결이 되어있다고 간주한다. 만약 만족하지 못하면 비동기화 리플리카가 된다.

1. 주키퍼에게 n초 내에 하트비트를 전송함

2. n초 내에 리더로부터 메시지를 읽음

3. n초 내에 리더로부터 최근 메시지를 읽음

 

replication factor

복제 팩터가 N개면 N-1개가 중단되더라도 메시지는 유실되지 않는다. 복제 팩터가 N개면 브로커는 N개가 필요하며 각자 다른 브로커로 복제가 된다.

 

unclean leader election

파티션의 리더를 더이상 사용할 수 없다면 동기화 리플리카 중 하나가 리더로 선출되는데 이 경우 clean leader election 이라고 한다. 만약 동기화 리플리카가 존재하지 않고 비동기화 리플리카만 존재한다면 unclean leader election 이라고 한다. unclean.leader.election.enable 이라는 구성을 True 또는 False 값으로 해서 선택할 수 있다.

1. 만약 이 값이 True라면 나중에 합쳐지고 문제가 생기고 하면서 데이터가 뒤섞이게 된다.

2. 만약 이 값이 False라면 그 파티션은 오프라인 상태로 남게 된다. 그러면 신규 메시지를 버리게 된다.

 

min.insync.replicas

커밋된 데이터를 하나 이상의 리플리카에 확실하게 쓰려면 min.insync.replicas 으로 최소 동기화 리플리카를 조절할 수 있다. 리플리카가 3개고 이 값이 2라면 2개까지 복제가 되지 않으면 메시지를 쓸 수 없게 할 수 있다. 만약 리플리카가 2개가 문제가 생기면 NotEnoughReplicasException 에러를 받게 된다.

 

프로듀서에서의 신뢰성

acks로 조절하고 문제가 생기면 retries 매개변수로 재시도 횟수를 조절한다. 만약 재시도 횟수를 무한으로 하면 최소 한 번 메시지 도착(at-least-once)을 보장할 수 있다. 하지만 계좌에 10만원을 넣는 동작 등 결과를 변경하는 작업에는 문제가 생길 수 있다. 이런 경우에는 메시지에 uid를 넣어서 메시지를 걸러내는 것이 좋다.

 

컨슈머에서의 신뢰성

컨슈머는 작업을 완료한 후 오프셋을 커밋해야 한다. 메시지를 다시 읽을 때는 마지막으로 커밋된 오프셋을 기준으로 읽는다. 작업을 완료하기 전에 오프셋을 커밋했는데 이후 작업 도중 문제가 생긴다면 문제가 생겼던 메시지는 넘어가게 되는 문제가 있다. 

 

컨슈머의 신뢰성을 보장하는 구성은 다음과 같다.

1. group.id: 두 개의 컨슈머가 같은 group.id를 갖는다면 파티션을 나눠서 가져가게 된다.

2. auto.offset.reset: 오프셋 값이 없을 때 least, ealiest로 값을 설정할 수 있다.

3. enable.auto.commit: 오프셋 커밋을 n초마다 자동으로 할 것인지 결정한다.

4. auto.commit.interval.ms 위의 n초를 설정할 수 있다.

 

만약 컨슈머가 상태 데이터를 유지해야 하는 경우는 results라는 토픽을 따로 만들어서 여기로 메시지를 보내고, results 를 사용하는 곳에서는 메시지를 가져와서 마지막 메시지로 업데이트 하는 방법이 있다.

 

단 한번만 전송(exactly-once)을 하려면 고유 키를 외부 시스템에 사용하는 방법이 있다.

 

시스템 신뢰성 검사

카프카에서는 브로커와 클라이언트 구성을 테스트하기 위해 아래와 같은 도구를 지원한다.

1. org.apache.kafka.tools.VerifiableProducer

2. org.apache.kafka.tools.VerifiableConsumer

 

여러가지 도구를 사용하고 브로커 문제 상황 등의 시나리오를 만들어서 테스트하는 방법으로 인프라를 보완할 수 있다.

 

모니터링

error-rate, retry-rate 등의 메트릭과 로그를 모니터링 할 수 있으면 좋다.

 

 

반응형
Comments