programing

PyMongo 3이 Server Selection을 제공하는 이유TimeoutError?

subpage 2023. 3. 5. 09:48
반응형

PyMongo 3이 Server Selection을 제공하는 이유TimeoutError?

사용하고 있는 것:

  • 파이썬 3.4.2
  • PyMongo 3.0.2
  • mongod 2.6.9를 실행하는 mongolab
  • uWSGI 2.0.10
  • 체리파이 3.7.0
  • nginx 1.6.2

uWSGI 시작 매개 변수:

--socket 127.0.0.1:8081 --daemonize --enable-threads --threads 2 --processes 2

MongoClient를 한 번 셋업했습니다.

self.mongo_client = MongoClient('mongodb://user:pw@host.mongolab.com:port/mydb')
self.db = self.mongo_client['mydb']

JSON 딕트를 MongoDB에 저장하려고 합니다.

result = self.db.jobs.insert_one(job_dict)

mongodb에 대한 동일한 코드 경로를 실행하는 장치 테스트를 통해 작동합니다.그러나 HTTP POST를 사용하여 CherryPy와 uWSGI를 통해 실행하면 다음과 같은 메시지가 나타납니다.

pymongo.errors.ServerSelectionTimeoutError: No servers found yet

CherryPy 및 uWSGI를 통해 실행하면 이 동작이 나타나는 이유는 무엇입니까?이게 PyMongo 3의 새로운 스레드 모델인가요?

업데이트:

실행하면 CherryPy는 uWSGI nginx를 합니다.insert_one()

업데이트 1/25 오후 4:53 (EST):

한 후 PyMongo가 PyMongo로 됩니다.topology._update_servers()server_type = 2개의 서버 타입입니다., <고객명>님server_description.known_servers()server _ type server ' .mongolab.com ' myserver.mongolab.com_ server _ type = 0 이 has has has 。

이를 통해 다음 스택트레이스가 생성됩니다.

result = self.db.jobs.insert_one(job_dict)
File "/usr/local/lib/python3.4/site-packages/pymongo/collection.py", line 466, in insert_one
with self._socket_for_writes() as sock_info:
File "/usr/local/lib/python3.4/contextlib.py", line 59, in __enter__
return next(self.gen)
File "/usr/local/lib/python3.4/site-packages/pymongo/mongo_client.py", line 663, in _get_socket
server = self._get_topology().select_server(selector)
File "/usr/local/lib/python3.4/site-packages/pymongo/topology.py", line 121, in select_server
address))
File "/usr/local/lib/python3.4/site-packages/pymongo/topology.py", line 97, in select_servers
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: No servers found yet

PYTON-961에서 추적된 이 문제를 조사 중입니다.MongoClient 인스턴스를 생성할 때 connect=False전달하면 이 문제를 해결할 수 있습니다.그러면 첫 번째 데이터베이스 조작이 시도될 때까지 백그라운드 접속이 지연되므로 MongoClient 모니터 스레드 스핀업과 멀티프로세스 포킹 간의 경합이 발생할 것으로 생각되지 않습니다.

여기에 기재된 바와 같이 https://stackoverflow.com/a/54314615/8953378

는 ㅇㅇㅇㅇㅇㅇㅇㅇ다를 넣었습니다.?ssl=true&ssl_cert_reqs=CERT_NONE연결 문자열로 연결하면 문제가 해결됩니다.

따라서 다음과 같은 경우:

connection_string = "mongodb+srv://<USER>:<PASSWORD>@<CLUSTER>/<COLLECTION>"

나는 다음과 같이 썼다.

connection_string = "mongodb+srv://<USER>:<PASSWORD>@<CLUSTER>/<COLLECTION>?ssl=true&ssl_cert_reqs=CERT_NONE"

문자열에 (「」 「」 「」)를 것에 해 주세요.?로로 합니다.&)

AWS Cloud 서비스와 짝을 이룬 MongoDB를 사용하고 계신지 잘 모르겠습니다.그러나 만약 그렇다면, MongoDB에 접근할 IP 주소를 지정해야 한다는 것을 알게 되었습니다.

따라서 호스트 서버의 IP 주소를 추가하여 진입을 허용해야 합니다.

MongoAtlas에서는 이 페이지에서 할 수 있습니다.

이미 같은 문제에 대한 해결책이 있다는 것은 알고 있지만, 제 상황에 맞는 해결책을 찾지 못했기 때문에 다른 사람들이 저와 같은 문제에 직면했을 때 도움이 될 수 있도록 이 글을 올리고 싶었습니다.

pymongo 3.0에서 2.8로 다운그레이드하여 직접 수정하였습니다.무슨 일인지 모르겠어요.

   flask/bin/pip uninstall pymongo
   flask/bin/pip install pymongo==2.8

Pymongo 3.5에서도 같은 문제가 있었습니다.localhost를 127.0.0.1로 대체하거나 mongodb 인스턴스의 대응하는 IP 주소를 사용하면 문제가 해결됩니다.

dnspython(pip install dnspython)을 설치하여 해결했습니다.이 문제는 "mongodb+srv://URI를 사용하려면 "dnspython" 모듈을 설치해야 합니다."

Atlas Console > Network Access 순으로 이동하여 클라이언트 IP 주소(예: 0.0.0/00)를 추가합니다(주의:모든 클라이언트 ip가 데이터베이스에 액세스할 수 있습니다.)

네트워크 액세스 페이지

저 같은 경우에는

  • 나는 몽고 아틀라스를 사용하고 있었다.
  • 라우터 재부팅 후 다른 IP 주소가 표시됨

그래서 저는 그 IP를 Mongo Atlas 설정의 화이트리스트에 추가해야 했습니다.

MongoAtlas website -> Network Access -> IP Whitelist -> Add IP Address -> Add Current IP Address

그런 다음 IP 주소 상태가 활성으로 변경될 때까지 기다린 후 앱을 다시 실행하십시오.

호스트하기 위해 repl.it 서버를 사용하는 경우 서버 구성에 사용한 호스트 IP를 추가합니다.저에게는 0.0.0이 가장 일반적인 것입니다.

나도 오늘 같은 예외에 직면해 있었다. 같은 경우에는 wifi를 변경하여 mongodb에 정상적으로 접속할 수 있었기 때문에 프록시 설정으로 인해 접속이 차단되었을 것입니다.이 문제가 이미 해결된 것으로 표시되었다고 해도, 다른 문제에서는 문제를 좁힐 수 있을 것입니다.

같은 문제가 발생했는데 클라이언트 IP가 mongo 서버의 방화벽에 의해 차단되어 있는 것을 알게 되었습니다.

저도 이런 거 봤어요.

이는 pymongo3가 포크로 안전하지 않기 때문일 수 있습니다.

는 이것을 이를결결 adding adding adding adding adding 를 추가하여 한다.--lazy-appsuwsgi에 "할 수 .

uwsgi doc preforking-vs-vs-vs-vs-vs-vs-vs-vs

이 두 사람이 긍정적인 관계를 가지고 있는지는 확실치 않아요

'IP 주소'에 주소를 입니다.network access탭이 자동으로 변경되어 있습니다.이전 IP 주소를 삭제했는데 IP 주소가 약간 변경되었습니다.

pymongo 3은 클라이언트를 인스턴스화할 때 연결에 실패했음을 알려주지 않습니다.연결되지 않았을 수 있습니다.

https://api.mongodb.com/python/3.5.1/api/pymongo/mongo_client.html

"사용할 수 없는 경우 Connection Failure가 발생하지 않습니다.다음과 같이 서버를 사용할 수 있는지 여부를 확인할 수 있습니다."

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")

서버의 IP 주소를 mongod.conf 파일에 추가해 볼 수 있습니다.Linux(ubuntu) os를 사용하는 경우 다음 솔루션을 사용해 보십시오.

  1. mongod.conf 파일을 변경합니다.

    vi /etc/mongod.conf
    

    127.0.0.1 뒤에 mongodb 서버의 IP 주소를 추가하여 저장할 수 있습니다.

    net:
      port:27017
      bindIp:127.0.0.1,mongodb server ip
    
  2. 임시:

    sudo service mongod restart

이제 pymongo Mongo Client를 사용하여 mongodb 연결을 시도할 수 있습니다.

백그라운드에서 실행 중인 MongoDB 서버가 없기 때문에 이 오류가 발생했습니다.MongoDB 서버를 실행하려면 cmd 또는 anaconda 프롬프트를 열고 다음과 같이 입력합니다.

"C:\Program Files\MongoDB\Server\3.6\bin\mongod.exe"

그 후 실행

import pymongo
myclient = pymongo.MongoClient()    
mydb = myclient["mydatabase"]
myclient.list_database_names()

pymongo 3.2를 사용하고 있는데, 같은 에러가 발생하고 있습니다만, 제 경우는 설정이 잘못되어 있습니다.인가를 유효하게 한 후, url내의 포토를 갱신하는 것을 잊어버리고, 접속 타임 아웃이 되었습니다.authSource는 일반적으로 응용 프로그램 데이터를 저장하는 데이터베이스와 다르기 때문에 필요할 수 있습니다.

나는 바인드 아웃을 코멘트했다.모든 접속을 허용하는 대신 mongod.conf의 IP 변수(0.0.0을 입력해야 함)물론, 그 결과에 주의하세요.

개발자들은 PYTON-961에서 추적된 이 문제를 조사하고 있습니다.mongod를 실행하면 이 문제를 해결할 수 있습니다.수동으로 실행하고 모니터링합니다.이 문제는 콘솔이 프리즈할 때 발생하며 mongod 콘솔이 막혀 있으면 Enter 키를 누를 수 있습니다.개발자가 이 버그를 수정하기 전까지는 이것이 현재로선 가장 간단한 해결책입니다.

개발 중에 같은 문제에 부딪혔습니다.로컬 머신에서 mongodb가 실행되지 않았기 때문입니다.sudo systemctl restart mongodUbuntu에서 mongodb를 실행할 수 있습니다).

윈도우에서 동일한 오류가 발생하여 MongoDB 서비스를 시작했습니다.

  • services ctrl+R을 열고 services.msc를 입력한 후 Enter 키를 누릅니다.

내 경우 ip 허용 목록 0.0.0 allow anywhere만 설정하지만 "what is my ip"를 사용하여 IP를 설정하고 네트워크액세스에 복사 붙여넣기> add ip

나는 같은 문제로 고생하고 있다.읽었는데 어느 쪽도 삽입이 전혀 작동하지 않았습니다.ServerSelectionTimeoutError.

사용하고 있습니다.pymongo==3.11.4Ubuntu 18.04 LTS로 설정합니다.사용해보았다connect=False, 추가 패스?ssl=true&ssl_cert_reqs=CERT_NONE옵션 및 위에 나열된 기타 제안사항을 참조하십시오.제 경우엔 효과가 없었어요.

마지막으로 단순 업그레이드를 시도했습니다.pymongo==3.12.1통과하지 않고 연결이 되더라고요.connect=false, 및 기타extra arguments제안된.

    login = '<USERNAME>'
    password = '<PASSWORD>'
    host = '*.mongodb.net'
    db = '<DB>'
    uri = f'mongodb+srv://{login}:{password}@{host}/{db}?retryWrites=true&w=majority'
    client = MongoClient(uri, authsource='admin')#, connect=False)
    collection = client.db.get_collection('collection_name')
    # t = collection.find_one({'hello': '1'})
    t = collection.insert_one({'hello': '2'})
    print(t)

MongoDB 계정 비밀번호가 아닌 사용자 비밀번호를 입력했는지 확인합니다.비슷한 문제가 발생했습니다.저의 경우 사용자 비밀번호가 아닌 MongoDB 계정 비밀번호를 잘못 입력하였습니다.

오늘 이 문제가 있었어요.저는 다음과 같이 대처했습니다.

dnspython 라이브러리 설치> MongoDB 웹 페이지로 이동> 로그인 > 보안 > 네트워크 액세스 > IP 주소 추가 > 요청원 IP 주소 추가

이게 도움이 됐으면 좋겠어요.

저도 같은 문제가 있었는데..2분 전에 완벽하게 작동하던 코드가 이 오류를 발생시켰습니다.구글에서 30분 정도 해결책을 찾았는데 자동으로 수정이 됐어요.홈 인터넷 접속이 문제일 수 있습니다.추측입니다만, 코드나 그 외의 설정 파일을 변경하지 않은 경우는, 잠시 기다렸다가 재시도하는 것이 좋습니다.

나도 같은 문제에 직면해 있었다.그리고 나는 덧붙였다.

import certifi
Client = MongoClient("mongodb+srv://<username>:<password>@cluster0.ax9ugoz.mongodb.net/?retryWrites=true&w=majority", tlsCAFile=certifi.where())

제 문제가 해결됐어요

Certify는 TLS 호스트의 ID를 확인하면서 SSL 증명서의 신뢰성을 검증하기 위한 루트 증명서 컬렉션을 제공합니다.

은 이이에 this this this in in로 수정되었습니다.PyMongo이 pull_request를 사용합니다.

이 문제는 이전에 mongodb 서비스 부분정지된 서비스의 MongoDB를 실행으로 전환했을 때 해결되었습니다.

  • 먼저 MongoDB 환경을 설정합니다.

  • CMD에서 실행합니다(C:\Program Files\MongoDB).\Server\3.6\bin\mongod.exe"

  • 다른 CMD를 열고 "C:\Program Files\MongoDB"를 실행합니다.\Server\3.6\bin\mongo.exe"

그리고 pymongo [아나콘다 프롬프트]를 사용할 수 있습니다.

import pymongo
from pymongo import MongoClient

client = MongoClient()
db = client.test_db
collection = db['test_coll']

참조 - https://docs.mongodb.com/tutorials/install-mongodb-on-windows/

언급URL : https://stackoverflow.com/questions/31030307/why-is-pymongo-3-giving-serverselectiontimeouterror

반응형