programing

MongoDB 인스턴스에 대한 클라이언트가 유효한지 어떻게 확인합니까?

powerit 2023. 5. 28. 21:06
반응형

MongoDB 인스턴스에 대한 클라이언트가 유효한지 어떻게 확인합니까?

특히, 저는 현재 다음 기능을 사용하여 클라이언트에 대한 연결이 유효한지 확인하려고 합니다.

def mongodb_connect(client_uri):
    try:
        return pymongo.MongoClient(client_uri)
    except pymongo.errors.ConnectionFailure:
         print "Failed to connect to server {}".format(client_uri)

그런 다음 다음 이 기능을 사용합니다.

def bucket_summary(self):
    client_uri = "some_client_uri"
    client = mongodb_connect(client_uri)
    db = client[tenant_id]
    ttb = db.timebucket.count() # If I use an invalid URI it hangs here

잘못된 URI가 제공될 경우 마지막 줄에서 예외를 포착하고 던질 수 있는 방법이 있습니까?저는 처음에 이것이 연결 실패의 원인이라고 생각했는데(연결할 때 이것이 잡힐 수 있습니다) 제가 잘못 생각했습니다.

잘못된 URI로 프로그램을 실행하면 실행되지 않고 키보드 실행인터럽트 수율:

File "reportjob_status.py", line 58, in <module>
tester.summarize_timebuckets()
File "reportjob_status.py", line 43, in summarize_timebuckets
ttb = db.timebucket.count() #error
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line   1023, in count
return self._count(cmd)
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 985, in _count
with self._socket_for_reads() as (sock_info, slave_ok):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 699, in _socket_for_reads
with self._get_socket(read_preference) as sock_info:
File  "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 663, in _get_socket
server = self._get_topology().select_server(selector)
File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 121, in select_server
address))
File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 106, in select_servers
self._condition.wait(common.MIN_HEARTBEAT_INTERVAL)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 358, in wait
_sleep(delay)

serverSelectionTimeoutMS의 키워드 매개 변수는 드라이버가 서버에 연결을 시도하는 시간을 제어합니다.기본값은 30초입니다.

오류를 즉시 보고하려면 일반적인 연결 시간()과 호환되는 매우 낮은 값으로 설정합니다.연결 시도를 트리거하려면 DB를 쿼리해야 합니다.

>>> maxSevSelDelay = 1 # Assume 1ms maximum server selection delay
>>> client = pymongo.MongoClient("someInvalidURIOrNonExistantHost",
                                 serverSelectionTimeoutMS=maxSevSelDelay)
//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> client.server_info()

이거 올라갑니다.

설정 중임serverSelectionTimeoutMS로.0서버의 대기 시간이 매우 짧은 경우에도 작동할 수 있습니다(예: 로드가 매우 적은 "로컬" 서버의 경우).


그 예외를 포착하고 적절하게 처리하는 것은 당신에게 달려 있습니다.그런 것들:

try:
    client = pymongo.MongoClient("someInvalidURIOrNonExistantHost",
                                     serverSelectionTimeoutMS=maxSevSelDelay)
    client.server_info() # force connection on a request as the
                         # connect=True parameter of MongoClient seems
                         # to be useless here 
except pymongo.errors.ServerSelectionTimeoutError as err:
    # do whatever you need
    print(err)

다음을 표시합니다.

No servers found yet

안녕하세요. 연결이 설정되었는지 확인하기 위해 이 작업을 수행할 수 있습니다.

from pymongo import MongoClient
from pymongo.errors import ConnectionFailure
client = MongoClient()
try:
   # The ismaster command is cheap and does not require auth.
   client.admin.command('ismaster')
except ConnectionFailure:
   print("Server not available")

서버선택시간 초과 MS

예외를 적용하기 전에 서버 선택을 차단할 기간을 정의합니다.기본값은 30,000(밀리초)입니다.클라이언트 수준에서 구성할 수 있어야 합니다.데이터베이스 개체, 컬렉션 개체 수준 또는 개별 쿼리 수준에서 구성할 수 없습니다.

이 기본값은 일반적인 서버 기본 선택을 완료하기에 충분하도록 선택되었습니다.서버가 선택 속도를 향상시키면 이 숫자가 아래로 수정될 수 있습니다.

토폴로지가 유동적일 때 서버 선택에 대한 긴 지연을 허용할 수 있는 사용자는 이 값을 더 높게 설정할 수 있습니다.토폴로지가 유동적일 때 "빠른 실패"를 원하는 사용자는 이 값을 작은 수로 설정할 수 있습니다.

서버 선택0의 시간 초과 MS는 일부 운전자에게 특별한 의미를 가질 수 있습니다. 이 규격에서는 0의 의미를 정의하지 않았지만 모든 운전자가 0의 의미를 문서화해야 합니다.

https://github.com/mongodb/specifications/blob/master/source/server-selection/server-selection.rst#serverselectiontimeoutms

# pymongo 3.5.1
from pymongo import MongoClient
from pymongo.errors import ServerSelectionTimeoutError

client = MongoClient("mongodb://localhost:27000/", serverSelectionTimeoutMS=10, connectTimeoutMS=20000)

try:
    info = client.server_info() # Forces a call.
except ServerSelectionTimeoutError:
    print("server is down.")

# If connection create a new one with serverSelectionTimeoutMS=30000

serverSelectionTimeoutMS제게 적합하지 않습니다(Python 2.7.12, MongoDB 3.6.1, Pymongo 3.6.0).A. Jesse Jiryu Davis는 GitHub 이슈에서 리트머스 테스트로 소켓 수준 연결을 먼저 시도할 것을 제안했습니다.이것은 저에게 도움이 됩니다.

def throw_if_mongodb_is_unavailable(host, port):
    import socket
    sock = None
    try:
        sock = socket.create_connection(
            (host, port),
            timeout=1) # one second
    except socket.error as err:
        raise EnvironmentError(
            "Can't connect to MongoDB at {host}:{port} because: {err}"
            .format(**locals()))
    finally:
        if sock is not None:
            sock.close()

# elsewhere...
HOST = 'localhost'
PORT = 27017
throw_if_mongodb_is_unavailable(HOST, PORT)
import pymongo
conn = pymongo.MongoClient(HOST, PORT)
print(conn.admin.command('ismaster'))
# etc.

이렇게 하면 발견되지 않는 많은 문제가 있지만, 서버가 실행되고 있지 않거나 연결할 수 없는 경우 바로 표시됩니다.

다음 방법으로도 확인할 수 있습니다.

from pymongo import MongoClient
from pymongo.errors import OperationFailure

def check_mongo_connection(client_uri):
    connection = MongoClient(client_uri)

    try:
        connection.database_names()
        print('Data Base Connection Established........')

    except OperationFailure as err:
        print(f"Data Base Connection failed. Error: {err}")

check_mongo_connection(client_uri)

pymongo >= 4.0의 경우 선호되는 방법은ping사용되지 않는 명령 대신 명령:

from pymongo.errors import ConnectionFailure
client = MongoClient()

try:
    client.admin.command('ping')
except ConnectionFailure:
    print("Server not available")

실패를 를 포함합니다.OperationFailure:

except OperationFailure as err:
    print(f"Database error encountered: {err}")

원본: mongo_client.파이의

언급URL : https://stackoverflow.com/questions/30539183/how-do-you-check-if-the-client-for-a-mongodb-instance-is-valid

반응형