2013-05-30 3 views
1

분당 한 번씩 mongodb 인스턴스에서 모니터링 스크립트를 확인하고 연결하고, 간단한 쿼리를 수행하고 10 초 이내에 반환하거나 일부 시간 초과를 허용해야합니다 예측 가능한 방식으로 10 초 이상 걸리고 그 오류/예외를 잡을 수 있습니다.시간 제한을 사용하여 pymongo로 서버 상태 확인하기

pymongo의 설명서에 따르면 쿼리 시간 초과는 설정할 수 없으며 소켓과 연결 시간 제한 (정상적으로 작동하는 것 같습니다) 만 설정할 수 있습니다. 이 문제를 해결할 수있는 방법이 있습니까?

  1. 연결
  2. 이 (통계 사용) 마지막으로 업데이트 된 문서를 확인하는 간단한 find() 쿼리
  3. 연결을 닫습니다을 수행 MongoDB를 위해 :

    프로그램의 흐름이입니다.

# 1은 항상 정상적으로 작동하지만 전체 요청은 # 2에서 시간 초과되어 내 스스로 부과 한 10 초 제한 내에서이를 포착 할 수 없습니다.

잠금은 많은 수의 동시 map-reduce 쿼리 때문에 피크 시간대에 발생하는 것으로 보입니다. 우리는 mongodb 2.4.3을 사용하고 있습니다. 당신이 당신의 mongo_client을 만들 때

+0

인덱스가있는 find() 인 경우, 특히 단일 레코드 만 쿼리하기 때문에 시간 초과보다 빨리 완료해야합니다! –

답변

1

당신은 socketTimeoutMS 사용할 수 있습니다 또는 당신은 당신의 을 찾기에 추가 할 수 있습니다.

예를 들어 다음 코드에서 로컬 mongod에 연결 한 다음 $ where 함수 (권장되지 않음)에서 10 초 수면 시간이 긴 장기 실행을 시뮬레이트합니다. 일초 socketTimeoutMS은 pymongo.errors.AutoReconnect 실패에 대한 호출을 발생합니다 시간 초과 :

from pymongo import MongoClient 
client = MongoClient('localhost', 27017) 
if client.test.ing.count() == 0: 
    client.test.ing.insert({}) 
client.test.ing.find({ '$where' : 'function() { sleep(10000); return True; }' } , socketTimeoutMS=1000).count() 

나는이 도움이되기를 바랍니다.

주 1 : 컬렉션이 비어있는 경우 클라이언트는 주 2

즉시 반환 : 당신은 그냥 커서를 얻고 아무것도하지 않는 경우 다음 오류가 발생하지 않습니다

+1

문제는 소켓이 느리지 않다는 것입니다. 그것은 데이타베이스 자체입니다. 즉, connect, send 쿼리 및 (결국) 수신 쿼리는 소켓에서 빠릅니다. 쿼리를 서버로 보낸 후 오랜 시간이 걸립니다. 'socketTimeoutMS'는 이것을 변경하지 않습니다. pymongo는 커서 타임 아웃을 언급하지만 분명히 파이썬에서는 타임 아웃이 지원되지 않습니다 (PHP와 다른 언어로 보았습니다) –

관련 문제