멀티-스테이지 쿼리

멀티-스테이지 쿼리 (Multi-Stage Query)

멀티-스테이지 엔진(MSE) 내부, 실행 모델, 문제 해결을 깊이 있게 살펴봐요. 대부분의 개념은 엔진의 실행 모델과 관련되어 있어 쿼리를 작성하는 데 반드시 필요하진 않지만, 이해하면 MSE의 기능을 활용하고 문제를 해결하는 데 도움이 돼요.

출처: 문서

본문

멀티-스테이지 엔진(MSE)을 사용할 때와 싱글-스테이지 엔진(SSE)을 사용할 때에 대한 개요는 Query Engines (SSE vs MSE)를 참고해요. 이 섹션은 MSE 내부에 대한 심층 설명을 제공해요. 여기 설명된 개념의 대부분은 엔진의 실행 모델과 관련되어 있어 쿼리를 작성하는 데 반드시 필요하진 않아요. 하지만 이해하면 MSE의 기능을 활용하고 문제를 해결하는 데 도움이 돼요.

Mailbox 채널 keep-alive

Apache Pinot #19383을 포함하는 버전에서 MSE mailbox 데이터 채널은 기본적으로 gRPC keep-alive를 사용해요. 이는 소켓을 닫지 않고 응답을 멈춘 피어(예: 도달할 수 없는 호스트 또는 폐기된 pod 주소)를 감지하는 데 도움이 돼요. 죽은 전송을 버리면 조용히 깨진 캐시된 연결로 반복적으로 쿼리를 보내는 대신 재연결할 수 있어요. 감지 중에는 쿼리가 여전히 실패하거나 타임아웃될 수 있어요. keep-alive는 실패한 쿼리를 재시도하지 않아요.

이러한 시작 설정은 broker와 server의 mailbox 서비스에 적용돼요. 이는 pinot.query.multistage.dispatch.channel.* 아래의 broker dispatch-채널 설정 및 사용자-대면 gRPC 쿼리 서비스와는 별개예요.

Property Default Description
pinot.query.runner.channel.keep.alive.time.ms 300000 클라이언트 핑 간격(밀리초). 양수가 아닌 값은 keep-alive를 비활성화해요. gRPC는 10000 ms 미만의 양수 간격을 10000 ms로 고정해요.
pinot.query.runner.channel.keep.alive.timeout.ms 30000 전송이 죽었다고 선언하기 전에 핑 승인을 기다리는 시간(밀리초). keep-alive가 활성화되면 양수여야 해요.
pinot.query.runner.channel.keep.alive.without.calls false 클라이언트가 활성 RPC 없이 연결을 핑하는지 여부. 모든 수신 피어가 이 핑을 허용한 후에만 활성화해요.
pinot.query.runner.mailbox.server.permit.keep.alive.time.ms 300000 mailbox 서버가 수락하는 최소 핑 간격(밀리초). 양수가 아닌 값은 gRPC 서버 기본값을 유지하며 강제 실행을 비활성화하지 않아요.
pinot.query.runner.mailbox.server.permit.keep.alive.without.calls false mailbox 서버가 활성 RPC 없이 핑을 수락하는지 여부.

기본값에서는 RPC가 활성 상태가 아닐 때 핑이 지연돼요. 따라서 이후의 쿼리가 죽은 연결을 만나 복구 중에 실패할 수 있어요. 호출 없이 핑을 허용하고 활성화하면 쿼리 사이에 감지가 가능해지지만, 쿼리가 새로운 실패를 만나지 않는다는 보장은 없어요.

감지 안전하게 튜닝

혼합-버전 롤아웃 중에는 기본값을 유지해요: 오래된 mailbox 서버는 5분 최소값을 적용하고 호출 없는 핑을 거부해요. 튜닝하기 전에 모든 broker와 server가 이 설정을 지원할 때까지 기다려요. 각 채널에 대해 클라이언트 간격은 수신 서버의 허용 간격 이상이어야 해요.

  1. 먼저 모든 broker와 server에서 수신 허용(permit)을 낮춰요. 예: pinot.query.runner.mailbox.server.permit.keep.alive.time.ms=15000. 유휴 핑을 계획했다면 pinot.query.runner.mailbox.server.permit.keep.alive.without.calls=true도 설정해요. 클라이언트를 변경하기 전에 롤링 재시작을 완료해요. Starting GrpcMailboxServer 시작 로그에서 permitKeepAliveTimeMs와 permitKeepAliveWithoutCalls를 확인해요.
  2. 그런 다음 기본 30000 ms 타임아웃을 유지하면서 pinot.query.runner.channel.keep.alive.time.ms를 낮춰요(예: 30000로). broker와 server를 롤링하고 Initialized MailboxService 로그에서 channel keepAlive[timeMs=30000, timeoutMs=30000, ...]을 확인해요. 간격에 타임아웃을 더하면 핑이 활성일 때 약 60초의 감지 창을 제공해요. 보장된 복구 기한은 아니에요.
  3. 선택적으로 모든 피어가 허용하면 pinot.query.runner.channel.keep.alive.without.calls=true를 설정하고 다시 롤링해요.

서버 허용과 클라이언트 간격 사이에 스케줄링 지터(jitter)를 위한 여유를 두어요. 너무 짧은 타임아웃은 긴 가비지 컬렉션 일시정지를 실패한 피어로 오인해 정상적으로 실행 중인 쿼리를 종료할 수 있어요. 타임아웃을 줄이기보다 간격을 먼저 낮추는 것을 선호해요.

too_many_pings 또는 GOAWAY(ENHANCE_YOUR_CALM)는 거부된 핑을 나타내요: 모든 피어의 허용 간격과 유휴-핑 정책을 확인하고 호환되는 클라이언트 설정을 복원해요. 정상 피어에 대한 UNAVAILABLE: Keepalive failed는 지나치게 짧은 타임아웃을 나타낼 수 있어요.

더 알아보기 (Learn more)