Kafka 생산자 ack, min.insync.replicas, 복제 요소 메커니즘 분석

Kafka에는 세 가지 매우 중요한 구성 매개변수인 acksmin.insync.replicas가 있습니다. 그리고 replication factor 그중 < a i=4>는 생산자의 구성 매개변수이고, 는 브로커의 구성 매개변수입니다. 이 세 가지 매개변수는 생산자의 데이터 손실을 방지하는 데 큰 역할을 합니다.acksmin.insync.replicas

1. 파티션 복사


1. Kafka의 토픽은 파티셔닝이 가능하며, 파티션별로 여러 개의 복사본을 구성할 수 있습니다. 구성은replication.factor 매개변수를 통해 변경할 수 있습니다.

2. Kafka에는 Leader Replica와 Follower Replica의 두 가지 유형의 파티션 복제본이 있으며, 각 파티션이 생성될 때 하나의 복제본을 Leader Replica로 선택해야 하며 나머지 복제본은 자동으로 Follower 복사본이 됩니다.

3. Kafka에서 Follower 복사본은 외부 세계에 서비스를 제공하지 않습니다. 즉, 어떤 Follower 복사본도 Consumer와 생산자의 읽기 및 쓰기 요청에 응답할 수 없습니다. 모든 요청은 Leader가 보내야 합니다. Leader copy가 이를 처리합니다. 즉, 모든 읽기 및 쓰기 요청은 Leader Copy가 있는 Broker로 보내야 하며 Broker는 처리를 담당합니다. Follower Copy는 클라이언트 요청을 처리하지 않으며 유일한 작업은 다음과 같습니다. 리더 복사본에서 읽기 < /span> 자체 커밋 로그에 기록하여 리더 복제본과 동기화합니다.비동기적으로 메시지를 가져와

4. Kafka의 기본 복제 인수replication.factor는 3입니다. 즉, 각 파티션에는 리더 복사본 1개와 팔로워 복사본 2개만 있습니다. 자세한 내용은 다음 그림과 같습니다.

5. 위에서 언급한 것처럼 생산자 클라이언트는 리더 브로커에만 쓰기를 하고 팔로어는 비동기적으로 데이터를 복사합니다. Kafka는 분산 시스템이기 때문에 Leader와 실시간으로 동기화하지 못할 위험이 있을 수밖에 없으므로 이러한 Follower들이 Leader를 따라잡고 있는지, 즉, 팔로어가 최신 데이터를 동기화했습니다. 즉, Kafka는 어떤 조건에서 팔로어 복사본이 리더와 동기화될 수 있는지 명확하게 알려주고 싶어합니다. 이는 아래에서 설명하는 ISR 동기화 복사 메커니즘입니다.

2. 동기화된 복제본


1. ISR(In-sync Replica)은 동기식 복제본이라고 하며, ISR에 포함된 복제본은 모두 Leader와 동기화된 복제본이므로 목록에 없는 팔로워는 Leader와 동기화되지 않은 것으로 간주됩니다. 그렇다면 ISR에는 무엇이 존재하며, 어떤 사본이 존재하는가? 우선 ISR에는 Leader Copy가 항상 존재한다는 것이 분명하며, Follower Copy가 ISR에 있는지 여부는 Follower Copy가 Leader Copy와 "동기화"되었는지 여부에 따라 달라집니다.

스크리밍 팁: "팔로워 복사본이 리더 복사본과 동기화되는지 여부"에 대한 이해는 다음과 같습니다.

1. 위에서 언급한 동기화는 완전한 동기화를 의미하지 않습니다. 즉, Follower 사본이 Leader 사본과의 동기화가 뒤쳐지면 ISR 목록에서 제외된다는 의미는 아닙니다.

2. Kafka의 브로커 측에는 팔로워 복사본과 리더 복사본 사이의 최대 시간 간격을 나타내는 매개변수replica.lag.time.max.ms가 있습니다. 기본값은 10초입니다. 이는 다음과 같습니다. Follower Copy와 Leader Copy 사이의 시간 간격이 10초를 초과하지 않는 한, Follower Copy와 Leader Copy는 동기화된 것으로 간주할 수 있으므로, 현재 Follower Copy가 Leader Copy보다 몇 시간 뒤쳐지더라도 메시지가 리더 카피를 10초 이내에 따라잡으면 쫓겨나지 않습니다.

3. Follower 사본이 ISR 목록에서 제외되면 Leader 사본의 진행을 따라잡을 때 다시 ISR 목록에 추가되므로 ISR은 동적 목록이며 정적이 아닙니다.

2. 위 그림과 같이 Broker3의 partition1 복사본이 지정된 시간을 초과하여 Leader 복사본과 동기화되지 않아 ISR 목록에서 제외됩니다. 이때의 ISR은 [1,3]입니다.

3. 확인 메커니즘을 확인합니다.


1. acks 매개변수는 생산자가 메시지가 성공적으로 기록되었다고 간주하기 전에 메시지를 수신해야 하는 파티션 복제본 수를 지정합니다. 이 매개변수는 메시지 손실 여부에 중요한 역할을 합니다. 이 매개변수의 구성은 다음과 같습니다.

  • acks=0은 메시지 작성에 성공하기 전에 생산자가 서버의 응답을 기다리지 않음을 의미합니다. 즉, 일단 문제가 발생하고 서버가 메시지를 수신하지 못하면 생산자는 메시지를 알 수 없으며 메시지가 구성을 변경할 때 서버의 응답을 기다릴 필요가 없기 때문에 네트워크가 지원하는 최대 속도로 메시지를 보낼 수 있어 매우 높은 처리량을 달성할 수 있습니다.

  • acks=1은 클러스터의 리더 파티션 복사본이 메시지를 수신하는 한 생산자에게 성공적인 응답 ack를 보낸다는 의미입니다. 이때 생산자가 ack를 받은 후에는 메시지가 성공적으로 기록된 것으로 간주할 수 있습니다. 메시지를 리더 파티션 복사본에 쓸 수 없으면(예: 네트워크 이유, 리더 노드 충돌) 생산자는 오류 응답을 받게 됩니다. 생산자가 오류 응답을 받으면 데이터 손실을 방지하기 위해 데이터가 이 방법의 처리량은 비동기 전송을 사용하는지 동기 전송을 사용하는지에 따라 달라집니다.

    Screaming Tip: Producer가 오류 응답을 받으면 메시지를 다시 보내도 데이터 손실이 계속 발생할 수 있습니다. 예를 들어 메시지를 받지 못한 노드가 새로운 리더가 되면 메시지가 손실됩니다.

  • acks =all은 복제에 참여하는 모든 노드(ISR 목록의 복사본)가 메시지를 수신한 경우에만 생산자가 서버로부터 응답을 수신한다는 의미입니다. 이 모드는 가장 높은 수준이고 가장 안전하므로 A Broker 이상을 보장합니다. 메시지를 수신합니다. 이 모드에서는 대기 시간이 길어집니다.

4. 최소 동기화 사본


1. 위에서 언급한 것처럼 acks=all인 경우 모든 레플리카가 동기화되어야 성공적인 응답이 Producer에게 전달될 수 있는데, 사실 여기서 문제가 하나 있는데, Leader 레플리카가 유일하게 동기화된 레플리카라면 어떻게 될까요? 이는 acks=1과 동일하므로 안전하지 않습니다.

2. Kafka의 브로커 측에서는 매개변수를 제공합니다min.insync.replicas. 이 매개변수는 메시지가 "실제 쓰기"로 간주되기 전에 기록되는 최소 복사본 수를 제어합니다. 값의 기본값은 1입니다. 프로덕션 환경을 1보다 큰 값으로 설정하면 메시지의 내구성이 향상될 수 있습니다. 동기화된 복제본 수가 구성된 값보다 낮을 경우 프로듀서는 오류 응답을 받게 되므로 메시지의 내구성이 향상됩니다. 메시지가 손실되지 않았다는 것입니다.

4.1, 사례 1

1. 아래 그림과 같이 min.insync.replicas=2, acks=all일 때 ISR 목록에 [1,2]만 있으면 3개만 ISR 목록에서 제외됩니다. 두 개의 복제본이 동기화되고 생산자는 성공적인 응답을 받게 됩니다.

4.2, 사례 2

1. 아래 그림과 같이 min.insync.replicas=2일 때 ISR 목록에 [1]만 있으면 2, 3이 ISR 목록에서 추방되고 acks=all일 경우 해당 번호를 쓸 수 없다. acks=0 또는 acks=1이면 데이터를 성공적으로 쓸 수 있습니다.

4.3, 사례 3

1. 이 상황은 오해의 소지가 있습니다. acks=all 및 min.insync.replicas=2이고 ISR 목록이 [1,2,3]인 경우 모든 동기화 복제본이 메시지를 동기화할 때까지 계속 기다립니다. 생산자에게 성공적인 응답 응답을 보냅니다. min.insync.replicas=2는 최소 제한일 뿐이므로, 즉 동기화 복제본이 구성된 값보다 작으면 예외가 발생하고 acks=all은 다음을 수행해야 합니다. 모든 ISR이 목록의 모든 사본이 동기화된 경우에만 성공적인 응답을 보낼 수 있는지 확인하십시오.아래 그림과 같이:

5. 요약


  • acks=0을 사용하면 생산자는 메시지를 성공적으로 쓰기 전에 서버의 응답을 기다리지 않습니다.

  • acks=1, 클러스터의 리더 파티션 복사본이 메시지를 수신하는 한 생산자에게 성공적인 응답 응답을 보냅니다.

  • acks=all, 이는 복제에 참여하는 모든 노드(ISR 목록의 사본)가 메시지를 수신해야 생산자가 서버로부터 응답을 받는다는 의미입니다. 복사본이 < /span>min.insync.replicas 값보다 작으면 메시지가 기록되지 않습니다.

원본 주소:Kafka 생산자 ack 메커니즘 분석

추천

출처blog.csdn.net/qq_38263083/article/details/133121727