为什么我的 Amazon Redshift 集群会出现间歇性连接问题?
我想了解如何排查并解决在 Amazon Redshift 集群中遇到的间歇性连接问题,这些问题是由访问受限、维护时段、节点故障、加密密钥轮换、活跃连接过多、CPU 使用率过高以及客户端连接问题等因素引起的。
简短描述
以下问题可能会导致 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 提取或者存在使用计算节点的 Amazon 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 集群时收到 Invalid operation 错误,就说明已达到连接配额。要查看集群的活跃连接数量,请查看 Amazon CloudWatch 中的 DatabaseConnections 指标。
如果注意到数据库连接激增,则 Amazon Redshift 集群中可能存在许多空闲连接。要查看空闲连接的数量,请运行以下 SQL 查询:
select process, 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 中的 keepalive 功能来检查客户端和服务器之间的连接是否正常运行。keepalive 功能还有助于防止连接链路断开。要查看或配置 keepalive 的值,请参阅“更改 TCP/IP 超时设置”和“更改 DSN 超时设置”。
- 如果查询似乎正在运行但在 SQL 客户端工具中停止响应,请检查最大传输单元 (MTU)。由于数据包丢失,查询可能无法显示在 Amazon Redshift 中。当两台 IP 主机之间的网络路径中的 MTU 大小不同时,就会发生丢包。有关如何管理丢包问题的更多信息,请参阅“查询似乎停止响应,有时无法到达集群”。
相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前