管理客户端连接
Vertica 提供了多种设置来控制客户端连接:
-
限制用户可以同时打开的客户端连接数。
-
限制客户端连接在自动断开之前可以处于空闲状态的时间。
-
使用连接负载均衡将为客户端连接提供服务所产生的开销分摊到各个节点。
-
使用 TCP keepalive 检测无响应的客户端。
-
排空子群集以拒绝与该子群集建立的任何新客户端连接。有关详细信息,请参阅排空客户端连接。
与给定节点建立的客户端连接总数不能超过 MaxClientSessions
中设置的限值。
对客户端的 MAXCONNECTIONS
属性进行更改不会对当前会话产生影响;这些更改将仅应用于新会话。例如,如果将用户的连接模式从 DATABASE
更改为 NODE
,则当前节点连接不会受到影响。此更改仅应用于 在调用节点上保留的新会话。
当 Vertica 关闭某个客户端连接时,将取消该客户端正在进行的操作(如有)。
管理 TCP keepalive 设置
Vertica 会使用 TCP keepalive 来检测无响应的客户端并确定应关闭连接的时间。
以下参数控制数据库的 TCP keepalive 策略。数据库的参数会覆盖内核级别的等效参数(tcp_keepalive_time
、tcp_keepalive_intvl
、tcp_keepalive_probes
):
-
KeepAliveIdleTime:发送第一个 TCP keepalive 探测器以确保客户端仍处于连接状态之前的时间(以秒为单位,默认值为 7200 秒)。
-
KeepAliveProbeInterval:keepalive 探测器之间的时间间隔(以秒为单位,默认值为 75 秒)。
-
KeepAliveProbeCount:将客户端连接视为断开并关闭之前,必须由客户端取消确认的连续 keepalive 探测器次数(默认值为 9)。
要查看当前会话的有效 TCP keepalive 设置,请使用 SHOW CURRENT:
=> SHOW CURRENT KeepAliveIdleTime, KeepAliveProbeInterval, KeepAliveProbeCount;
level | name | setting
---------+------------------------+---------
DEFAULT | KeepAliveIdleTime | 7200
DEFAULT | KeepAliveProbeInterval | 75
DEFAULT | KeepAliveProbeCount | 9
(3 rows)
示例
以下是示例 TCP keepalive 策略:
-
10 分钟后,将第一个 keepalive 探测器发送到客户端。
-
每隔 30 秒发送一次连续的 keepalive 探测器。
-
如果客户端无法响应 10 个 keepalive 探测器,则将连接视为断开并关闭。
要将此策略设为客户端连接的默认策略:
=> ALTER DATABASE DEFAULT SET KeepAliveIdleTime = 600;
=> ALTER DATABASE DEFAULT SET KeepAliveProbeInterval = 30;
=> ALTER DATABASE DEFAULT SET KeepAliveProbeCount = 10;
同样,要将此策略用于当前会话,可以使用 ALTER SESSION。这会覆盖默认/数据库级别策略:
=> ALTER SESSION SET KeepAliveIdleTime = 600;
=> ALTER SESSION SET KeepAliveProbeInterval = 30;
=> ALTER SESSION SET KeepAliveProbeCount = 10;
限制空闲会话长度
如果客户端继续响应 TCP keepalive 探测器,但未运行任何查询,则将客户端的会话视为空闲。空闲会话最终会超时。可以在三个级别设置允许会话空闲的最长时间,按优先级降序排列:
-
以 dbadmin 身份为各个用户设置
IDLESESSIONTIMEOUT
属性。此属性会覆盖所有其他会话超时设置。 -
用户可以使用
SET SESSION IDLESESSIONTIMEOUT
来限制当前会话的空闲时间。非超级用户只能将会话空闲时间设置为不大于自己设置的IDLESESSIONTIMEOUT
值。如果没有为用户显式设置会话空闲时间,则该用户的会话空闲时间将从节点或数据库设置继承。 -
以 dbadmin 身份对数据库或各个节点设置配置参数
DEFAULTIDLESESSIONTIMEOUT
。您可以使用配置参数DEFAULTIDLESESSIONTIMEOUT
来限制默认数据库群集或各个节点。此参数会为所有非超级用户设置默认超时值。
所有设置都应用于持续处于空闲状态的会话,即未在运行查询的会话。如果客户端在查询执行期间很慢或没有响应,则该时间不会应用于超时。例如,流式批量插入所需的时间不会计入超时。从开始等待来自某会话的任何类型的消息那一刻起,服务器会将该会话标识为空闲。
查看会话设置
关闭用户会话
要手动关闭用户会话,请使用
CLOSE_USER_SESSIONS
:
=> SELECT CLOSE_USER_SESSIONS ('Joe');
close_user_sessions
------------------------------------------------------------------------------
Close all sessions for user Joe sent. Check v_monitor.sessions for progress.
(1 row)
示例
用户执行某个查询后,由于某种原因,该查询需要很长时间才能完成(例如,由于服务器流量或查询比较复杂)。在这种情况下,用户可能会认为该查询失败并打开另一个会话来运行相同查询。现在,两个会话会使用额外的连接运行相同的查询。
为了防止出现这种情况,您可以通过修改其 MAXCONNECTIONS
用户属性来限制各个用户可以运行的会话数。这样有助于最大程度地降低运行冗余查询的概率。此外,还有助于防止用户使用数据库所设置的所有可用连接。例如,针对用户 SuzyQ
的以下设置将限制该用户在任何时候运行的数据库会话不得超过两个:
=> CREATE USER SuzyQ MAXCONNECTIONS 2 ON DATABASE;
当用户多次连接到服务器时,可限制设置客户端连接所能防止出现的另一个问题。用户连接过多会耗尽数据库配置参数
MaxClientSessions
所设置的允许连接数。
注意
任何用户设置的 MAXCONNECTIONS 限值都不能大于 MaxClientSessions 设置。群集更改和连接
当群集发生以下变化时,客户端连接限值的行为可能会发生变化:
-
添加或移除节点。
-
节点发生故障或恢复。
连接请求之间的节点可用性发生变化对连接限值的影响较小。
就遵守连接限值而言,当节点在连接请求之间发生故障或恢复时,不会产生重大影响。无需执行特别操作来处理此问题。但是,如果节点发生故障,其活动会话将退出且群集中的其他节点也会删除自己的会话。这将释放连接。查询可能会挂起,在这种情况下,会话被阻止合乎情理且符合预期。