Uber의 기술 블로그에는 더 적은 수의 Kafka 브로커와 더 적은 메모리로 데이터 보존을 극대화하는 것을 목표로 하는 Uber의 Kafka 계층형 스토리지 소개라는 기사가 게시되었습니다. 이를 통해 다양한 비즈니스 애플리케이션에서 메시지 보존 시간이 길어집니다.
일반적인 솔루션은 외부 스토리지를 수동으로 통합하여 주기적으로 데이터를 외부 시스템과 동기화하는 것입니다. 그러나 여기에는 데이터 저장 방법 결정, 동기화 빈도 설정, 프로세스 트리거, 데이터 가져오기, 인덱싱 사용 등 상당한 개발 및 유지 관리 노력이 필요합니다.
그래서 Uber는 외부 저장소의 로직을 캡슐화하여 간단한 구성으로 플러그 앤 플레이가 가능한 솔루션을 제안했습니다. 이 기능은 Apache Foundation과 협력하여 개발 중이며 향후 버전에서 제공될 예정입니다.
Kafka는 처리량이 매우 높은 추가 전용 메시지 대기열(MQ) 구성 요소라는 점을 이해하는 것이 중요합니다. Kafka는 브로커의 로컬 저장소에 로그를 저장하며, 사용자는 보존 시간이나 로그 크기를 구성할 수 있습니다. 이전 회사(Lenovo)에서는 Flink를 사용하여 지속적으로 데이터를 소비했습니다. 데이터 양이 많으면 Kafka가 디스크 저장 용량 한도를 초과하여 데이터 쓰기 실패 및 비즈니스 오류가 발생할 수 있습니다. 비용을 절감하기 위해 더 많은 시스템을 배포하는 대신 보존 시간만 조정할 수 있었습니다.
게다가 각 회사가 오래된 데이터를 외부 저장소에 저장하는 자체 시스템을 개발한다면 막대한 양의 개발 작업이 필요하게 됩니다. 또한 동기화 및 데이터 일관성과 관련된 많은 문제가 있을 것입니다.
핵심은 원격 로그 관리와 스토리지 관리를 추가해 브로커를 혁신하는 것입니다.
RemoteLogManager: 복사, 정리, 가져오기를 포함하여 원격 로그 세그먼트의 수명 주기를 관리합니다.
RemoteStorageManager: 복사, 가져오기, 삭제 등 원격 로그 세그먼트에 대한 작업을 관리합니다. 원격 로그 세그먼트와 관련된 메타데이터에는 세그먼트의 시작 및 끝 오프셋, 타임스탬프, 생산자 상태 스냅샷, 리더 에포크 체크포인트에 대한 정보가 포함됩니다.
RemoteLogMetadataManager는 이 메타데이터를 추적하여 시스템이 각 세그먼트의 시작 및 끝 위치와 데이터 검색 및 관리에 필요한 기타 중요한 정보를 알 수 있도록 합니다.
RemoteLogMetadataManager: 강력한 일관성을 통해 원격 로그 세그먼트의 메타데이터 수명 주기를 관리합니다.
이 중 RemoteLogManager는 제어 구성 요소 역할을 하며 브로커의 디스크에 직접 연결하여 읽은 데이터를 가져옵니다. 또한 원격 데이터를 다시 호출하는 역할도 담당합니다. RemoteStorageManager는 데이터를 처리하는 개체이고 RemoteLogMetadataManager는 메타데이터 관리를 담당합니다.
Kafka 계층형 스토리지의 세 가지 작업 요약
원격 저장소에 세그먼트 복사
로그 세그먼트의 끝 오프셋(세그먼트의 마지막 메시지 오프셋)이 파티션의 last-stable-offset보다 작은 경우 로그 세그먼트는 원격 저장소에 복사하기에 적합한 것으로 간주됩니다. (LSO(Last-Stable-Offset): 가장 높은 오프셋 모든 이전 메시지는 모든 동기화 복제본에서 완전히 승인되어 데이터 손실이 발생하지 않습니다.) RemoteStorageManager는 관련 인덱스, 타임스탬프, 생산자 스냅샷 및 리더 에포크 캐시와 함께 로그 세그먼트 복사를 처리합니다.
원격 세그먼트 정리
원격 데이터는 전용 스레드 풀로 적합한 세그먼트를 계산하여 정기적으로 정리됩니다. 이는 로컬 로그 세그먼트의 비동기 정리와 다릅니다. 주제가 삭제되면 원격 로그 세그먼트 정리가 비동기식으로 수행되며 기존 삭제 작업을 차단하거나 새 주제를 다시 생성하지 않습니다.
원격 저장소에서 세그먼트 가져오기
RemoteLogManager는 RemoteLogMetadataManager를 사용하여 메타데이터 저장소를 조사하여 원하는 오프셋과 리더 시대를 기반으로 대상 원격 세그먼트를 결정합니다. RemoteStorageManager를 사용하여 세그먼트 내의 위치를 찾고 원하는 데이터 가져오기를 시작합니다.
위 내용은 Kafka의 계층형 스토리지 - Ubers 기술 블로그 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!