멀티-스테이지 쿼리
멀티-스테이지 쿼리 (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가 이 설정을 지원할 때까지 기다려요. 각 채널에 대해 클라이언트 간격은 수신 서버의 허용 간격 이상이어야 해요.
- 먼저 모든 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를 확인해요. - 그런 다음 기본 30000 ms 타임아웃을 유지하면서
pinot.query.runner.channel.keep.alive.time.ms를 낮춰요(예:30000로). broker와 server를 롤링하고Initialized MailboxService로그에서channel keepAlive[timeMs=30000, timeoutMs=30000, ...]을 확인해요. 간격에 타임아웃을 더하면 핑이 활성일 때 약 60초의 감지 창을 제공해요. 보장된 복구 기한은 아니에요. - 선택적으로 모든 피어가 허용하면
pinot.query.runner.channel.keep.alive.without.calls=true를 설정하고 다시 롤링해요.
서버 허용과 클라이언트 간격 사이에 스케줄링 지터(jitter)를 위한 여유를 두어요. 너무 짧은 타임아웃은 긴 가비지 컬렉션 일시정지를 실패한 피어로 오인해 정상적으로 실행 중인 쿼리를 종료할 수 있어요. 타임아웃을 줄이기보다 간격을 먼저 낮추는 것을 선호해요.
too_many_pings 또는 GOAWAY(ENHANCE_YOUR_CALM)는 거부된 핑을 나타내요: 모든 피어의 허용 간격과 유휴-핑 정책을 확인하고 호환되는 클라이언트 설정을 복원해요. 정상 피어에 대한 UNAVAILABLE: Keepalive failed는 지나치게 짧은 타임아웃을 나타낼 수 있어요.