데이터 경로에서 컨트롤러 분리
데이터 경로에서 컨트롤러 분리 (Decoupling Controller from the Data Path)
실시간 Pinot 테이블의 데이터 경로에서 컨트롤러를 분리해요.
출처: 문서
본문
Pinot 컨트롤러의 적재 병목 (Ingestion bottleneck on the Pinot Controller)
실시간 테이블의 경우, Pinot 서버가 세그먼트 소비를 끝내면 세그먼트는 완료 프로토콜(completion protocol) 시퀀스를 거쳐요. 기본적으로 세그먼트는 리드(lead) Pinot 컨트롤러로 업로드되고, 컨트롤러는 이를 딥 스토어(예: NFS, S3, HDFS)에 영속화해요. 그 결과 모든 실시간 세그먼트가 컨트롤러를 통과하기 때문에 컨트롤러가 병목이 되어 전체 적재 속도를 늦출 수 있어요. 이 제약을 극복하기 위해 컨트롤러를 우회하고 완료된 세그먼트를 딥 스토어에 직접 업로드하는 새 스트림 수준 구성이 추가됐어요.
완료된 세그먼트를 딥 스토어에 직접 업로드
Pinot은 이제 실시간 세그먼트 완료 중 딥 스토어 직접 업로드를 위한 서버 수준 기본값과 테이블 수준 오버라이드를 모두 지원해요.
server.conf에서 서버 수준 기본값을 설정하세요:
pinot.server.instance.segment.upload.to.deep.store=true
특정 실시간 테이블에만 활성화하거나 서버 기본값을 오버라이드하려면 다음 스트림 수준 구성을 추가하세요:
realtime.segment.serverUploadToDeepStore = true
딥 스토어 직접 업로드가 활성화되면 Pinot 서버는 완료된 세그먼트를 컨트롤러를 우회해 세그먼트 스토어에 직접 업로드하려고 시도해요. 완료되면 Pinot은 해당 세그먼트 메타데이터로 컨트롤러를 갱신해요.
테이블 구성에 realtime.segment.serverUploadToDeepStore가 있으면 서버 수준 기본값을 오버라이드해요. 테이블 구성에 이 속성이 없으면 Pinot은 pinot.server.instance.segment.upload.to.deep.store로 폴백해요.
참고:
pinot.server.instance.segment.store.uri는 기본적으로 선택 사항이에요. 하지만 서버가 딥 스토어 위치를 알려면 이 구성이 필요해요. 테이블에서realtime.segment.serverUploadToDeepStore를 활성화하기 전에 서버에pinot.server.instance.segment.store.uri=<controller.data.dir>이 구성됐는지 확인하세요.
피어 다운로드 정책 개요 (Overview of peer download policy)
피어 다운로드 정책은 완료된 세그먼트를 딥 스토어에 업로드하는 데 실패할 경우 장애 복구를 가능하게 해요. 세그먼트 스토어를 사용할 수 없으면 해당 세그먼트를 Pinot 서버에서 직접 다운로드할 수 있어요.
세그먼트에 피어 다운로드 활성화 (Enable peer download for segments)
이 방식은 Low Level Consumer(LLC) 모드를 사용하는 실시간 테이블에서만 동작해요. 세그먼트에 피어 다운로드를 활성화하려면 컨트롤러, 서버, 테이블 구성을 다음과 같이 갱신하세요:
서버 구성 (Server Config)
서버 구성에 다음을 추가하세요:
pinot.server.instance.segment.store.uri=<URI of segment store>
pinot.server.instance.enable.split.commit=true
pinot.server.storage.factory.class.(scheme)=<the corresponding Pinot FS impl>
여기서 세그먼트 스토어의 URI는 해당 데이터 디렉토리의 전체 경로를 가리켜야 해요. 파일시스템 스킴과 경로를 모두 포함해야 해요(예: file://dir, hdfs://path, s3://path).
*pinot.server.storage.factory.class.(scheme)*를 위에 구성된 세그먼트 스토어 URI의 해당 스킴(예: hdfs, s3 또는 gcs)으로 바꾸세요. 그런 다음 구성 값으로 그 스킴의 PinotFS 서브클래스를 추가하세요.
테이블 구성 (Table config)
실시간 segments config에 다음을 추가하세요:
"segmentsConfig": {
...
"peerSegmentDownloadScheme": "http"
}
이 경우 peerSegmentDownloadScheme은 http 또는 https가 될 수 있어요.
장애 사례 처리를 위한 구성 (Config for failure case handling)
피어 다운로드를 활성화하면 일부 장애 사례에서 LLC 세그먼트가 세그먼트 스토어에 업로드되지 못할 수 있어요(예: 세그먼트 완료 중 세그먼트 스토어를 사용할 수 없음). 컨트롤러 주기적 작업이 비동기로 업로드를 재시도하도록 다음 컨트롤러 구성을 추가하세요.
controller.realtime.segment.deepStoreUploadRetryEnabled=true