如何解决使用 VPC 连接器的 Google App Engine 无法与 MongoDB 连接
当我使用 VPC 连接器和带有副本集的 MongoDB
在 Google App Engine 上部署 Python 应用程序时,我收到以下错误。
MongoDB
在 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 代码:
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.")
解决方法
确认该成员的副本集的主机名是从应用程序进行访问。
步骤:
-
检查
rs.config()
-
检查成员的主机名
cfg.members[0].host = FQDN
-
确认
FQDN
是从应用程序访问。
要快速调试问题并解决问题,请在处理错误消息时尽可能明确。目前,您正在捕获“所有”Exception
,并且这些反模式很难调试。
而不是使用一般的 Exception
:
except Exception:
raise Exception("mongo server is down.")
您可以通过某种方式捕获错误消息:
except Exception as err:
print("MongoDB error:",err)
或者更好的是,您可以编写自己的 Exception
来改进您的调试:
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。