중화사전망 - 구한말 사전 - Kafka의 기본 원리와 작업 흐름에 대한 간략한 소개
Kafka의 기본 원리와 작업 흐름에 대한 간략한 소개
Kafka 작업흐름
기본 요약:
1) 브로커: 브로커는 kafka의 노드를 나타냅니다. 브로커는 분산 배포되며 서로 독립적입니다. 시작할 때 Zookeeper에는 브로커 서버 목록을 기록하기 위한 노드(/brokers/ids)가 있습니다. 각 브로커가 시작되면 Zookeeper에 등록됩니다. 즉, /brokers/ids/[0...N]과 같은 /brokers/ids 아래에 자체 노드를 생성합니다. Kafka는 전역적으로 고유한 번호를 사용하여 각 브로커 서버를 참조합니다. 노드가 생성된 후 각 브로커는 해당 노드에 IP 주소와 포트 정보를 기록합니다. 그 중 브로커가 생성한 노드 유형은 임시 노드이며, 브로커가 다운되면 해당 임시 노드도 자동으로 삭제됩니다.
2) 주제: 메시지 주제 Kafka에서는 동일한 주제의 메시지가 여러 파티션으로 나누어져 여러 브로커에 분산됩니다. 이러한 파티션 정보와 브로커와의 해당 관계도 Zookeeper에 의해 유지되고, /brokers/topics와 같은 특수 노드에 의해 기록됩니다. Kafka의 각 주제는 /brokers/topics/login 및 /brokers/topics/search 등과 같이 /brokers/topics/[topic] 형식으로 기록됩니다. 브로커 서버가 시작된 후 해당 토픽 노드(/brokers/topics)에 브로커 ID를 등록하고 /brokers/topics/login/3-gt와 같이 토픽에 대한 총 파티션 수를 기록합니다. 이 노드는 브로커를 나타냅니다. ID 3의 브로커 서버는 "로그인" 주제에 대한 메시지 저장을 위해 2개의 파티션을 제공합니다. 마찬가지로 이 파티션 노드도 임시 노드입니다.
3) 파티션: 그림과 같이 동일한 주제 유형 메시지의 파티션입니다. 각 파티션에는 리더와 N개의 팔로워(복제본)가 있습니다. 주제를 생성할 때 복제본 수를 지정할 수 있습니다. 메시지 생산자에 의한 메시지 생성과 소비자 그룹에 의한 메시지 소비는 모두 리더를 통해 완료됩니다. 복제본의 존재는 노드 가동 중지를 방지하여 리더가 언제든지 리더가 되어 계속될 수 있습니다. 생산을 재개합니다. 여기서 핵심은 리더가 위치한 노드가 다운되면 팔로워가 리더가 된다는 점입니다. 따라서 동일한 주제의 동일한 파티션의 리더와 팔로어는 동일한 브로커에 있을 수 없습니다. 이 브로커에서 특정 주제의 특정 주제가 달성되면 파티션의 리더가 실패하면 다른 일반 노드에서 이 주제에 대한 이 파티션의 팔로어가 나타납니다.
4) 생산자가 보낸 메시지의 로드 밸런싱: 동일한 Topic 메시지가 여러 브로커에 분할되어 배포되므로 생산자는 분산된 브로커에 메시지를 합리적으로 보내야 합니다. 로드를 달성하는 방법 Kafka는 전통적인 4계층 로드 밸런싱을 지원하며 로드 밸런싱을 달성하기 위한 Zookeeper 방법도 지원합니다. (4.1) 4계층 로드 밸런싱은 생산자의 IP 주소 및 포트를 기반으로 연결된 브로커를 결정합니다.
일반적으로 생산자는 단일 브로커에만 해당하며 생산자가 생성한 메시지는 브로커로 전송됩니다. 이 방법의 논리는 간단합니다. 각 생산자는 다른 시스템과 추가 TCP 연결을 설정할 필요가 없으며 브로커와 단일 TCP 연결만 유지하면 됩니다. 그러나 실제 시스템에서 각 생산자가 생성하는 메시지의 양과 각 브로커의 메시지 저장량이 다르기 때문에 진정한 로드 밸런싱을 달성할 수 없습니다. 다양한 브로커가 수신하는 메시지는 매우 다양합니다. 동시에 생산자는 브로커의 추가 및 삭제를 실시간으로 인식할 수 없습니다. (4.2) 로드 밸런싱을 위해 Zookeeper를 사용합니다. 각 브로커는 시작 시 브로커 등록 프로세스를 완료하므로 생산자는 노드 변경을 통해 브로커 서버 목록의 변경 사항을 동적으로 인식하므로 동적 로드 밸런싱 메커니즘을 구현할 수 있습니다. .
5) 소비자 로드 밸런싱: 생산자와 마찬가지로 Kafka의 소비자도 여러 소비자가 해당 브로커 서버에서 메시지를 합리적으로 수신할 수 있도록 로드 밸런싱이 필요합니다. 그룹에는 여러 소비자가 포함되며 각 메시지는 다음과 같습니다. 서로 다른 소비자 그룹은 서로 간섭하지 않고 고유한 특정 주제에 따라 메시지를 소비합니다.
6) 파티션과 소비자의 관계: 소비자 그룹 소비자 그룹 아래에는 여러 소비자가 있습니다. 각 소비자 그룹(소비자 그룹)에 대해 Kafka는 전역적으로 고유한 그룹 ID를 할당하고 그룹 내의 모든 소비자는 이 ID를 공유합니다. 구독된 주제 아래의 각 파티션은 특정 그룹 아래의 한 소비자에게만 할당될 수 있습니다(물론 파티션은 다른 그룹에도 할당될 수 있습니다). 동시에 Kafka는 일반적으로 "호스트 이름: UUID" 형식으로 표현되는 소비자 ID를 각 소비자에게 할당합니다. Kafka에서는 각 메시지 파티션은 동일한 그룹의 한 소비자만 소비할 수 있도록 규정되어 있으므로 각 소비자가 메시지 파티션의 필요성을 결정하면 메시지 파티션과 소비자 간의 관계를 기록해야 합니다. 전력을 소비하려면 Zookeeper의 메시지 파티션에 해당하는 임시 노드에 소비자 ID를 작성해야 합니다. 예: /consumers/[group_id]/owners/[topic]/[broker_id-partition_id] 그 중에서 [broker_id]? -partition_id]는 메시지 파티션의 식별자입니다. 노드 콘텐츠는 메시지 파티션에 있는 소비자의 소비자 ID입니다.
7) 메시지 소비 진행 오프셋 기록: 소비자가 지정된 메시지 파티션에 대한 메시지를 소비하는 과정에서 소비자가 이후에 사용할 수 있도록 파티션 메시지의 소비 진행 오프셋을 Zookeeper에 정기적으로 기록해야 합니다. 다시 시작하거나 다른 소비자가 메시지 파티션의 메시지 소비를 인계받는 경우 메시지 소비는 이전 진행에서 계속될 수 있습니다. Offset은 Zookeeper의 특수 노드에 의해 기록되며 해당 노드 경로는 /consumers/[group_id]/offsets/[topic]/[broker_id-partition_id]입니다. 노드 내용은 Offset 값입니다. 이는 Kafka 0.9 및 이전 버전에서 오프셋이 기록되는 방식입니다. 물론 여기서 로컬은 메모리가 아닌 디스크를 의미합니다. . .
8) 소비자 등록: 각 소비자 서버가 시작되면 Zookeeper의 지정된 노드 아래에 /consumers/[group_id]/ids/[consumer_id] 와 같은 자체 소비자 노드를 생성합니다. 노드가 생성되면 소비자는 구독한 주제 정보를 임시 노드에 기록합니다. 소비자 그룹의 소비자 변경 사항을 등록하고 수신합니다. 각 소비자는 자신이 속한 소비자 그룹의 다른 소비자 서버의 변경 사항에 주의를 기울여야 합니다. 즉, Watcher는 새 노드가 생성되면 /consumers/[group_id]/ids 노드에 등록된 하위 노드의 변경 사항을 모니터링합니다. 또는 감소된 소비자가 발견되면 소비자 로드 밸런싱이 트리거됩니다. 브로커 서버에 등록하고 변경 사항을 수신합니다. 소비자는 /broker/ids/[0-N]에서 노드를 모니터링해야 합니다. 브로커 서버 목록이 변경된 것으로 확인되면 특정 상황에 따라 소비자 로드 밸런싱이 필요한지 여부가 결정됩니다. 소비자 로드 밸런싱을 수행합니다. 동일한 Topic의 서로 다른 파티션에 있는 메시지를 여러 소비자가 최대한 균등하게 사용할 수 있도록 소비자 및 메시지 파티션을 할당하는 프로세스는 일반적으로 그룹 내 소비자 서버가 변경되거나 변경되는 경우 수행됩니다. 브로커 서버 변경 사항이 발생하면 소비자 로드 밸런싱이 실행됩니다.