Reputation: 317
I am getting the following error when I deploy a Python application on Google App Engine with VPC connector and MongoDB
with replica set.
MongoDB
is on Google Compute Engine.
pymongo.errors.ServerSelectionTimeoutError: \
Could not reach any servers in [('mongodb-v44', 27017)]. \
Replica set is configured with internal hostnames or IPs?, \
Timeout: 30s, Topology Description: <TopologyDescription id: \
5ff5a4121251453cdcc1ff41, topology_type: ReplicaSetNoPrimary, \
servers: [<ServerDescription ('mongodb-v44', 27017) \
server_type: Unknown, \
rtt: None, error=AutoReconnect('mongodb-v44:27017: \
a [Errno -2] Name or service not known')>]>"
Python code:
mongo_connection = mongoengine.connect(
db=os.getenv('DB_NAME'),
host=os.getenv('DB_HOST_URL'),
port=int(os.getenv('DB_PORT')),
username=os.getenv('DB_USERNAME'),
password=os.getenv('DB_PASSWORD'),
authentication_source='admin',
replicaset=os.getenv('REPLICA_SET'),
read_preference=ReadPreference.PRIMARY_PREFERRED
)
try:
info = mongo_connection.server_info() # Forces a call.
except Exception:
raise Exception("mongo server is down.")
Upvotes: 0
Views: 207
Reputation: 855
To debug issues quickly and resolve them, be as explicit as possible when handling error messages. At the moment, you are capturing "all" Exception
, and these anti-patterns can be very hard to debug.
Rather than using a general Exception
:
except Exception:
raise Exception("mongo server is down.")
You can either capture the error message in some way:
except Exception as err:
print("MongoDB error:", err)
Or better yet, you could write your own Exception
to improve your debugging:
class MongodbError(Exception):
"""Exception Base class"""
pass
class ServerTimeoutError(MongodbError):
pass
class MongoServerLostConnection(MongodbError):
pass
try:
do_something()
except MongodbError as err:
manage_mongo_error(err)
Upvotes: 1
Reputation: 26
Make sure that the member's hostname in the replica set are accessible from the application.
Steps:
check the rs.config()
check the members hostname cfg.members[0].host = FQDN
make sure FQDN
is accessible from the application.
Upvotes: 1