无法建立与文档数据库服务的连接
排查方向
根据九个方面考虑的标准,你可以将连接失败的处理步骤整理如下:
排除数据库实例异常 :
检查文档数据库服务系统是否出现故障,确认实例状态是否正常。
确认没有其他进程或用户锁定了实例或表。
使用正确的客户端连接方式 :
确保使用正确版本的MongoDB客户端,建议使用4.0版本以上。
对于内网连接,确保文档数据库服务和ECS实例在同一区域和VPC内。
对于公网连接,确保购买或使用已有的EIP,并将其绑定到文档数据库服务实例。
使用正确的SSL方式安全连接 :
确认SSL开关的状态,根据开关状态使用正确的连接命令。
确保提供了正确的SSL证书文件路径。
排除连接命令错误 :
检查连接地址、端口、用户名和密码是否配置正确。
在SSL方式下,检查连接命令是否正确设置了SSL相关参数。
排除网络不通 :
对于内网访问,检查ECS和文档数据库服务实例是否在同一区域和VPC,如不在同一VPC,建立VPC对等连接。
检查安全组规则,确保允许文档数据库服务实例的相关端口通过。
对于公网访问,检查安全组和网络ACL规则,确保允许访问文档数据库服务实例的相关端口。
测试ECS是否能够ping通文档数据库服务实例地址的端口。
跨网段访问(配置IP映射) :
确认是否需要跨网段访问配置,根据情况进行相应的网络配置。
排除实例的连接数满 :
检查实例的连接数,确保连接数未达到上限。
排除磁盘满的情况 :
检查实例磁盘使用率,确保磁盘未满,导致无法正常连接实例。
排除CPU使用率飙升问题 :
检查实例的CPU使用率,确保CPU正常运行,避免影响数据读写处理和连接。
排查思路
确认数据库实例状态 :
• 通过文档数据库服务控制台检查文档数据库服务实例是否运行正常。
验证连接字符串 :
• 检查连接字符串是否正确,包含正确的主机名(或IP地址)、端口号、用户名和密码等信息。
检查网络连接 :
• 确保你的网络连接正常,尝试访问其他网站或服务来验证网络是否工作正常。
检查安全组和防火墙规则 :
• 确保安全组和防火墙规则允许与DDS实例相关的端口通过,特别是如果涉及公网访问。
验证SSL配置(如果使用) :
• 如果连接使用SSL方式,首先通过文档数据库服务控制台基本信息查看SSL是否开启,并且上传证书到ECS。
• 连接命令如下:
./mongo --ssl --host <DB_HOST> --port <DB_PORT> -u <DB_USER> -p --authenticationDatabase <AUTH_DB> --sslCAFile <CA_FILE_PATH> --sslAllowInvalidHostnames
• 其中,各参数的含义如下:
– --ssl: 启用 SSL 连接。
– --host <DB_HOST>: 指定 MongoDB 数据库的主机名或 IP 地址。
– --port <DB_PORT>: 指定 MongoDB 数据库的端口号。
– -u <DB_USER>: 指定用于认证的 MongoDB 用户名。
– -p: 表示在命令行中输入密码。在输入该命令后,系统会提示您输入 MongoDB 用户的密码。
– --authenticationDatabase <AUTH_DB>: 指定认证所使用的数据库。在这里指定为认证用户所在的数据库。
– --sslCAFile <CA_FILE_PATH>: 指定 SSL 连接时的 CA(Certificate Authority)文件的路径。该文件用于验证服务器端证书的合法性。
– --sslAllowInvalidHostnames: 允许连接到 SSL 服务器时不验证服务器的主机名。这个选项用于在连接时忽略 SSL 证书中的主机名不匹配错误。
需要将 <DB_HOST>、<DB_PORT>、<DB_USER>、<AUTH_DB> 和 <CA_FILE_PATH>替换为实际的 MongoDB 数据库的主机名、端口号、用户名、认证数据库和 SSL CA 文件的路径。
确认用户权限 :
• 确保使用的用户名和密码具有连接到文档数据库服务实例的权限。
尝试使用其他客户端工具 :
• 如果连接失败是由于客户端工具问题,尝试使用其他客户端工具进行连接,以排除客户端工具本身的问题。
查看错误日志 :
• 检查连接失败时产生的错误日志或错误消息,这些信息可能有助于找到问题的原因。
检查连接数和资源使用情况 :
• 确认文档数据库服务实例的连接数是否达到上限,以及磁盘和CPU的使用情况是否正常。
验证内网/公网访问配置 :
• 对于内网访问,确认文档数据库服务和ECS实例是否在同一区域和VPC,如果不在同一VPC,检查VPC对等连接配置。
• 对于公网访问,确保ECS和文档数据库服务实例的安全组和网络ACL规则允许相应端口通过,并验证ECS是否能够ping通文档数据库服务实例地址的端口。
排除其他因素 :
• 排除可能影响连接的其他因素,例如阻塞的进程、资源竞争等。
如何应对因实例连接数达到最大限制而引发的连接失败问题
问题现象
• Python连接文档数据库服务时的错误 :
– pymongo.errors.ServerSelectionTimeoutError:表示Python的MongoDB驱动(pymongo)无法选择可用的文档数据库服务服务器,连接超时。
• Java连接文档数据库服务时的错误 :
– com.mongodb.MongoTimeoutException:表示Java的MongoDB驱动无法在规定的时间内连接到文档数据库服务实例,连接超时。
可能原因
• 分片集群(Sharded Cluster):
– 读写请求过多,超过了分片集群的连接数上限。
– 部分分片服务器负载过高,无法处理更多的连接请求。
– 分片键设计不合理,导致部分分片集群负载不均衡。
• 副本集(Replica Set):
– 读写请求过多,超过了副本集的连接数上限。
– 副本集中的主节点(Primary)负载过高,无法处理更多的连接请求。
• 单节点实例:
– 读写请求过多,超过了单节点实例的连接数上限。
处理思路
• 请及时排查业务侧连接是否有效,优化实例连接,释放不必要的连接。
• 排查“net.maxIncomingConnections”参数的值及实例规格,修改参数值或对数据库进行规格扩容。
• 通过文档数据库服务控制台,基本信息页查看监控信息、CPU、内存、磁盘、连接数等指标,通过控制台的告警中心设置告警策略,出现告警时可以提前识别风险。
处理方法
优化实例连接,释放不必要的连接。
• 您可以通过重启实例来临时释放所有的连接。
• 您可以查询节点当前连接数,以及当前连接来源,分析各个终端和文档数据库服务实例分别建立了多少连接,并作出相应调整。
db.serverStatus().connections
{ "current" : 7, "available" : 398, "totalCreated" : 818364 }
#您需要关注以下参数及对应的值:
current:当前已经建立的连接数。
available:当前可用的连接数。修改参数值或对数据库进行规格扩容。
• 通过文档数据库服务参数设置页面connPoolMaxConnsPerHost 的值进行调整,修改后重启实例生效。
• 如果调整连接数过大,可能导致服务崩溃,这时只能通过变更实例规格增加承载的连接数的数量。
如何检索当前连接数量并对其进行控制
查询并修改当前连接数配置值
购买文档数据库服务实例规格不同,最大连接数也不同。
登录文档数据库服务管理控制台,查询当前连接数:
实例列表页,点击运行状态是“运行中”的实例ID。
进入实例详情页。
点击“参数设置”菜单栏,通过 connPoolMaxConnsPerHost 参数的值,可以查看到当前实例连接数配置值。
通过修改 connPoolMaxConnsPerHost 参数可以限制连接数。
在ECS和文档数据库分别安置于互不连通的VPC环境中时,如何处理
请参考弹性云主机-用户指南-网卡-切换虚拟私有云,将ECS的虚拟私有云切换为与文档数据库服务相同的虚拟私有云。
应用程序是否需要支持自动重连数据库
需要,应用程序在文档数据库服务重启后应该支持自动重连数据库。文档数据库服务的重启可能是计划内的维护操作,也可能是出于异常情况而进行的,无论哪种情况,都可能导致数据库连接中断。为了保障应用的连续性和可靠性,应用程序应该具备自动重连的能力。
同时建议您的应用程序采用长连接方式连接数据库,以降低资源消耗,提高性能。
如何创建并登录弹性云服务器
创建并登录弹性云服务器,请参见弹性云主机-快速入门-创建弹性云主机和弹性云主机-快速入门-登录弹性云主机。
• 该弹性云服务器用于连接文档数据库实例,需要与待连接的实例处于同一虚拟私有云子网内。
• 创建弹性云服务器时,要选择操作系统,例如centos7.6,并为其绑定EIP。
• 正确配置安全组,使弹性云服务器可以直接连接文档数据库服务。