排空客户端连接

仅限 Eon 模式

排空子群集中的客户端连接会将子群集中的所有节点标记为正在排空,从而为关闭子群集做好准备。来自现有用户会话的工作继续排空节点,但节点拒绝新的客户端连接,并且会从负载均衡操作中排除。如果客户端尝试连接到正在排空的节点,它们会收到指示节点处于排空状态的错误。负载均衡操作不包括正在排空的节点,因此只有在负载均衡策略中的所有节点都在排空时,选择加入连接负载均衡的客户端才会收到连接错误。您无需更改任何连接负载均衡配置即可使用此功能。dbadmin 仍然可以连接到正在排空的节点。

要在关闭子群集之前排空客户端连接,可以使用 SHUTDOWN_WITH_DRAIN 函数。此函数执行正常关闭以将子群集标记为正在排空,直到现有连接完成其工作并关闭或达到用户指定的超时时间。当满足这些条件之一时,此函数继续关闭子群集。Vertica 提供了多个可用于独立执行 SHUTDOWN_WITH_DRAIN 过程中每个步骤的元函数。您可以使用 START_DRAIN_SUBCLUSTER 函数将子群集标记为正在排空,然后在其连接关闭后使用 SHUTDOWN_SUBCLUSTER 函数关闭子群集。

您可以使用 CANCEL_DRAIN_SUBCLUSTER 函数将子群集中的所有节点标记为未在排空。一旦节点既处于 UP 状态又未在排空,该节点就会接受新的客户端连接。如果正在排空的子群集中的所有节点均已关闭,则其节点的排空状态会自动重置为未在排空。

您可以通过查询 DRAINING_STATUS 系统表来监控每个节点的排空状态以及客户端连接信息,例如每个节点上的活动用户会话数。

以下示例排空名为 analytics 的子群集,然后取消排空该子群集。

要将 analytics 子群集标记为正在排空,请使用负超时值调用 SHUTDOWN_WITH_DRAIN:

=> SELECT SHUTDOWN_WITH_DRAIN('analytics', -1);
NOTICE 0:  Draining has started on subcluster (analytics)

您可以通过查询 DRAINING_STATUS 系统表来确认子群集正在排空:

=> SELECT node_name, subcluster_name, is_draining FROM draining_status ORDER BY 1;
node_name          | subcluster_name    | is_draining
-------------------+--------------------+--------------
verticadb_node0001 | default_subcluster | f
verticadb_node0002 | default_subcluster | f
verticadb_node0003 | default_subcluster | f
verticadb_node0004 | analytics          | t
verticadb_node0005 | analytics          | t
verticadb_node0006 | analytics          | t

如果客户端尝试直接连接到正在排空的子群集中的节点,它们会收到以下错误消息:

$ /opt/vertica/bin/vsql -h noeIP --password password verticadb analyst
vsql: FATAL 10611:  New session rejected because subcluster to which this node belongs is draining connections

要取消 analytics 子群集的正常关闭,可以键入 Ctrl+C:

=> SELECT SHUTDOWN_WITH_DRAIN('analytics', -1);
NOTICE 0:  Draining has started on subcluster (analytics)
^CCancel request sent
ERROR 0:  Cancel received after draining started and before shutdown issued. Nodes will not be shut down. The subclusters are still in the draining state.
HINT:  Run cancel_drain_subcluster('') to restore all nodes to the 'not_draining' state

如上提示中所述,可以运行 CANCEL_DRAIN_SUBCLUSTER 将子群集中正在排空的节点的状态重置为未在排空:

=> SELECT CANCEL_DRAIN_SUBCLUSTER('analytics');
              CANCEL_DRAIN_SUBCLUSTER
--------------------------------------------------------
Targeted subcluster: 'analytics'
Action: CANCEL DRAIN

(1 row)

要确认子群集不再排空,可以再次查询 DRAINING_STATUS 系统表:

=> SELECT node_name, subcluster_name, is_draining FROM draining_status ORDER BY 1;
node_name          | subcluster_name    | is_draining
-------------------+--------------------+-------
verticadb_node0001 | default_subcluster | f
verticadb_node0002 | default_subcluster | f
verticadb_node0003 | default_subcluster | f
verticadb_node0004 | analytics          | f
verticadb_node0005 | analytics          | f
verticadb_node0006 | analytics          | f
(6 rows)