はじめに

Verticaは複数台構成でノードダウンが発生した場合、ノード復旧後は各ノード間でデータの整合性を保つために、リカバリが実行されます。Vertica7.1までは、リカバリ実行中は全てのテーブルに対して一度にロックをかける動作だったので、DDL/DML(Delete, Update, Merge) は長時間ロックで待たされることがありました。Vertica7.2からは、優先度に従ってテーブル単位でリカバリが実行できるようになったため、リカバリが完了したテーブルから、随時 DDL/DMLを実行できるようになりました。

テーブル単位リカバリ_7.1
テーブル単位リカバリ2_7.2

リカバリの優先度について

優先的にリカバリを実行したいテーブルが存在する場合は、「優先度」を明示的に指定する必要があります。
以下の表は、テーブルがリカバリされる順番を示しており、①→②の順で実行されます。
リカバリの順番説明
①優先度が指定された順各テーブルに優先度を指定した場合は、優先度に従ってリカバリが実行されます。
大きい値を指定したテーブルは、優先的にリカバリが実行されます。
例えば、各テーブルに対して「t_p1=1000,t_p2=500,t_p3=1」の優先度を指定した場合は「t_p1→t_p2→t_p3」の順番でリカバリが実行されます。
②作成した日時が古い順「優先度を指定していないテーブル」や「優先度が同一のテーブル」は、OIDが小さい順にリカバリが実行されます。
OIDはテーブルを作成した順番にカウントアップし、各テーブルに一意の番号が割り振られます。
例えば、テーブルを「t4→t5→t6」の順で作成した場合は、OIDは「45035996273840180→45035996273840182→45035996273840184」のように割り振られます。
この場合、「t4→t5→t6」の順番でリカバリが実行されます。


コマンド構文

テーブルの優先度を指定する場合は、以下の SQL を実行します。
SELECT set_table_recover_priority(’テーブル名’,’優先度’);

[set_table_recover_priority]
項目説明
テーブル名テーブル名を指定します。
優先度テーブル名の優先度を指定します。値は「-9223372036854775807~9223372036854775807」の範囲で指定可能です。


実行例

優先度が指定されたテーブルについて、実行例をもとにリカバリの動作を解説いたします。

【1】リカバリ対象のテーブル一覧を確認します。


【2】各テーブルにリカバリの優先度を指定します。以下の例は、優先度を「t_p1=1000, t_p2=500, t_p3=1」に指定しています。


【3】優先度を指定したテーブルを確認します。以下の例は、「t4, t5, t6」に優先度は指定していません。


【4】リカバリの同時実行数を変更します。リカバリが実行された順番を簡単に識別するために「MAXCONCURRENCY=1」(※)を設定します。「MAXCONCURRENCY=1」に設定することで、各テーブルのリカバリがシリアルに実行されます。
(※)デフォルト値の場合は、同時に複数のテーブルに対して、リカバリが実行されます。


【5】データベースのデータ領域を削除することで、1号機をDOWN状態にします。


【6】1号機を起動して、リカバリを自動実行させます。


【7】「table_recoveries」システムテーブルで、各テーブルのリカバリ状況を確認します。「start_time」と「end_time」の時刻から、「t_p1→t_p2→t_p3→t4→t5→t6」の順番で、リカバリされたことが確認できます。


参考情報

・Verticaノードのクラスタ
http://vertica-tech.ashisuto.co.jp/node_cluster/

検証バージョンについて

この記事の内容はVertica 9.2で確認しています。

更新履歴

2019/05/10 テーブル優先度の実行例を修正、リカバリ状況の確認方法を別記事に統合
2016/02/22 本記事を公開