为什么我的 Amazon Redshift 集群遇到间歇性连接问题?

上次更新时间:2020 年 9 月 21 日

当我尝试连接到我的 Amazon Redshift 集群时,遇到间歇性的连接问题。为什么会发生这种情况?如何排查此问题?

简短描述

您的 Amazon Redshift 集群中的间歇性连接问题是由以下原因引起的:

  • 特定 IP 地址或 CIDR 块的受限访问
  • 维护时段更新
  • 节点故障或计划的管理任务
  • 加密密钥轮换
  • 活动网络连接过多
  • 领导节点的高 CPU 利用率
  • 客户端连接问题

解决方法

特定 IP 地址或 CIDR 块的受限访问

检查您的安全组中的特定 IP 地址或 CIDR 块是否存在受限访问。由于 DHCP 配置,您的客户端 IP 地址可能会发生变化,这可能会导致连接问题。此外,如果您没有为 Amazon Redshift 集群使用弹性 IP 地址,则集群节点的 AWS 托管 IP 可能会发生变化。例如,当您删除集群然后从快照重新创建集群时,或者当您恢复暂停的集群时,您的 IP 地址可能会发生变化。

注意:删除并重新创建 Amazon Redshift 集群时,公有 IP 地址将轮换。每当更换节点时,私有 IP 地址都会发生变化。

要解决任何网络限制,请考虑以下方法:

  • 如果您的应用程序正在缓存集群终端节点背后的公有 IP 地址,请确保将此终端节点用于 Amazon Redshift 连接。为了确保网络连接的稳定性和安全性,请避免为您的连接使用 DNS 缓存。
  • 最佳做法是为您的 Amazon Redshift 集群使用弹性 IP 地址。弹性 IP 地址允许您更改基础配置,而不会影响客户端用于连接到集群的 IP 地址。此方法对于故障后恢复等情况非常有用。如果您在发生故障后恢复集群,此方法非常有用。有关更多信息,请参阅管理 VPC 中的集群
  • 如果您使用私有 IP 地址连接到领导节点或计算节点,请确保使用新 IP 地址。例如,如果您执行了 SSH 接收或具有使用计算节点的 EMR 配置,请使用新 IP 地址更新您的设置。更换节点后,会为新节点授予一个新的私有 IP 地址。

维护时段更新

检查您的 Amazon Redshift 集群的维护时段。在维护时段内,您的 Amazon Redshift 集群无法处理读取或写入操作。如果将维护事件安排在给定的一周,则会在指定的 30 分钟维护时段内启动。当 Amazon Redshift 执行维护时,所有正在进行的查询或其他操作都将关闭。您可以从Amazon Redshift 控制台更改计划维护时段。

节点故障或计划的管理任务

Amazon Redshift 控制台中,检查事件选项卡是否存在任何节点故障或计划的管理任务(如集群调整大小或重新启动)。

如果发生硬件故障,Amazon Redshift 可能在短时间内不可用,从而导致查询失败。当查询失败时,您会看到如下所示的事件 描述:

"A hardware issue was detected on Amazon Redshift cluster [cluster name]. A replacement request was initiated at [time]." 

或者,如果账户管理员在 Amazon Redshift 集群上安排了重新启动或调整大小操作,则可能会出现间歇性的连接问题。然后,您的事件描述将指示以下内容:

"Cluster [cluster name] began restart at [time]."
"Cluster [cluster name] completed restart at [time]."
有关更多信息,请参阅 Amazon Redshift 事件类型和事件消息

加密密钥轮换

检查您的 Amazon Redshift 集群的密钥管理设置。验证您是否正在使用 AWS Key Management Service (AWS KMS) 密钥加密和密钥加密轮换

如果您的加密密钥已启用且正在轮换加密密钥,则在此期间,您的 Amazon Redshift 集群将不可用。因此,您会收到以下错误消息:

"pg_query(): Query failed: SSL SYSCALL error: EOF detected"

密钥轮换的频率取决于环境的数据安全性和标准策略。根据需要或在加密密钥可能遭到破坏时,时常轮换密钥。此外,请务必制定可同时支持您的安全性和集群可用性需求的密钥管理计划。

活动连接过多

在 Amazon Redshift 中,与您的集群的所有连接都会发送到领导节点,并且活动连接有最大限制。您的 Amazon Redshift 集群可以支持的最大限制由节点类型(而不是节点计数)决定。

在 Amazon Redshift 集群中的活动连接过多时,会收到以下错误:

"[Amazon](500310) Invalid operation: connection limit "500" exceeded for non-bootstrap users"
如果您在连接到 Amazon Redshift 集群时收到 无效操作错误,则表明您已达到连接限制。您可以通过查看 Amazon CloudWatch 中的 DatabaseConnections 指标,来检查集群的活动连接数。

如果您注意到数据库连接出现峰值,则 Amazon Redshift 集群中可能存在多个空闲连接。要检查空闲连接的数量,请运行以下 SQL 查询:

trim(a.user_name) as user_name, a.usesysid, a.starttime, 
 datediff(s,a.starttime,sysdate) as session_dur, b.last_end, 
datediff(s,case when b.last_end is not null then b.last_end else 
a.starttime end,sysdate) idle_dur
 	FROM
	(select starttime,process,u.usesysid,user_name 
	from stv_sessions s, pg_user u 
	where 
	s.user_name = u.usename 
 	and u.usesysid>1
and process NOT IN (select pid from stv_inflight where userid>1 
union select pid from stv_recents where status != 'Done' and 
 userid>1)
	) a 
	LEFT OUTER JOIN (select 
userid,pid,max(endtime) as last_end from svl_statementtext where 
 userid>1 and sequence=0 group by 1,2) b ON a.usesysid = b.userid AND 
a.process = b.pid
	WHERE (b.last_end > a.starttime OR b.last_end is null)
	ORDER BY idle_dur;

输出将类似如下示例:

 process | user_name  | usesysid |      starttime      | session_dur | last_end | idle_dur 
---------+------------+----------+---------------------+-------------+----------+----------
   14684 | myuser     |      100 | 2020-06-04 07:02:36 |           6 |          |        6
(1 row)

确定空闲连接后,可以使用以下命令语法关闭连接:

select pg_terminate_backend(process);

输出将类似如下示例:

pg_terminate_backend 
----------------------
                    1
(1 row)

领导节点的高 CPU 利用率

所有客户端都使用领导节点连接到 Amazon Redshift 集群。领导节点的 CPU 利用率高可能会导致间歇性连接问题。

如果您尝试连接到您的 Amazon Redshift 集群,并且领导节点的 CPU 占用率高,您会收到以下错误消息:

"Error setting/closing connection"

要确认您的领导节点是否已达到高 CPU 利用率,请检查 Amazon CloudWatch 中的 CPUUtilization 指标。有关更多信息,请参阅 Amazon Redshift 指标

客户端连接问题

检查客户端(如 Workbench/J 或 PostgreSQL)与服务器(您的 Amazon Redshift 集群)之间的连接问题。如果您的客户端尝试从已释放的端口发送请求,则可能会发生客户端连接重置。因此,连接重置可能会导致间歇性连接问题。

要防止这些客户端连接问题,请考虑以下方法:

  • 使用 Amazon Redshift 中的保持活动功能检查客户端和服务器之间的连接是否正常运行。保持活动功能还有助于防止任何连接链路断开。要检查或配置保持活动的值,请参阅更改 TCP/IP 超时设置更改 DSN 超时设置
  • 如果查询似乎正在运行,但在 SQL 客户端工具中挂起,请检查最大转换单元 (MTU)。有时,由于数据包丢弃,查询无法显示在 Amazon Redshift 中。当两台 IP 主机之间的网络路径中的 MTU 大小不同时,会发生数据包丢弃。有关如何管理数据包丢弃问题的详细信息,请参阅查询似乎挂起,有时无法到达集群

这篇文章对您有帮助吗?


您是否需要账单或技术支持?