本文翻译整理自:优化rebalancing
vertica rebalance的介绍内容分为两部分,其中对于rebalance的基础介绍,可参考之前的博文《vertica集群增加节点(扩容)》,该博文中的内容主要参考rebalance期间做了哪些工作。
rebalance过程需要与正在进行的查询共享计算机资源,并且需要在短时间内独占访问资源或锁。为避免可能发生的并发问题,请在加载任务少的时候安排rebalance。
加载期间可能发生的并发问题是:
您可以使用Vertica文档中描述的三种方式中的任何一种来开始rebalance:
监视rebalance过程,以确保其顺利进行。以下各节介绍了用于监视重新平衡过程的技术。
要监视Vertica重分布哪些表,请运行:
SELECT * FROM rebalance_table_status;
如果任何DML或DDL操作干扰了某些表的重新平衡,您会看到以下错误消息:
ERROR 3007: DDL statement interfered with this statement
rebalace期间,请检查以下系统表:
REBALANCE_TABLE_STATUS-对于每个数据库表,包含:
REBALANCE_PROJECTION_STATUS-对于每个投影,包含:
本节提供了示例查询,可帮助您监视群集上的rebalace操作。
以下查询提供有关当前正在运行的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操作的进度并返回:
=> 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)
以下查询返回有关当前正在刷新的未分段投影的信息:
=> 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)
以下查询返回有关当前正在刷新的分段投影的信息:
=> 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每个投影所花费的时间的信息:
如果在ETL作业运行时重新平衡群集,则可能存在争用锁的情况。此争用可能导致加载作业或重新平衡操作失败。
在重新平衡期间可能导致与元组移动器发生锁争用的数据库操作是:
以下各节介绍了三种诊断,计划和管理重新平衡操作以最小化竞争的方式:
以下查询返回哪些特定事务持有锁定超过五分钟:
=> 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)
为了避免竞争这些事务,您可以执行以下操作之一:
=> 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)
重新平衡期间可能会发生几种争用错误,其中包括以下内容,以下各节将对此进行讨论:
重新平衡过程中,其他作业可能执行以下操作:
重新平衡时,您可能会看到锁定错误。当另一个作业尝试锁定已由重新平衡操作锁定的表时,将发生此错误:
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)
重新平衡完成后,请检查以下内容:
如果在重新平衡数据库时发生故障,则可以再次重新平衡。如果故障原因已解决,则重新平衡操作将从失败的地方继续。但是,失败的数据重新平衡可能导致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提供了两种工具来监视系统性能。但是,它们会严重影响系统性能,因此不要在重新平衡期间运行它们: