쿼리 할당량
쿼리 할당량 (Query Quotas)
Pinot에서 테이블, 데이터베이스, 애플리케이션 쿼리 할당량을 다뤄요.
출처: 문서
본문
쿼리 할당량은 Pinot가 수용할 트래픽의 양을 제한해요. 일회성 쿼리 조정 대신 예측 가능한 격리를 원할 때 적합한 도구예요.
할당량 수준 (Quota levels)
- 테이블 할당량은 특정 테이블을 보호함
- 데이터베이스 할당량은 데이터베이스의 모든 테이블에 걸친 트래픽을 제한함
- 애플리케이션 할당량은 애플리케이션 이름별로 트래픽을 제한함
테이블 할당량 (Table quotas)
테이블 할당량은 테이블 구성에 있습니다.
{
"tableName": "stores",
"tableType": "OFFLINE",
"quota": {
"maxQueriesPerSecond": 300
}
}
테이블이 여러 브로커에서 서비스되면 유효 할당량은 그 브로커들에 걸쳐 분할돼요.
데이터베이스 할당량 (Database quotas)
데이터베이스 할당량은 데이터베이스의 모든 테이블에 하나의 제한을 적용하고 싶을 때 유용해요.
curl -X POST 'http://localhost:9000/cluster/configs' \
-H 'Content-Type: application/json' \
-d '{
"databaseMaxQueriesPerSecond": "1000"
}'
curl -X POST 'http://localhost:9000/databases/myDatabase/quotas?maxQueriesPerSecond=1200'
애플리케이션 할당량 (Application quotas)
애플리케이션 할당량은 서로 다른 클라이언트 시스템의 트래픽을 격리하는 가장 깔끔한 방법이에요.
curl -X POST 'http://localhost:9000/cluster/configs' \
-H 'Content-Type: application/json' \
-d '{
"applicationMaxQueriesPerSecond": "1000"
}'
쿼리에서 할당량을 특정 워크로드에 적용하고 싶을 때 SET applicationName = 'myApp';을 사용하세요.
여러 할당량이 있을 때 기대할 것 (What to expect when multiple quotas exist)
Pinot는 가장 구체적인 적용 가능한 가드레일을 강제해요.
- 애플리케이션 할당량
- 데이터베이스 할당량
- 테이블 할당량
둘 이상의 제한이 적용되면 하나의 제한이 초과되는 즉시 쿼리가 실패해요.
이 페이지가 다룬 내용
이 페이지는 세 가지 할당량 계층, 각각의 구성 방법, 둘 이상의 제한이 있을 때의 강제 순서를 다뤘어요.
다음 단계
속도를 제한하는 대신 쿼리를 중지해야 한다면 Query cancellation을 읽어 보세요.
관련 페이지
자세한 내용: 쿼리 할당량 설정
Pinot는 쿼리 한도를 제한하는 방법을 제공해요. 아래는 Pinot에서 쿼리 할당량을 설정하는 가능한 방법이에요.
테이블 수준 쿼리 할당량
테이블에 쿼리 할당량을 부과해 테이블에 대한 쿼리를 제한할 수 있어요.
구성 방법
테이블 수준 쿼리 할당량은 테이블 구성 자체에 설정돼요.
{
"tableName": "pinotTable",
"tableType": "OFFLINE",
"quota": {
"maxQueriesPerSecond": 300
},
...
}
maxQueriesPerSecond는 양수이고 유한한 숫자여야 해요. Pinot는 0, 음수 값, NaN, 양수 또는 음수 무한대를 거부해요. 테이블 쿼리 할당량을 무제한으로 두려면 quota 구성에서 maxQueriesPerSecond를 생략하세요.
적용 방식
테이블의 들어오는 쿼리에 쿼리 할당량이 적용되는 방식에 영향을 주는 몇 가지 요인이 있어요.
| 요인 | 설명 |
|---|---|
| 브로커 수 | 제공된 쿼리 할당량이 테이블을 서비스하는 모든 활성 브로커들에게 분산돼요. 즉 테이블을 서비스하는 브로커가 5개이고 쿼리 할당량이 300이면 각 브로커는 60 qps 할당량을 받고 이를 초과하는 쿼리는 실패해요. |
| 테이블 유형 | 하이브리드 테이블(OFFLINE과 REALTIME 양쪽이 있는 테이블)의 경우 사용자가 각각의 테이블 구성에 각각 할당량을 제공할 수 있어요. 하지만 유형 없이 테이블 이름으로 쿼리하면 그 쿼리는 두 테이블의 할당량 한도에 모두 기여해요. 어느 한쪽 할당량에 도달하면 쿼리는 실패해요. |
| Multi stage query | multi stage 쿼리는 여러 테이블에 걸쳐 있을 수 있으므로 쿼리되는 모든 테이블의 할당량 한도에 기여해요. 어느 테이블의 할당량 한도를 초과하면 쿼리는 실패해요. |
데이터베이스 수준 쿼리 할당량
데이터베이스 아래의 모든 테이블에 걸친 쿼리를 제한할 수 있어요. 이 할당량은 각 데이터베이스의 쿼리 트래픽을 격리하고 제한하는 데 유용해요.
구성 방법
데이터베이스 수준 쿼리 할당량을 구성하는 방법은 2가지예요.
- 기본 할당량: 클러스터의 모든 데이터베이스에 대한 기본 할당량을 설정. 모든 데이터베이스에 비슷한 할당량을 원할 때 각 데이터베이스에 할당량을 지정하는 유지보수 오버헤드를 피하는 데 도움이 돼요.
- 데이터베이스 특정 할당량: 특정 데이터베이스에 특정 할당량을 적용. 존재하면 기본 할당량을 덮어써요.
기본 할당량을 제공하려면 아래 클러스터 구성을 제공해야 해요.
curl -X POST \
'http://localhost:9000/cluster/configs' \
-d '{
"databaseMaxQueriesPerSecond" : "1000"
}'
데이터베이스 특정 할당량은 controller 엔드포인트를 활용할 수 있어요.
# to set database specific quota
curl -X POST 'http://localhost:9000/databases/{databaseName}/quotas?maxQueriesPerSecond=1200'
# to get the effective quota on a database
curl -X GET 'http://localhost:9000/databases/{databaseName}/quotas'
적용 방식
데이터베이스 쿼리 할당량이 적용되는 방식에 영향을 주는 요인이 몇 가지 있어요.
| 요인 | 설명 |
|---|---|
| 브로커 수 | 제공된 쿼리 할당량이 모든 활성 브로커에 분산돼요. 즉 전체 온라인 브로커가 5개이고 데이터베이스 쿼리 할당량이 300이면 각 브로커는 60 qps를 받고 이를 초과하면 실패해요. |
| 테이블 | 특정 데이터베이스 아래의 테이블이 조회될 때 데이터베이스 쿼리 할당량이 구성되어 있으면 그 데이터베이스에 대해 rate limiter가 증가해요. |
| Multi stage query | multi stage 쿼리는 데이터베이스의 여러 테이블에 걸쳐 있을 수 있으므로(교차 데이터베이스 쿼리는 허용되지 않음), 테이블이 속한 데이터베이스의 데이터베이스 쿼리 할당량에만 기여해요. |
애플리케이션 수준 쿼리 할당량
때로는 테이블이나 데이터베이스와 무관하게 Apache Pinot에서 쿼리를 실행하는 서로 다른 시스템이 일으키는 부하를 제한하는 것이 유용할 때가 있어요.
애플리케이션 할당량은 일치하는 applicationName 옵션으로 발행되는 초당 쿼리 수를 제한할 수 있게 해요. 예:
set applicationName='test';
select * from tables
쿼리의 애플리케이션 이름이 비어 있지 않지만 구성된 어느 것과도 일치하지 않으면 전역 기본값이 적용돼요. 기본적으로 전역 기본값이나 애플리케이션 할당량 모두 설정되어 있지 않아요.
기본(전역) 애플리케이션 할당량은 REST API로 설정할 수 있어요.
curl -X POST \
'http://localhost:9000/cluster/configs' \
-d '{
"applicationMaxQueriesPerSecond" : "1000"
}'
애플리케이션 특정 할당량은 다음으로 확인할 수 있어요.
# 전체 유효 애플리케이션 할당량 확인
curl -X GET 'http://localhost:9000/applicationQuotas'
# 애플리케이션 할당량 확인
curl -X POST 'http://localhost:9000/applicationQuotas/{applicationName}'
# 애플리케이션 할당량 설정
curl -X POST 'http://localhost:9000/applicationQuotas/{applicationName}?maxQueriesPerSecond=1200'
애플리케이션 할당량을 비활성화하려면 빈 파라미터 값으로 POST 요청을 사용하세요.
매핑은 controller의 Zookeeper 브라우저의 /PROPERTYSTORE/CONFIGS/CLUSTER/applicationQuotas 경로에서 확인할 수 있어요.
데이터베이스 QPS 할당량과 비슷하게 애플리케이션 값은 모든 온라인 브로커에 분할되므로, 예를 들어 'test' 애플리케이션의 전체 할당량이 300이고 브로커가 3개이면 각각 100 QPS가 할당돼요.
이 기능은 버전 1.3.0에서 추가되었어요.
여러 쿼리 할당량이 구성되면 어떻게 되나요?
사용자가 테이블, 데이터베이스, 애플리케이션 수준에서 쿼리 할당량을 설정하면:
- 먼저 애플리케이션 이름 옵션을 추출해 비어 있지 않으면 애플리케이션 할당량과 비교함. 애플리케이션 쿼리 수가 정의된 할당량보다 높으면 처리가 중지되고 오류가 반환되며, 그렇지 않으면 다음 단계로 진행함.
- 쿼리를 데이터베이스 쿼리 할당량으로 검증함. 위반이 있으면 테이블 수준 할당량으로 가지 않고 즉시 쿼리가 실패함.
- 데이터베이스 쿼리 할당량이 충족되면 쿼리를 테이블 쿼리 할당량으로 검증함. 검증에 따라 쿼리가 허용되거나 실패함.
- 테이블에 테이블 수준 쿼리 할당량이 있더라도 데이터베이스 쿼리 할당량 한도에 도달하면 쿼리는 실패한다는 점에 유의하세요.