排查 Aurora MySQL 数据库的连接问题 - Amazon Aurora

排查 Aurora MySQL 数据库的连接问题

确保应用程序和 RDS 数据库实例之间的可靠连接对于工作负载的平稳运行至关重要。但是,各种因素(例如网络配置、身份验证问题或资源限制)可能会导致出现连接问题。本指南旨在提供一种全面的方法来排查 Aurora MySQL 的连接问题。

识别 Aurora MySQL 的数据库连接问题

识别连接问题的具体类别有助于缩小潜在原因范围并指导问题排查过程。每个类别可能需要不同的诊断和解决方法与技术。数据库连接问题可以大致分为以下几类。

连接错误和异常

出现连接错误和异常的原因有多种,例如连接字符串不正确、身份验证失败、网络中断或数据库服务器问题。原因可能包括连接参数配置错误、凭证无效、网络中断或数据库服务器崩溃或重新启动。安全组配置错误、虚拟私有云(VPC)设置、网络访问控制列表(ACL)以及与子网关联的路由表也可能导致连接问题。

已达到连接限制

当数据库服务器的并发连接数超过允许的最大限制时,就会出现此问题。数据库服务器通常具有可配置的最大连接限制,该限制由集群和实例参数组中的参数 max_connections 定义。通过施加连接限制,数据库服务器可确保拥有足够的资源(例如内存、CPU 和文件句柄)来有效地处理现有连接并提供可接受的性能。原因可能包括应用程序中的连接泄漏、连接池效率低下或连接请求意外激增。

连接超时

当客户端应用程序无法在指定的超时期间与数据库服务器建立连接时,就会发生连接超时。常见原因包括网络问题、服务器过载、防火墙规则和连接设置配置错误。

空闲连接超时

为了节省资源,数据库服务器可能会自动关闭长时间处于非活动状态的空闲连接。此超时通常可使用 wait_timeoutinteractive_timeout parameters 进行配置,并且应根据应用程序的连接使用模式进行调整。原因可能包括应用程序逻辑使连接长时间处于空闲状态,或者连接管理不当。

间歇性断开现有连接

此类错误是指这样一种情况:尽管客户端应用程序和数据库之间已建立的连接处于活动状态并正在使用中,但仍意外终止或不定期断开连接。这些断开连接是间歇性发生的,意味着它们以不规则的间隔发生,而且不一致。原因可以包括:

  • 数据库服务器问题,例如重新启动或失效转移

  • 应用程序连接处理不当

  • 负载均衡和代理问题

  • 网络不稳定

  • 连接路径中涉及第三方组件或中间件的问题

  • 查询执行超时

  • 服务器端或客户端的资源限制

通过全面的监控、日志记录和分析来确定根本原因至关重要,而实施适当的错误处理、连接池和重试机制有助于减轻这些间歇性断开连接对应用程序功能和用户体验的影响。

收集有关 Aurora MySQL 连接问题的数据

收集与应用程序、数据库、网络和基础设施组件相关的全面数据对于有效排查应用程序与 Aurora MySQL 数据库之间的连接问题至关重要。通过收集相关的日志、配置和诊断信息,可以获得宝贵的见解,这些见解能够帮助您确定连接问题的根本原因并指导您找到适当的解决方案。

网络日志和配置(例如安全组规则、VPC 设置和路由表)对于识别可能阻碍应用程序成功与数据库建立连接的潜在网络相关瓶颈或错误配置至关重要。通过分析这些网络组件,您可以确保已打开必要的端口,已允许 IP 地址,并已正确设置路由配置。

时间戳

记录发生连接问题时的确切时间戳。这有助于识别模式或将问题与其他事件或活动相关联。

数据库引擎日志

除了常规数据库日志外,还要查看数据库引擎日志(例如,MySQL 错误日志和慢速查询日志),以了解可能与间歇性连接问题相关的任何相关信息或错误。有关更多信息,请参阅 Aurora MySQL 数据库日志记录

客户端应用程序日志

从连接到数据库的客户端应用程序收集详细日志。应用程序日志从应用程序的角度提供有关连接尝试和错误的信息以及任何相关信息,从而揭示与连接字符串、身份验证凭证或应用程序级连接处理有关的问题。

而数据库日志让您可以深入了解数据库端错误、慢速查询或可能导致连接问题的事件。有关更多信息,请参阅 Aurora MySQL 数据库日志记录

客户端环境变量

检查客户端上的任何环境变量或配置设置是否可能影响数据库连接,例如代理设置、SSL/TLS 设置或任何其他相关变量。

客户端库版本

确保客户端使用的是用于数据库连接的所有数据库驱动程序、库或框架的最新版本。过时的版本可能存在已知问题或兼容性问题。

客户端网络捕获

出现连接问题时,使用诸如 Wireshark 或 tcpdump 之类的工具在客户端执行网络捕获。这有助于在客户端识别任何网络相关问题或异常。

客户端网络拓扑

了解客户端的网络拓扑,包括任何防火墙、负载均衡器或其他组件,例如 RDS 代理或 Proxy SQL,这些组件与数据库建立连接,而不是客户端直接建立连接。

客户端操作系统设置

检查可能影响网络连接的客户端操作系统设置,例如防火墙规则、网络适配器设置以及任何其他相关设置。

连接池配置

如果您在应用程序中使用连接池机制,请查看配置设置并监控池指标(例如,活动连接、空闲连接和连接超时),以确保池正常运行。还要查看池设置(例如最大池大小、最小池大小和连接验证设置)以确保配置正确。

连接字符串

连接字符串通常包括诸如主机名或端点、端口号、数据库名称和身份验证凭证之类的参数。分析连接字符串有助于识别可能导致连接问题的潜在错误配置或不正确设置。例如,错误的主机名或端口号可能会阻止客户端访问数据库实例,而无效的身份验证凭证可能导致身份验证失败和连接被拒绝。此外,连接字符串可以揭示与连接池、超时或其他特定于连接的设置(可能导致连接问题)有关的问题。提供客户端应用程序使用的完整连接字符串有助于查明客户端上的任何错误配置。

数据库指标

出现连接问题时,监控 CPU 使用率、内存使用量和磁盘 I/O 等数据库指标。这些有助于确定数据库实例是否存在资源争用或性能问题。

数据库引擎版本

请注意 Aurora MySQL 数据库引擎版本。AWS 定期发布更新以解决已知问题和安全漏洞,并引入性能增强功能。因此,强烈建议您升级到最新的可用版本,因为这些更新通常包含与连接性、性能和稳定性特别相关的错误修复和改进。提供数据库版本信息以及收集的其他详细信息可以帮助 AWS Support 有效地诊断和解决连接问题。

网络指标

出现连接问题时,收集延迟、数据包丢失和吞吐量等网络指标。pingtraceroute 等工具以及网络监控工具可以帮助收集这些数据。

源和客户端详细信息

确定正在启动数据库连接的应用程序服务器、负载均衡器或任何其他组件的 IP 地址。这可以是单个 IP 地址,也可以是 IP 地址范围(CIDR 表示法)。如果源是 Amazon EC2 实例,则查看实例类型、可用区、子网 ID 和与该实例关联的安全组以及网络接口详细信息(例如私有 IP 地址和公有 IP 地址)也会有所帮助。

通过全面分析所收集的数据,您可以识别导致间歇性或持续连接问题的错误配置、资源限制、网络中断或其他潜在问题。您可以根据这些信息采取有针对性的措施,例如调整配置、解决网络问题或进行应用程序级连接处理。

监控 Aurora MySQL 的数据库连接

要监控连接问题并对其进行故障排除,可以使用以下指标和特征。

CloudWatch 指标
  • CPUUtilization – 如果数据库实例上的 CPU 使用率过高,可能会导致查询执行缓慢,从而导致连接超时或被拒绝。

  • DatabaseConnections – 监控数据库实例的活动连接数。如果连接数接近配置的最大值,则表明可能存在连接问题或连接池已耗尽。

  • FreeableMemory – 由于资源限制,可用内存不足可能会导致性能问题和连接问题。

  • NetworkReceiveThroughputNetworkTransmitThroughput – 网络吞吐量的异常峰值或下降可能表明存在连接问题或网络瓶颈。

Performance Insights 指标

要利用 Performance Insights 排查 Aurora MySQL 中的连接问题,请分析如下所示的数据库指标:

  • Aborted_clients

  • Aborted_connects

  • 连接

  • max_connections

  • Threads_connected

  • Threads_created

  • Threads_running

这些指标可帮助您识别连接瓶颈,检测网络或身份验证问题,优化连接池并确保高效的线程管理。有关更多信息,请参阅 Aurora MySQL 的 Performance Insights 计数器

Performance Insights 特征
  • 数据库负载 – 可视化一段时间内的数据库负载,并将其与连接问题或性能下降相关联。

  • SQL 统计数据 – 分析 SQL 统计数据,以识别可能导致连接问题的低效查询或数据库操作。

  • 主要查询 – 识别和分析资源密集度高的查询,这有助于识别可能导致连接问题的潜在性能瓶颈或长时间运行的查询。

通过监控这些指标并利用 Performance Insights,您可以了解数据库实例的性能、资源使用情况以及可能导致连接问题的潜在瓶颈。例如:

  • 接近最大限制的高 DatabaseConnections 值可能表明连接池已耗尽或连接处理不当,从而导致连接问题。

  • CPUUtilization 或低 FreeableMemory 可能表明资源限制,这可能会导致查询执行缓慢以及连接超时或被拒绝。

  • 分析主要查询SQL 统计数据有助于识别可能导致连接问题的低效查询或资源密集型查询。

此外,监控 CloudWatch Logs 和设置警报可帮助您在连接问题升级之前主动识别问题并做出响应。

值得注意的是,虽然这些指标和工具可以提供有价值的见解,但它们应与其他故障排除步骤结合使用。如果再查看网络配置、安全组规则和应用程序级连接处理,则可以全面诊断和解决 Aurora MySQL 数据库实例的连接问题。

Aurora MySQL 的额外监控

CloudWatch 指标
  • AbortedClients – 跟踪未正确关闭的客户端连接数量。

  • AuroraSlowConnectionHandleCount – 跟踪慢速连接句柄操作的数量,指出潜在的连接问题或性能瓶颈。

  • AuroraSlowHandshakeCount – 测量慢速握手操作的数量,这也可以作为连接问题的指标。

  • ConnectionAttempts – 测量尝试连接 Aurora MySQL 数据库实例的次数。

全局状态变量

Aurora_external_connection_count – 显示与数据库实例的数据库连接数,不包括用于数据库运行状况检查的 RDS 服务连接。

通过监控这些指标和全局状态变量,您可以了解可能导致 Amazon Aurora MySQL 实例出现连接问题的连接模式、错误和潜在瓶颈。

例如,AbortedClientsAuroraSlowConnectionHandleCount 数量过多可能表明存在连接问题。

此外,设置 CloudWatch 警报和通知可帮助您在连接问题升级并影响应用程序性能之前主动识别问题并做出响应。

Aurora MySQL 的连接错误代码

以下是 Aurora MySQL 数据库的一些常见连接错误及其错误代码和说明。

错误代码 1040:连接过多

当客户端尝试建立的连接数超过数据库服务器允许的最大连接数时,就会发生此错误。可能的原因包括:

  • 连接池配置错误 – 如果使用连接池机制,请确保最大池大小不要设置得太高,并且连接正确释放回池中。

  • 数据库实例配置 – 验证数据库实例的最大允许连接数设置,并在必要时通过设置 max_connections 参数进行调整。

  • 高并发 – 如果多个客户端或应用程序同时连接到数据库,则可能会达到允许的最大连接限制。

错误代码 1045:用户“...”@“...”的访问被拒绝(使用密码:是/否)

此错误表示尝试连接到数据库时身份验证失败。可能的原因包括:

  • 身份验证插件兼容性 – 检查客户端使用的身份验证插件是否与数据库服务器的身份验证机制兼容。

  • 用户名或密码不正确 – 验证连接字符串或身份验证机制中使用的用户名和密码是否正确。

  • 用户权限 – 确保用户拥有从指定主机或网络连接到数据库实例所需的权限。

错误代码 1049:未知数据库“...”

此错误表示客户端正试图连接到服务器上不存在的数据库。可能的原因包括:

  • 数据库未创建 – 确保数据库服务器上已创建指定的数据库。

  • 数据库名称不正确 – 仔细检查连接字符串或查询中使用的数据库名称是否准确。

  • 用户权限 – 验证用户是否拥有访问指定数据库所需的权限。

错误代码 1153:数据包大于“max_allowed_packet”字节

当客户端尝试发送或接收超出数据库服务器允许的最大数据包大小的数据时,就会发生此错误。可能的原因包括:

  • 大型查询或结果集 – 如果执行的查询涉及大量数据,则可能会超过数据包大小限制。

  • 错误配置的数据包大小设置 – 检查数据库服务器上的 max_allowed_packet 设置并在必要时进行调整。

  • 网络配置问题 – 确保网络配置(例如 MTU 大小)允许所需的数据包大小。

错误代码 1226:用户“...”已超出“max_user_connections”资源(当前值:...)

此错误表示用户已超过数据库服务器允许的最大并发连接数。可能的原因包括:

  • 连接池配置错误 – 如果使用连接池机制,请确保最大池大小不要设置得太高,以免超出用户的连接限制。

  • 数据库实例配置 – 验证数据库实例的 max_user_connections 设置,并在必要时进行调整。

  • 高并发 – 如果多个客户端或应用程序使用相同的用户同时连接到数据库,则可能会达到特定于用户的连接限制。

错误代码 2003:无法通过“...”连接到 MySQL 服务器(10061)

当客户端无法与数据库服务器建立 TCP/IP 连接时,通常会发生此错误。这可能由多种问题引起,例如:

  • 数据库实例状态 – 确保数据库实例处于 available 状态,且未进行任何维护或备份操作。

  • 防火墙规则 – 检查是否有任何防火墙(操作系统、网络或安全组)在阻止指定端口(对于 MySQL,通常为 3306)上的连接。

  • 主机名或端点不正确 – 确保连接字符串中使用的主机名或端点正确且与数据库实例相匹配。

  • 网络连接问题 – 验证客户端计算机是否可以通过网络访问数据库实例。检查是否存在任何网络中断、路由问题或者 VPC 或子网配置错误。

错误代码 2005:未知的 MySQL 服务器主机“...”(11001)

当客户端无法将数据库服务器的主机名或端点解析为 IP 地址时,就会发生此错误。可能的原因包括:

  • DNS 解析问题 – 验证客户端计算机是否可以使用 DNS 正确解析主机名。检查 DNS 设置、DNS 缓存,然后尝试使用 IP 地址而不是主机名。

  • 主机名或端点不正确 – 仔细检查连接字符串中使用的主机名或端点是否准确。

  • 网络配置问题 – 确保客户端的网络配置(例如 VPC、子网和路由表)允许进行 DNS 解析和连接到数据库实例。

错误代码 2026:SSL 连接错误

在尝试连接期间,当 SSL/TLS 配置或证书验证出现问题时,就会发生此错误。可能的原因包括:

  • 证书过期 – 检查服务器使用的 SSL/TLS 证书是否已过期并需要续订。

  • 证书验证问题 – 验证客户端是否能够正确验证服务器的 SSL/TLS 证书,以及该证书是否可信。

  • 网络配置问题 – 确保网络配置允许 SSL/TLS 连接,并且不会阻塞或干扰 SSL/TLS 握手过程。

  • SSL/TLS 配置不匹配 – 确保客户端和服务器上的 SSL/TLS 设置(例如,密码套件和协议版本)兼容。

通过了解每个错误代码的详细说明和潜在原因,在使用 Aurora MySQL 数据库时,您可以更好地排查和解决连接问题。

Aurora MySQL 的参数调优建议

最大连接数

调整这些参数有助于防止由于达到允许的最大连接限制而导致的连接问题。确保根据应用程序的并发要求和资源限制适当设置这些值。

  • max_connections – 此参数指定数据库实例允许的最大并发连接数。

  • max_user_connections – 可以在用户创建和修改过程中指定此参数,并设置特定用户账户允许的最大并发连接数。

网络缓冲区大小

增加这些值可以提高网络性能,特别是对于涉及大型数据传输或结果集的工作负载。但请谨慎行事,因为较大的缓冲区大小会占用更多内存。

  • net_buffer_length – 此参数设置客户端连接和结果缓冲区的初始大小,从而平衡内存使用量和查询性能。

  • max_allowed_packet – 此参数指定数据库实例可以发送或接收的单个网络数据包的最大大小。

网络压缩(客户端)

启用网络压缩可以减少网络带宽使用量,但会增加客户端和服务器端的 CPU 开销。

  • compress – 此参数启用或禁用客户端/服务器通信的网络压缩。

  • compress_protocol – 此参数指定用于网络通信的压缩协议。

网络性能调优

调整这些超时有助于管理空闲连接并防止资源耗尽,但要谨慎行事,因为较低的值可能会导致连接过早终止。

  • interactive_timeout – 此参数指定服务器在关闭交互式连接之前等待活动的秒数。

  • wait_timeout – 此参数确定服务器在关闭非交互式连接之前等待活动的秒数。

网络超时设置

调整这些超时有助于解决与连接速度慢或无响应有关的问题。但注意不要将它们设置得太低,否则可能会导致连接过早失败。

  • net_read_timeout – 此参数指定在结束读取操作之前等待来自连接的更多数据的秒数。

  • net_write_timeout – 此参数确定在结束写入操作之前等待数据块写入连接的秒数。

排查 Aurora MySQL 数据库连接问题的示例

以下示例说明如何识别和排查 Aurora MySQL 的数据库连接问题。

示例 1:排查失败的连接尝试

连接尝试失败可能有多种原因,包括身份验证失败、SSL/TLS 握手失败、达到 max_connections 限制以及数据库实例上的资源限制。

您可以通过 Performance Insights 或使用以下命令来跟踪失败的连接数。

mysql> show global status like 'aborted_connects'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | Aborted_connects | 7 | +------------------+-------+ 1 row in set (0.00 sec)

如果 Aborted_connects 数随着时间的推移而增加,则应用程序可能会出现间歇性连接问题。

您可以使用 Aurora 高级审计来记录客户端的连接和断开连接情况。您可以通过在数据库集群参数组中设置以下参数来执行此操作:

  • server_audit_logging = 1

  • server_audit_events = CONNECT

以下是登录失败的审计日志摘录。

1728498527380921,auora-mysql-node1,user_1,172.31.49.222,147189,0,FAILED_CONNECT,,,1045 1728498527380940,auora-mysql-node1,user_1,172.31.49.222,147189,0,DISCONNECT,,,0

其中:

  • 1728498527380921 – 登录失败发生时的纪元时间戳

  • aurora-mysql-node1 – 连接失败的 Aurora MySQL 集群节点的实例标识符

  • user_1 – 登录失败的数据库用户的名称

  • 172.31.49.222 – 建立连接的客户端的私有 IP 地址

  • 147189 – 登录失败的连接 ID

  • FAILED_CONNECT – 表示连接失败。

  • 1045 – 返回代码。非零值表示错误。在本例中,1045 对应于访问被拒绝。

有关更多信息,请参阅 MySQL 文档中的服务器错误代码客户端错误代码

您还可以检查 Aurora MySQL 错误日志中是否存在任何相关的错误消息,例如:

2024-10-09T19:26:59.310443Z 220 [Note] [MY-010926] [Server] Access denied for user 'user_1'@'172.31.49.222' (using password: YES) (sql_authentication.cc:1502)

示例 2:对异常客户端断开连接进行故障排除

您可以通过 Performance Insights 或使用以下命令来跟踪异常客户端断开连接数。

mysql> show global status like 'aborted_clients'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | Aborted_clients | 9 | +-----------------+-------+ 1 row in set (0.01 sec)

如果 Aborted_clients 数随着时间的推移而增加,则说明应用程序无法正确关闭与数据库的连接。如果连接未正确关闭,则可能导致资源泄漏和潜在的性能问题。不必要地使连接保持打开状态会消耗系统资源(例如内存和文件描述符),最终可能导致应用程序或服务器失去响应或重新启动。

您可以使用以下查询来识别未正确关闭连接的账户。它检索用户账户名称、用户进行连接所在的主机、未关闭的连接数以及未关闭的连接所占的百分比。

SELECT ess.user, ess.host, (a.total_connections - a.current_connections) - ess.count_star AS not_closed, (((a.total_connections - a.current_connections) - ess.count_star) * 100) / (a.total_connections - a.current_connections) AS pct_not_closed FROM performance_schema.events_statements_summary_by_account_by_event_name AS ess JOIN performance_schema.accounts AS a ON (ess.user = a.user AND ess.host = a.host) WHERE ess.event_name = 'statement/com/quit' AND (a.total_connections - a.current_connections) > ess.count_star; +----------+---------------+------------+----------------+ | user | host | not_closed | pct_not_closed | +----------+---------------+------------+----------------+ | user1 | 172.31.49.222 | 1 | 33.3333 | | user1 | 172.31.93.250 | 1024 | 12.1021 | | user2 | 172.31.93.250 | 10 | 12.8551 | +----------+---------------+------------+----------------+ 3 rows in set (0.00 sec)

确定未关闭连接的用户账户和主机后,您可以继续检查未正常关闭连接的代码。

例如,通过 Python 中的 MySQL 连接器,使用连接对象的 close() 方法来关闭连接。以下是建立数据库连接、执行查询和关闭连接的示例函数:

import mysql.connector def execute_query(query): # Establish a connection to the database connection = mysql.connector.connect( host="your_host", user="your_username", password="your_password", database="your_database" ) try: # Create a cursor object cursor = connection.cursor() # Execute the query cursor.execute(query) # Fetch and process the results results = cursor.fetchall() for row in results: print(row) finally: # Close the cursor and connection cursor.close() connection.close()

在此示例中,在 finally 数据块中调用 connection.close() 方法以确保无论是否发生异常,连接均已关闭。