일상/IT

카프카 파티셔닝에 대한 중요한 세부 사항

얇은생각 2023. 7. 13. 07:30
반응형

효과적인 Kafka 애플리케이션을 구축하기 위해서는 Kafka 생산자에서 파티셔닝자의 역할을 이해하는 것이 중요합니다.

Apache Kafka는 오늘날 이벤트 스트리밍의 사실상 표준입니다. Kafka의 성공 요인 중 하나는 엄청난 양의 데이터를 처리하고 초당 수백만 개의 레코드를 처리할 수 있다는 점입니다. 이는 프로덕션 환경에서 전례가 없는 일입니다. 이것을 가능하게 하는 Kafka의 디자인 중 하나는 파티션 분할입니다. 

Kafka는 파티션을 사용하여 클러스터의 브로커 간에 데이터 로드를 분산하고 병렬의 단위이기도 합니다. 파티션이 많을수록 처리량이 증가합니다. Kafka는 키-값 쌍과 함께 작동하기 때문에 동일한 파티션에서 동일한 키로 레코드를 가져오는 것이 필수적입니다. 

카프카에 대한 각 거래에 대해 고객 ID를 사용하는 은행 애플리케이션을 생각해 보십시오. 이러한 모든 이벤트를 동일한 파티션에 저장하는 것은 매우 중요합니다. 이렇게 하면 소비자 애플리케이션은 레코드를 도착한 순서대로 처리합니다. 올바른 파티션에 동일한 키 랜드를 가진 레코드를 보장하는 메커니즘은 간단하지만 효과적인 프로세스입니다. 키 모듈의 해시를 파티션 수에 적용합니다. 다음은 이 개념을 실제로 보여주는 그림입니다:

 

분산  SQL Essentials

 

높은 수준에서 CRC32 또는 Murmur2와 같은 해시 함수는 입력을 받아 64비트 숫자와 같은 고정 크기의 출력을 생성합니다. Java, Python 또는 다른 언어로 구현된 경우에도 동일한 입력은 항상 동일한 출력을 생성합니다. 파티션 사용자는 해시 결과를 사용하여 파티션을 일관되게 선택하므로 항상 동일한 레코드 키가 동일한 Kafka 파티션에 매핑됩니다. 이 블로그에서 더 자세히 설명하지는 않겠지만, 몇 가지 해싱 알고리즘을 사용할 수 있다는 것만 알면 충분합니다.

오늘 파티션이 어떻게 작동하는지가 아니라 카프카 생산자 고객의 파티션에 대해 이야기하고 싶습니다. 생산자는 파티션을 사용하여 지정된 키에 대한 올바른 파티션을 결정하므로 생산자 클라이언트에서 동일한 파티션 전략을 사용하는 것이 중요합니다. 

생산자 클라이언트에는 기본 파티셔닝 프로그램 설정이 있으므로 이 요구 사항은 문제가 되지 않습니다. 예를 들어 Apache Kafka 배포와 함께 Java Producer 클라이언트를 사용하는 경우 Kafka Producer 클래스는 Murmur2 해시 함수를 사용하여 지정된 키의 파티션을 결정하는 기본 파티셔닝자를 제공합니다.

하지만 다른 언어로 된 카프카 제작자 고객들은 어떻습니까? 우수한 librdkafka 프로젝트는 Kafka 클라이언트의 C/C++ 구현이며 비 JVM Kafka 애플리케이션에 널리 사용됩니다. 또한 다른 언어(파이썬, C#)의 카프카 클라이언트가 그 위에 구축됩니다. librdkafka의 기본 분할자는 CRC32 해시 함수를 사용하여 키에 대한 올바른 파티션을 가져옵니다. 

이러한 상황 자체는 문제가 되지 않지만 쉽게 발생할 수 있습니다. Kafka 브로커는 고객의 언어에 구애받지 않습니다. Kafka 프로토콜을 따르기만 하면 어떤 언어로도 고객을 사용할 수 있으며 브로커는 고객의 생산 및 소비 요청을 기꺼이 수락합니다. 오늘날의 다중 언어 프로그래밍 환경을 고려할 때 조직 내 개발 팀이 Python Java와 같은 다른 언어로 작업하도록 할 수 있습니다. 그러나 변경 사항이 없으면 두 그룹은 서로 다른 해싱 알고리즘의 형태로 서로 다른 파티션 전략을 사용하게 됩니다. CRC32를 사용하는 librdkafka 제작자와 Murmur2를 사용하는 Java 제작자입니다. 따라서 동일한 키를 가진 레코드는 서로 다른 파티션에 배치됩니다! 그렇다면, 이 상황에 대한 해결책은 무엇일까요? 

Java Kafka Producer는 기본 파티셔닝자를 통해 해싱 알고리즘을 하나만 제공합니다. 파티셔닝자를 구현하는 것은 까다롭기 때문에 기본 상태로 두는 것이 가장 좋습니다. 그러나 librdkafka 생산자 클라이언트는 여러 가지 옵션을 제공합니다. 이러한 옵션 중 하나는 murmur2_random partitioner, murmur2 해시 함수를 사용하고 임의 파티션에 null 키를 할당하며 Java 기본 파티션과 동등한 동작을 수행합니다.

예를 들어 C#에서 Kafka 프로듀서 클라이언트를 사용하는 경우 다음 줄로 파티셔닝 전략을 설정할 수 있습니다:

ProducerConfig.Partitioner = Partitioner.Murmur2Random;

 

 

이제 C# Java 생산자 고객은 호환 가능한 파티셔닝 접근 방식을 사용합니다. Java Kafka 클라이언트가 아닌 클라이언트를 사용하는 경우 Java 생산자 클라이언트와 동일한 파티셔닝 전략을 사용하면 모든 생산자가 서로 다른 키에 대해 일관된 파티션을 사용할 수 있습니다.

반응형