vertica rebalance优化

本文翻译整理自:优化rebalancing

vertica rebalance的介绍内容分为两部分,其中对于rebalance的基础介绍,可参考之前的博文《vertica集群增加节点(扩容)》,该博文中的内容主要参考rebalance期间做了哪些工作

开始rebalance过程

rebalance过程需要与正在进行的查询共享计算机资源,并且需要在短时间内独占访问资源或锁。为避免可能发生的并发问题,请在加载任务少的时候安排rebalance。

加载期间可能发生的并发问题是:

  • 如果rebalance拥有COPY操作所需的锁,则COPY操作将超时。
  • 如果COPY拥有锁,则rebalance会暂停直到COPY完成。

您可以使用Vertica文档中描述的三种方式中的任何一种来开始rebalance:

  • 使用admintools工具重分布数据
  • 使用管理控制台重分布数据
  • 使用SQL函数重分布数据
监控rebalance

监视rebalance过程,以确保其顺利进行。以下各节介绍了用于监视重新平衡过程的技术。

监视表正在运行的rebalance

要监视Vertica重分布哪些表,请运行:

SELECT * FROM rebalance_table_status;

如果任何DML或DDL操作干扰了某些表的重新平衡,您会看到以下错误消息:

ERROR 3007: DDL statement interfered with this statement
监控Vertica系统表

rebalace期间,请检查以下系统表:

  • REBALANCE_TABLE_STATUS-对于每个数据库表,包含:

    • 已分离的数据量
    • 仍需要分离的数据量
  • REBALANCE_PROJECTION_STATUS-对于每个投影,包含:

    • 已分离的数据量
    • 仍需要分离的数据量
监视群集rebalance的查询

本节提供了示例查询,可帮助您监视群集上的rebalace操作。

监视正在运行的rebalance操作

以下查询提供有关当前正在运行的rebalance操作的信息:

  • 正在运行rebalance的节点
  • rebalance操作的会话ID
  • rebalance开始的时间。这可以使您了解rebalance需要多长时间。
  • 当前正在执行rebalance任务
=> SELECT node_name, session_id, session_start_timestamp, description
 FROM system_sessions
 WHERE session_type = 'REBALANCE_CLUSTER'
 AND is_active;
 node_name |    session_id    |   session_start_timestamp     |     description 
-----------+------------------+-------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   node001 | user-9956:0x2fb6 | 2016-02-11 21:36:16.045711-05 | Txn: a000000000b167 'RebalanceUnsegmentedTask'
   node001 | user-9956:0x2fb6 | 2016-02-11 21:36:16.045711-05 | Txn: a000000000b168 'CREATE PROJECTION public.dim7_node006 /*+basename(dim7),createtype(P)*/ ( a, b ) AS SELECT dim7.a, dim7.b FROM public.dim7 ORDER BY dim7.a, dim7.b UNSEGMENTED NODE node006; '
   node001 | user-9956:0x2fc0 |  2016-02-11 21:36:16.13772-05 | Txn: a000000000b16b 'Refresh: Evaluating which projection to refresh'
   node001 | user-9956:0x2fc0 |  2016-02-11 21:36:16.13772-05 | Txn: a000000000b16c 'Refresh: (Table: public.dim7) (Projection: public.dim7_node006)'
监视rebalance操作的总体进度

以下查询监视每个当前正在执行的rebalance操作的进度并返回:

  • 用于rebalance当前投影的方法。可能的值为:
    • 刷新
    • 复制
    • ELASTIC_CLUSTER
  • 该方法的状态
  • 投影数
=> SELECT rebalance_method Rebalance_method, Status, COUNT(*) AS Count
 FROM ( SELECT rebalance_method,
        CASE
        WHEN (
        separated_percent = 100
    AND transferred_percent = 100
        ) THEN 'Completed'
        WHEN (
               separated_percent <> 0
               and separated_percent <> 100
              )
           OR (
              transferred_percent <> 0
              AND transferred_percent <> 100
              ) THEN 'In Progress'
              ELSE 'Queued'
              END AS  Status
        FROM rebalance_projection_status
        WHERE is_latest
      ) AS tab
 GROUP BY 1, 2
 ORDER BY 1, 2;
 Rebalance_method | Status      | Count
------------------+-------------+-------
 ELASTIC_CLUSTER  | Completed   | 8
 ELASTIC_CLUSTER  | In Progress | 2
 ELASTIC_CLUSTER  | Queued      | 2
 REPLICATE        | Completed   | 50
(4 rows)
监视未分段投影的rebalance活动

以下查询返回有关当前正在刷新的未分段投影的信息:

  • 当前正在执行的rebalance操作的会话ID
  • 正在刷新的未分段投影的名称
  • 刷新操作的当前状态
  • 用于刷新投影的方法
  • 刷新进行了多长时间。可能的阶段是:
    • 当前
    • 历史的
=> SELECT session_id, projection_name, refresh_status, refresh_method, refresh_phase
 FROM projection_refreshes
 WHERE refresh_method = 'rebalance'
 AND is_executing; 
 session_id       | projection_name | refresh_status | refresh_method | refresh_phase
------------------+-----------------+----------------+----------------+---------------
 user-9956:0x8cf0 | dim2_node004    | refreshing     | rebalance      | current
 user-9956:0x8d24 | dim2_node005    | refreshing     | rebalance      | historical
 user-9956:0x8d25 | dim2_node006    | refreshing     | rebalance      | historical
(3 rows)
监视分段投影的rebalance活动

以下查询返回有关当前正在刷新的分段投影的信息:

  • 投影名称
  • 用于刷新投影的方法
  • 分离的ROS容器百分比
  • 转移到目标节点的ROS容器的百分比
=> SELECT projection_name, rebalance_method, separated_percent, transferred_percent
 FROM rebalance_projection_status
 WHERE rebalance_method = 'ELASTIC_CLUSTER'
 AND (
 separated_percent <> 0
 AND separated_percent <> 100
 )
 OR (
 transferred_percent <> 0
 AND transferred_percent <> 100
 )
 AND is_latest;
 projection_name | rebalance_method | separated_percent | transferred_percent
-----------------+------------------+-------------------+---------------------
        fact5_b1 |  ELASTIC_CLUSTER |            100.00 | 13.23
        fact4_b1 |  ELASTIC_CLUSTER |             78.77 | 0.00
        fact5_b0 |  ELASTIC_CLUSTER |            100.00 | 13.63
(3 rows)
监视rebalance完成的投影所花费的时间

以下查询为您提供了rebalance每个投影所花费的时间的信息:

  • 运行rebalance的节点
  • schema名称
  • 投影名称
  • rebalance操作的开始时间
  • rebalance该投影所花费的时间(以秒为单位)
rebalance和锁定竞争

如果在ETL作业运行时重新平衡群集,则可能存在争用锁的情况。此争用可能导致加载作业或重新平衡操作失败。

减少竞争

在重新平衡期间可能导致与元组移动器发生锁争用的数据库操作是:

  • delete
  • update
  • DROP_PARTION
  • SWAP_PARTITION_BETWEEN_TABLES
  • MOVE_PARTITION_TO_TABLE

以下各节介绍了三种诊断,计划和管理重新平衡操作以最小化竞争的方式:

  • 增加锁超时时间
  • 优先考虑重新平衡和元组移动器操作
  • 手动重新平衡表
增加锁超时时间

以下查询返回哪些特定事务持有锁定超过五分钟:

=> SELECT DISTINCT query_requests.transaction_id, statement_id, request
FROM dc_lock_releases JOIN query_requests USING (session_id)
WHERE time - grant_time > '5 min'
AND mode IN ('X','S')
AND object_name NOT LIKE 'ElasticCluster'
ORDER BY statement_id;
-[ RECORD 1 ]--+-----------------------------------------
transaction_id | 45035996273756069
statement_id   | 1
request        | UPDATE /*+label(UPDATE_u1), DIRECT*/ u1 SET c200 = c200 - 1 where C200 < 100;
-[ RECORD 2 ]--+-----------------------------------------
transaction_id | 45035996273756069
statement_id   | 2
request        | commit;
(2 rows)

为了避免竞争这些事务,您可以执行以下操作之一:

  • 在与ETL作业不冲突的时间重新安排rebalance。
  • 增加LockTimeout参数,以便在rebalance集群时ETL作业不会超时:
=> SELECT GET_CONFIG_PARAMETER('locktimeout');
GET_CONFIG_PARAMETER
----------------------
 300
(1 row)
=> SELECT SET_CONFIG_PARAMETER('LockTimeOut, 600)
SET_CONFIG_PARAMETER
----------------------------
Parameter set successfully
(1 row)

重新平衡完成后,请记住将LockTimeout参数重置为其先前的值。

优先考虑重新平衡和元组移动器操作

假设DML作业尝试访问重新平衡已锁定的表。默认情况下,DML操作获取到锁,取消再平衡。五分钟后,重新平衡将继续尝试访问表并完成重新平衡。

如果希望重新平衡不间断运行,请通过将DMLCancelTM配置参数设置为false来优先考虑重新平衡过程。使用此设置,DML作业无法获得正在进行的重新平衡的锁定。

要设置DMLCancelTM并开始重新平衡,请执行以下操作:

=> SELECT SET_CONFiG_PARAMETER('DMLCancelTM',false);
....
=> SELECT REBALANCE_CLUSTER();
....

如果您的DML任务很重要,请不要将DMLCancelTM的值更​​改为false以进行重新平衡。将DMLCancelTM设置为true可以运行DML作业。

考虑在与关键DML作业不冲突的时候运行重新平衡。重新平衡完成后,请始终将DMLCancelTM设置为true。

=> SELECT SET_CONFiG_PARAMETER('DMLCancelTM', true);
手动重新平衡表

如果您有很多表并且需要几个晚上或周末来重新平衡群集,则可以在每个晚上或周末手动重新平衡固定数量的表。

您可以一次手动重新平衡一个或多个表。为避免在手动重新平衡期间发生争用,请确保没有ETL作业正在运行。

要重新平衡表,请调用REBALANCE_TABLE函数:

=> SELECT REBALANCE_TABLE('t0';

要找出哪些表已重新平衡,正在处理中的平衡表或尚未重新平衡的表,请运行以下查询:

=> SELECT table_name,
   CASE
   WHEN separated_percent + transferred_percent = 200 THEN 'REBALANCED'
   WHEN (separated_percent + transferred_percent) < 200
   AND (separated_percent + transferred_percent) > 0
   THEN 'REBALANCING' ELSE 'NOT REBALANCED YET'
   END status
   FROM rebalance_table_status WHERE is_latest;
 table_name | case
------------+----------------
         t0 | REBALANCED
         t1 | NOT REBALANCED YET
         t2 | REBALANCING
(3 rows)
重新平衡期间的竞争错误

重新平衡期间可能会发生几种争用错误,其中包括以下内容,以下各节将对此进行讨论:

  • DDL statement interfered with this statement. Unavailable: lock table for query - Locking failure
  • Staging table and target table do not match: Projections definition mismatch
  • Unavailable: [Txn 0xa0000000010113] S lock table - timeout error Timed out
更改架构

重新平衡过程中,其他作业可能执行以下操作:

  • 添加或删除列
  • 添加或删除投影
  • 交换或移动分区

重新平衡时,您可能会看到锁定错误。当另一个作业尝试锁定已由重新平衡操作锁定的表时,将发生此错误:

ERROR 3007: DDL statement interfered with this statement
ERROR 5157: Unavailable: lock table for query - Locking failure: Timed out X locking
Table:public.t0. T held by [user condor (RebalanceElasticTask)]. Your current transaction isolation
level is SERIALIZABLE
交换分区

如果您尝试在两个表之间交换分区,一个已经重新平衡,另一个没有重新平衡,则会看到以下错误:

=> SELECT SWAP_PARTITIONS_BETWEEN_TABLES('t0', 1, 1, 't1');
ERROR 7121: Staging table and target table do not match: Projections definition mismatch

您只能在两个都已重新平衡或都没有重新平衡的表之间交换分区。

获取有关争用错误的信息

如果由于错误或锁争用导致重新平衡失败,则要获取有关错误的信息,请运行以下查询:

=> SELECT time, session_id, error_level, node_name, log_message
   FROM dc_errors WHERE session_id IN
      (SELECT DISTINCT session_id
       FROM dc_session_starts
       WHERE session_type = 'REBALANCE_CLUSTER'
       ) 
   ORDER BY time DESC;
-[RECORD 1]-------------------------------
time        | 2016-03-05 10:47:08.517557-05
session_id  | eng-g9-046.verticac-2421955:0xad43
error_level | 20
node_name   | node001
log_message | Unavailable: [Txn 0xa0000000010113] S lock table - timeout error Timed out S locking
Table:public.t1. I held
重新平衡错误后重新启动

如果重新平衡由于错误而失败或被DML操作取消,Vertica将尝试在300秒(5分钟)后重新运行重新平衡。这意味着Vertica等待5分钟,然后尝试重新启动重新平衡。

=> SELECT LIST_SERVICES('TM');
                    list_services
------------------------------------------------------------------------------------
Service: 'RebalanceCluster' is enabled , interval 300 second(s)
重新平衡后

重新平衡完成后,请检查以下内容:

  • 重新平衡是否成功完成?
  • K-safety正确吗?
  • 基准性能是多少?
成功或失败

如果在重新平衡数据库时发生故障,则可以再次重新平衡。如果故障原因已解决,则重新平衡操作将从失败的地方继续。但是,失败的数据重新平衡可能导致Vertica无法自动删除过时的投影。
要找到任何此类投影,请查询V_CATALOG.PROJECTIONS系统表,如下所示:

=> SELECT projection_name, anchor_table_name, is_prejoin, is_up_to_date
   FROM projections WHERE is_up_to_date = FALSE;

要删除过时的投影,请使用DROP PROJECTION SQL命令。

使用Vertica工具监控系统性能

Vertica提供了两种工具来监视系统性能。但是,它们会严重影响系统性能,因此不要在重新平衡期间运行它们:

  • vioperf:测量硬盘驱动器的速度和一致性。
  • vnetperf:测量节点之间的网络延迟和吞吐量。
    添加节点后,请使用这些工具验证新扩展的群集的性能。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值