Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / / /

작업 거부 필터로 느린 쿼리 차단

이 페이지의 내용

  • 이 작업에 대하여
  • 시작하기 전에
  • 단계
  • 다음 단계
  • 자세히 알아보기

버전 8.0에 추가 되었습니다.

작업으로 인해 과도한 워크로드 가 발생하지 않도록 하려면 해당 쿼리 형태 와 관련된 모든 작업을 일시적으로 거부할 수 있습니다. 이렇게 하려면 setQuerySettings 를 사용하여 작업의 쿼리 형태 에 대해 reject 필드 를 true 로 설정하다 합니다. 거부된 쿼리 형태 는 작업 거부 필터하다 라고도 합니다.

쿼리 옵티마이저 쿼리 계획 중에 쿼리 설정을 추가 입력으로 사용하며, 이는 쿼리 를 실행 하기 위해 선택한 계획에 영향을 줍니다.

이 페이지의 단계에서는 예시 컬렉션 을 만들고 작업 거부 필터하다 를 사용하여 쿼리 형태 를 차단 합니다.

애플리케이션 에 비효율적인 쿼리 가 있어서 클러스터 에 과도한 워크로드 가 있다고 가정해 보겠습니다. 쿼리 가 클러스터 리소스를 과도하게 사용하지 않도록 하려면 작업 거부 필터하다 를 사용하여 쿼리 및 유사한 쿼리의 실행 을 차단 합니다.

비효율적인 쿼리 를 식별하려면 다음과 같은 다양한 방법을 사용하세요.

  • Atlas 모니터링

  • Atlas alerts

  • Atlas 쿼리 프로파일러

  • 느린 쿼리 로그

1

실행:

// Create pizzaOrders collection
db.pizzaOrders.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 19,
totalNumber: 10, orderDate: ISODate( "2023-03-13T08:14:30Z" ) },
{ _id: 1, type: "pepperoni", size: "medium", price: 20,
totalNumber: 20, orderDate: ISODate( "2023-03-13T09:13:24Z" ) },
{ _id: 2, type: "pepperoni", size: "large", price: 21,
totalNumber: 30, orderDate: ISODate( "2023-03-17T09:22:12Z" ) },
{ _id: 3, type: "cheese", size: "small", price: 12,
totalNumber: 15, orderDate: ISODate( "2023-03-13T11:21:39.736Z" ) },
{ _id: 4, type: "cheese", size: "medium", price: 13,
totalNumber: 50, orderDate: ISODate( "2024-01-12T21:23:13.331Z" ) },
{ _id: 5, type: "cheese", size: "large", price: 14,
totalNumber: 10, orderDate: ISODate( "2024-01-12T05:08:13Z" ) },
{ _id: 6, type: "vegan", size: "small", price: 17,
totalNumber: 10, orderDate: ISODate( "2023-01-13T05:08:13Z" ) },
{ _id: 7, type: "vegan", size: "medium", price: 18,
totalNumber: 10, orderDate: ISODate( "2023-01-13T05:10:13Z" ) }
] )
2

다음 setQuerySettings 명령을 실행하여 이러한 필드가 포함된 작업 거부 필터하다 를 추가합니다.

  • find 필터하다 와 정렬을 사용하여 쿼리 형태 를 정의합니다.

  • $db 를 쿼리 설정에 대한 데이터베이스 와 함께 사용합니다.

  • settings 쿼리 형태 를 거부합니다.

db.adminCommand( {
setQuerySettings: {
find: "pizzaOrders",
filter: {
orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) }
},
sort: {
totalNumber: 1
},
$db: "test"
},
settings: {
reject: true
}
} )

다음 잘린 출력은 queryShapeHash 필드 값과 settings reject 필드 가 true 임을 보여줍니다.

{
queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1',
settings: { reject: true },
representativeQuery: {
find: 'pizzaOrders',
filter: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } },
sort: { totalNumber: 1 },
'$db': 'test'
},
ok: 1,
...
}
3

explain 를 실행합니다.

db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate(
"2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )

다음 잘린 출력은 querySettings reject 필드 가 true 임을 보여줍니다.

{
queryPlanner: {
winningPlan: {
stage: 'SINGLE_SHARD',
shards: [
{
explainVersion: '1',
...
namespace: 'test.pizzaOrders',
parsedQuery: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } },
querySettings: { reject: true },
...
}
]
}
}
4

이 쿼리 를 실행 해 봅니다.

db.pizzaOrders.find( { orderDate: {
$gt: ISODate("2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )

다음 출력은 쿼리 가 거부되었는지 확인합니다.

MongoServerError: Query rejected by admin query settings
5

다음 예시 에서는 removeQuerySettings 를 사용하여 이전 2 단계에 표시된 출력에서 queryShapeHash 값으로 식별되는 작업 거부 필터하다 를 제거 합니다.

db.adminCommand( {
removeQuerySettings: "AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1"
} )

다음에서 queryShapeHash 값을 가져올 수도 있습니다.

쿼리 형태 를 사용하여 작업 거부 필터하다 를 제거 할 수도 있습니다. 예를 예시 다음과 같습니다.

db.adminCommand( {
removeQuerySettings: {
find: "pizzaOrders",
filter: {
orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) }
},
sort: {
totalNumber: 1
},
$db: "test"
}
} )
6

작업 거부 필터하다 가 제거되었으므로 다음 쿼리 가 차단 해제되고 이제 실행됩니다.

db.pizzaOrders.find( { orderDate: {
$gt: ISODate("2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )

작업 거부 필터하다 를 사용하여 비효율적인 작업을 차단 한 후에는 클러스터 성능이 비효율적인 쿼리 가 도입되기 전의 상태로 돌아가야 합니다. 다음 단계:

  1. 쿼리 의 성능 문제를 해결합니다. 이를 위해서는 인덱스 또는 쿼리 재작성이 필요할 수 있습니다.

  2. 업데이트된 애플리케이션 을 배포합니다.

삭제되지 않은 쿼리 설정을 다시 활성화하려면 setQuerySettings 를 설정하다 하고 reject 필드 를 false 로 설정합니다.

돌아가기

출력