Kafka 주제 및 파티션 이해


185

엔터프라이즈 솔루션 목적으로 Kafka를 배우기 시작했습니다.

독서 중에 몇 가지 질문이 떠 올랐습니다.

  1. 제작자가 메시지를 작성할 때-메시지 를 보내려는 주제 를 지정합니다. 맞습니까? 파티션에 관심이 있습니까?
  2. 구독자가 실행 중일 때 동일한 주제의 소비자 클러스터 또는이 소비자 그룹에 관심이있는 여러 주제의 일부가되도록 그룹 ID를 지정합니까?
  3. 각 소비자 그룹에 브로커에 해당 파티션이 있습니까? 아니면 각 소비자 그룹에 있습니까?

  4. 파티션이 브로커에 의해 생성되었으므로 소비자가 걱정하지 않습니까?

  5. 이것은 각 파티션에 대한 오프셋이있는 큐이므로, 읽고 싶은 메시지를 지정하는 것은 소비자의 책임입니까? 상태를 저장해야합니까?

  6. 메시지가 대기열에서 삭제되면 어떻게됩니까? -예를 들어 : 보존 시간이 3 시간이고 시간이 지나면 오프셋이 양쪽에서 어떻게 처리됩니까?

답변:


162

이 게시물에는 이미 답변이 있지만 Kafka Definitive Guide의 몇 가지 그림으로 내 견해를 추가하고 있습니다.

각 질문에 대답하기 전에 제작자 구성 요소에 대한 개요를 추가하십시오.

생산자 구성 요소 개요

1. 제작자가 메시지를 작성할 때-메시지를 보내려는 주제를 지정합니다. 맞습니까? 파티션에 관심이 있습니까?

생산자는 다음에 따라 메시지를 배치 할 대상 파티션을 결정합니다.

  • 메시지 내에 지정된 경우 파티션 ID
  • 파티션 ID가 언급되지 않은 경우 키 % num 파티션
  • 메시지에서 파티션 ID메시지 키 를 사용할 수 없는 경우 라운드 로빈 , 즉 값만 사용할 수 있음

2. 가입자가 실행 중일 때-동일한 소비자 그룹 또는이 소비자 그룹이 관심을 갖는 여러 주제의 소비자 클러스터에 속할 수 있도록 그룹 ID를 지정합니까?

간단한 할당 API를 사용하지 않고 Kafka에 오프셋을 저장할 필요가없는 한 항상 group.id를 구성 해야합니다. 어떤 그룹에도 속하지 않습니다. 출처

3. 각 소비자 그룹에 브로커에 해당 파티션이 있습니까? 아니면 각 소비자 그룹에 있습니까?

하나의 소비자 그룹에서 각 파티션은 하나의 소비자 만 처리합니다 . 가능한 시나리오는 다음과 같습니다

  • 소비자 수가 주제 파티션 수 보다 적 으면 그룹의 소비자 중 하나에 여러 파티션을 할당 할 수 있습니다. 주제 파티션보다 적은 소비자 수
  • 주제 파티션의 수 와 동일한 소비자 수는 다음과 같습니다. 파티션 및 소비자 매핑은 다음과 같습니다. 토픽 파티션 수와 동일한 소비자 수
  • 소비자의 수는 보다 높은 , 아래와 같이 주제 파티션의 수, 다음 파티션 및 소비자 매핑 할 수 있습니다 효과적이지, 소비자 5 확인 토픽 파티션 수보다 많은 소비자 수

4. 브로커가 생성 한 파티션으로서 소비자에 대한 걱정이 없습니까?

소비자는 질문 3에서 설명한대로 파티션 수를 알고 있어야합니다 .

5. 각 파티션에 대한 오프셋이있는 큐이므로 소비자가 읽고 싶은 메시지를 지정해야합니까? 상태를 저장해야합니까?

카프카 (구체적으로하는 그룹 코디네이터 ) 내부에 메시지 생산하여 오프셋 상태를 돌봐 __consumer_offsets의 주제를,이 동작을 수동으로 구성 할뿐만 아니라에 의해 설정 될 수 있습니다 enable.auto.commitfalse. 이 경우 consumer.commitSync()consumer.commitAsync()오프셋 관리에 도움이 될 수 있습니다.

그룹 코디네이터 에 대한 추가 정보 :

  1. Kafka 서버 측에서 클러스터에 선출 된 브로커 중 하나입니다.
  2. 소비자는 오프셋 커밋 및 페치 요청을 위해 그룹 코디네이터와 상호 작용합니다.
  3. 소비자는 정기적 인 하트 비트를 그룹 코디네이터에게 보냅니다.

6. 메시지가 대기열에서 삭제되면 어떻게됩니까? -예를 들어 : 보존 시간은 3 시간이고 시간이 지나면 오프셋이 양쪽에서 어떻게 처리됩니까?

보존 기간 이후에 소비자가 시작되면 auto.offset.reset구성에 따라 메시지가 사용될 수 있습니다 latest/earliest. 기술적으로 그것은 latest(새로운 메시지 처리를 시작합니다) 그 시간까지 모든 메시지가 만료되었으며 보존 은 주제 레벨 구성 이기 때문 입니다.


5
안녕하세요 ! 나는 받아 들여진 대답의 저자이지만, 다이어그램이 200 % 명확하게하는 포인트 3에서 가장 훌륭하다고 생각합니다! 우리가 합병해야한다고 생각합니까?
C4stor

나는 당신 (또는 당신)이 당신의 대답의 요소를 내 안에 통합하여 더 가시성을 얻고이 (현재) 최고 대답을 향상시킬 수 있음을 의미했습니다. 그러나 나는 당신의 동의 없이는하지 않을 것입니다!
C4stor

다중 소비자를 파티션에 매핑 할 수없는 이유는 무엇입니까? 메시지가 한 번만 처리되도록하려면? 당신의 대답을위한 Thx.
g10guang

1
@ g10guang : 커밋 오프셋 유지 관리 가 어렵 기 때문입니다 .
mrsrinivas 10

1
다른 시나리오. 하나의 파티션과 MULTIPLE 소비자가 가입 / 할당 할 수 있습니다. 브로커는 등록 된 첫 번째 소비자에게만 레코드를 전달합니다. 그러나 첫 번째 소비자가 폴 간격보다 작업을 처리하는 데 더 많은 시간이 걸린다고 가정 해 봅시다. 레코드 소비는 브로커에 커밋되지 않습니다. 브로커는 소비자가 전화를 끊었다는 것을 이해합니다. 이 상태에서 브로커는 새로 할당 된 파티션을 모든 소비자에게 보내는 재조정을 트리거합니다. C1에서 여전히 처리 중이지만 다른 소비자가 메시지를 다시 사용합니다. 조심해.
Ruben Daddario

127

그것들을 순서대로 보자. :)

1-제작자가 메시지를 작성할 때-메시지를 보내려는 주제를 지정합니다. 맞습니까? 파티션에 관심이 있습니까?

기본적으로 생산자는 파티셔닝에 신경 쓰지 않습니다. 더 나은 제어를 위해 사용자 정의 된 파티 셔 너를 사용할 수있는 옵션이 있지만 완전히 선택 사항입니다.


2-구독자가 실행 중일 때-동일한 주제 또는이 소비자 그룹이 관심을 갖는 여러 주제의 소비자 클러스터의 일부가 될 수 있도록 그룹 ID를 지정합니까?

그렇습니다. 소비자는 부하를 공유하기 위해 소비자 그룹에 가입하거나 혼자 인 경우 만듭니다. 같은 그룹의 두 소비자는 같은 메시지를받지 않습니다.


3-각 소비자 그룹에 브로커에 해당 파티션이 있습니까? 아니면 각 소비자 그룹에 있습니까?

둘 다. 소비자 그룹의 모든 소비자에게는 두 가지 조건에서 파티션 세트가 할당됩니다. 동일한 그룹의 두 소비자는 공통된 파티션을 갖지 않으며 소비자 그룹 전체는 기존 파티션마다 할당됩니다.


4-파티션이 브로커에 의해 생성되었으므로 소비자가 걱정하지 않습니까?

그렇지는 않지만 기존 파티션보다 더 많은 소비자를 갖는 것이 전혀 쓸모가 없다는 것을 알 수 있습니다. 따라서 소비에 대한 최대 병렬 수준입니다.


5-각 파티션에 대해 오프셋이있는 큐이므로 소비자가 읽고 싶은 메시지를 지정해야합니까? 상태를 저장해야합니까?

예. 소비자는 파티션 당 주제별로 오프셋을 저장합니다. 이것은 Kafka가 완전히 처리하므로 걱정할 필요가 없습니다.


6-메시지가 대기열에서 삭제되면 어떻게됩니까? -예를 들어 : 보존 시간은 3 시간이고 시간이 지나면 오프셋이 양쪽에서 어떻게 처리됩니까?

소비자가 브로커의 파티션에 사용할 수없는 오프셋을 요청한 경우 (예 : 삭제로 인해) 오류 모드로 전환되어 궁극적으로이 파티션에 대해 가장 최근 또는 가장 오래된 메시지로 재설정됩니다 (에 따라 다름) auto.offset.reset 구성 값) 및 작업을 계속하십시오.


3
Sry :) kafka 프로세스 전체를 500 개의 문자 상자로 설명하는 것은 조금 어렵습니다. kafka.apache.org/documentation.html#theconsumer (그리고 아마도 섹션 4의 나머지 부분은 kafka internals)를 읽는 것이 좋습니다 . 기본적으로 소비자는 오프셋 저장을 요청 하지만 다른 곳에 저장됩니다.
C4stor

나는 이것을 읽었지만 여전히 이것이 개최되는 곳을 설명하지는 않습니다 .Kafka는 이것을 다르게 처리합니다. 우리의 주제는 완전히 정렬 된 파티션으로 나뉘며, 각 파티션은 주어진 시간에 한 소비자가 소비합니다. 즉, 각 파티션에서 소비자의 위치는 단일 정수이며 소비 할 다음 메시지의 오프셋입니다. 이것은 소비 된 것에 대한 상태를 각 파티션 당 하나의 숫자로 매우 작게 만듭니다. 이 상태는 주기적으로 체크 포인트 될 수 있습니다. 이것은 메시지 확인에 상응하는 비용을 매우 저렴하게 만듭니다.
Pinidbest

20

Kafka는 메시지 흐름에 질서를 부여하기 위해 주제 개념을 사용합니다 .

로드 균형을 맞추기 위해 주제를 여러 파티션으로 나누고 브로커간에 복제 할 수 있습니다.

파티션은 순서대로, 불변의 일련의 메시지, 즉 커밋 로그가 계속 추가됩니다.

파티션의 메시지에는 파티션 내의 각 메시지를 고유하게 식별하는 순차 ID 번호가 있습니다.

파티션을 사용하면 토픽의 로그를 단일 서버 (브로커)에 맞는 크기 이상으로 확장하여 병렬 처리 단위로 사용할 수 있습니다.

토픽의 파티션은 각 브로커가 파티션 공유에 대한 데이터 및 요청을 처리하는 Kafka 클러스터의 브로커를 통해 분산됩니다.

각 파티션은 구성 가능한 개수의 브로커에 복제되어 내결함성을 보장합니다.

이 기사에서 잘 설명했습니다 : http://codeflex.co/what-is-apache-kafka/


파티션은 주제로드 밸런스 전용입니까?
g10guang

1
@ g10guang : 파티션은 메시지를 동시에 처리하는 데 도움이됩니다.
mrsrinivas

내가 틀렸다면, 생산자가 메시지를 보내고 주제에 올 때 구성에 따라 파티션에 복사 한 다음 소비자가 소비합니다. 권리?
Atul

1
@Atul 메시지는 현재 Partitioner 구성에 따라 해당 주제의 파티션 중 하나에 메시지가 추가되며 (기본적으로 메시지 키의 해시는 메시지가 어떤 파티션으로 이동하는지 결정), 예, 소비자는 메시지를 다음과 같이 선택합니다. 그것은 그 파티션에서 메시지를 사용
케빈 후크에게

@Kevin Hooke, 설명해 주셔서 감사합니다.
Atul
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.