はじめに
Verticaで冗長化構成にしている場合、障害等でノードが停止し再起動すると、以下のような順番で停止したノードのステータスが遷移します。本稿では、障害からの復旧時、リカバリの状況を確認する方法を解説します。※ノードが停止中に反映できなかったデータをコピーするため、一般的に「RECOVERING」の状態が最も時間がかかります。
[ステータスについて]
ステータス | 説明 |
---|---|
DOWN | ノードは停止中の状態です。ノードを再起動した場合、Spreadデーモンを再起動します。また、ディスク上のカタログを読み込み、カタログで指定されたデータファイルをチェックします。 |
INITIALIZING | ノードは初期化中の状態です。Verticaのクラスタに参加し、未実行のカタログイベントをチェックして再実行します。 |
RECOVERING | ノードはリカバリ中の状態です。リカバリが必要なテーブル一覧を作成し、テーブルのリカバリを実行します。 |
READY | ノードは起動準備が完了した状態です。 |
UP | ノードは起動した状態です。すべてのデータベース上の処理に参加して、実行します。 |
リカバリ状況の確認
【1】停止しているノードを起動します。以下の実行例では、ノード1が停止しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[dbadmin@server02 ~]$ admintools -t list_allnodes Node | Host | State | Version | DB -------------------+-----------+-------+-----------------+-------- v_testdb_node0001 | 10.0.0.25 | DOWN | vertica-9.2.0.6 | testdb v_testdb_node0002 | 10.0.0.26 | UP | vertica-9.2.0.6 | testdb v_testdb_node0003 | 10.0.0.27 | UP | vertica-9.2.0.6 | testdb [dbadmin@server02 ~]$ admintools -t restart_node -s v_testdb_node0001 -d testdb Info: no password specified, using none *** Restarting nodes for database testdb *** Restarting host [10.0.0.25] with catalog [v_testdb_node0001_catalog] Issuing multi-node restart Starting nodes: v_testdb_node0001 (10.0.0.25) Starting Vertica on all nodes. Please wait, databases with a large catalog may take a while to initialize. Node Status: v_testdb_node0001: (DOWN) v_testdb_node0003: (UP) Node Status: v_testdb_node0001: (DOWN) v_testdb_node0003: (UP) Node Status: v_testdb_node0001: (DOWN) v_testdb_node0003: (UP) Node Status: v_testdb_node0001: (DOWN) v_testdb_node0003: (UP) : |
【2】ノードのステータスを確認します。ノード1のステータスが「INITIALIZING」に遷移しました。
1 2 3 4 5 6 |
[dbadmin@server02]$ admintools -t list_allnodes Node | Host | State | Version | DB -------------------+-----------+--------------+-----------------+-------- v_testdb_node0001 | 10.0.0.25 | INITIALIZING | vertica-9.2.0.6 | testdb v_testdb_node0002 | 10.0.0.26 | UP | vertica-9.2.0.6 | testdb v_testdb_node0003 | 10.0.0.27 | UP | vertica-9.2.0.6 | testdb |
【3】ノードのステータスが「DOWN」または「INITIALIZING」の場合は、tailコマンドを「startup.log」に実行することで、リカバリの進捗状況を確認できます。「startup.log」は、リカバリが実行されているノードで確認してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[dbadmin@server01]$ tail -f /home/dbadmin/testdb/v_testdb_node0001_catalog/startup.log ... { "node" : "v_testdb_node0001", "stage" : "Connecting to Spread", "text" : "Connecting to spread /opt/vertica/spread/tmp/4803", "timestamp" : "2019-04-12 15:07:47.920" } { "node" : "v_testdb_node0001", "stage" : "Waiting for Cluster Invite", "text" : "Prepare to be invited", "timestamp" : "2019-04-12 15:07:57.000" } ... |
※後述の「TABLE_RECOVERY_STATUS」、「TABLE_RECOVERIES」、「PROJECTION_RECOVERIES」システムテーブルは、ノードのステータスが「DOWN」または「INITIALIZING」の場合は進捗状況を確認できません。
【4】ノードのステータスを確認します。ノード1のステータスが「RECOVERING」に遷移しました。
1 2 3 4 5 6 |
[dbadmin@server02 ~]$ admintools -t list_allnodes Node | Host | State | Version | DB -------------------+-----------+------------+-----------------+-------- v_testdb_node0001 | 10.0.0.25 | RECOVERING | vertica-9.2.0.6 | testdb v_testdb_node0002 | 10.0.0.26 | UP | vertica-9.2.0.6 | testdb v_testdb_node0003 | 10.0.0.27 | UP | vertica-9.2.0.6 | testdb |
【5】ノードのステータスが「RECOVERING」に遷移した場合は、システムテーブルを使用して、進捗状況を確認します。
【5】-①リカバリのサマリを確認する場合は、次のSQLを実行します。
SELECT * FROM TABLE_RECOVERY_STATUS;
[TABLE_RECOVERY_STATUS]項目名 | 説明 |
---|---|
NODE_NAME | ノード名 |
NODE_RECOVERY_START_TIME | 開始時刻 |
RECOVER_EPOCH | リカバリ対象のエポック |
RECOVERING_TABLE_NAME | 現在リカバリを実行中のテーブル名 |
TABLES_REMAIN | ノード上でリカバリが必要な残りのテーブル数 ※リカバリが進行すると、この数は減少していく |
IS_RUNNING | 現在リカバリを実行中かどうか |
[実行例]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#リカバリ実行中の状態 dbadmin=> SELECT * FROM TABLE_RECOVERY_STATUS; node_name | node_recovery_start_time | recover_epoch | recovering_table_name | tables_remain | is_running -------------------+-------------------------------+---------------+---------------------------------------------------------------+---------------+------------ v_testdb_node0001 | 2019-04-12 15:08:01.751161+09 | 105 | public.t_p1; public.t_p2; public.t_p3; public.t4; public.t5; | 7 | t v_testdb_node0002 | | | | 0 | f v_testdb_node0003 | | | | 0 | f (3 rows) #リカバリ完了後の状態 dbadmin=> SELECT * FROM TABLE_RECOVERY_STATUS; node_name | node_recovery_start_time | recover_epoch | recovering_table_name | tables_remain | is_running -------------------+-------------------------------+---------------+-----------------------+---------------+------------ v_testdb_node0001 | 2019-04-12 15:08:01.751161+09 | 105 | | 0 | f v_testdb_node0002 | | | | 0 | f v_testdb_node0003 | | | | 0 | f (3 rows) |
【5】-②テーブルのリカバリを確認する場合は、次のSQLを実行します。
SELECT * FROM TABLE_RECOVERIES;
[TABLE_RECOVERIES]項目名 | 説明 |
---|---|
NODE_NAME | ノード名 |
TABLE_OID | テーブルのOID |
TABLE_NAME | テーブル名 |
STATUS | テーブルのステータス、値は以下のいずれか。リカバリが開始前のテーブルはNULLが出力される。 ・RECOVERED:リカバリ完了 ・RECOVERING:リカバリ中 ・ERROR_RETRY:リカバリ失敗 |
PHASE | リカバリのフェーズ、値は以下のいずれか。 ・Historical:「DOWN」または「INITIALIZING」ステータス時に見逃した可能性のある履歴データをコピーする。 (ロック=未発生) ・Historical Dirty:リカバリが開始された後で、コミットされたDMLトランザクションを全てリカバリしなおす。(ロック=未発生) ・Current Replay Delete:リカバリ中に発生した削除トランザクションを全て再生する。(ロック="T"発生) ・Aggregate Projections:アグリゲートプロジェクションをリカバリする。(ロック="T"発生) |
THREAD_ID | リカバリを実行したスレッドID |
START_TIME | 開始時刻 |
END_TIME | 完了時刻 |
RECOVER_PRIORITY | リカバリを実行するテーブルの優先度 |
RECOVER_ERROR | リカバリが失敗した場合のエラー内容 |
IS_HISTORICAL | 「t」の場合は、現在のプロセスのリカバリ情報が含まれる。 |
[実行例]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#リカバリ実行中の状態 dbadmin=> SELECT * FROM TABLE_RECOVERIES; node_name | table_oid | table_name | status | phase | thread_id | start_time | end_time | recover_priority | recover_error | is_historical -------------------+-------------------+-------------+------------+------------+--------------+-------------------------------+----------+----------------------+---------------+--------------- v_testdb_node0001 | 54043195528574598 | public.t_p1 | recovering | historical | 7f5b1d7fa700 | 2019-04-12 15:08:06.568041+09 | | 1000 | | f v_testdb_node0001 | 54043195528574600 | public.t_p2 | recovering | historical | 7f5b1cff9700 | 2019-04-12 15:08:06.568105+09 | | 500 | | f v_testdb_node0001 | 54043195528574602 | public.t_p3 | recovering | historical | 7f5b1dffb700 | 2019-04-12 15:08:06.568254+09 | | 1 | | f v_testdb_node0001 | 54043195528574604 | public.t4 | recovering | historical | 7f5b13fff700 | 2019-04-12 15:08:06.568469+09 | | -9223372036854775807 | | f v_testdb_node0001 | 54043195528574606 | public.t5 | recovering | historical | 7f5b137fe700 | 2019-04-12 15:08:06.568751+09 | | -9223372036854775807 | | f (5 rows) #リカバリ完了後の状態 dbadmin=> SELECT * FROM TABLE_RECOVERIES; node_name | table_oid | table_name | status | phase | thread_id | start_time | end_time | recover_priority | recover_error | is_historical -------------------+-------------------+-------------+-----------+-------+--------------+-------------------------------+-------------------------------+----------------------+---------------+--------------- v_testdb_node0001 | 54043195528574600 | public.t_p2 | recovered | | 7f5b1cff9700 | 2019-04-12 15:08:06.568105+09 | 2019-04-12 15:11:21.328437+09 | 500 | | t v_testdb_node0001 | 54043195528574598 | public.t_p1 | recovered | | 7f5b1d7fa700 | 2019-04-12 15:08:06.568041+09 | 2019-04-12 15:11:21.981358+09 | 1000 | | t v_testdb_node0001 | 54043195528574606 | public.t5 | recovered | | 7f5b137fe700 | 2019-04-12 15:08:06.568751+09 | 2019-04-12 15:11:22.182894+09 | -9223372036854775807 | | t v_testdb_node0001 | 54043195528574604 | public.t4 | recovered | | 7f5b13fff700 | 2019-04-12 15:08:06.568469+09 | 2019-04-12 15:11:22.780779+09 | -9223372036854775807 | | t v_testdb_node0001 | 54043195528578062 | public.t6 | recovered | | 7f5b1d7fa700 | 2019-04-12 15:11:22.271102+09 | 2019-04-12 15:11:24.712834+09 | -9223372036854775807 | | t v_testdb_node0001 | 54043195528574602 | public.t_p3 | recovered | | 7f5b1dffb700 | 2019-04-12 15:08:06.568254+09 | 2019-04-12 15:11:50.740101+09 | 1 | | t v_testdb_node0001 | 54043195528578064 | public.t7 | recovered | | 7f5b1dffb700 | 2019-04-12 15:11:50.777985+09 | 2019-04-12 15:11:51.865017+09 | -9223372036854775807 | | t (7 rows) |
【5】-③プロジェクションのリカバリを確認する場合は、次のSQLを実行します。
SELECT * FROM PROJECTION_RECOVERIES;
[PROJECTION_RECOVERIES]項目名 | 説明 |
---|---|
NODE_NAME | ノード名 |
PROJECTION_ID | プロジェクションID |
PROJECTION_NAME | プロジェクション名 |
TRANSACTION_ID | トランザクションID |
STATEMENT_ID | 現在実行中のステートメントID。NULLは、現在ステートメントが実行されていないことを示す。 TRANSACTION_IDとSTATEMENT_IDの組み合わせで、セッション内のステートメントを一意に識別できる。 |
METHOD | Verticaが選択したリカバリ方法。値は以下のいずれか。 ・incremental ・incremental-replay-delete ・split ・recovery-by-container |
STATUS | プロジェクションのリカバリ状況。値は以下のいずれか。 ・queued ・running ・finished ・ignored ・error-retry ・error-fatal |
PROGRESS | リカバリ・タスクが完了している割合([0~100]の範囲)。タスクが完了後の値は、NULLを出力する。 |
DETAIL | リカバリ計画のタイプによって値は異なり、以下のいずれか。完了後、NULLが出力される。 ・General recovery plans:計画(スキャン、ソート、書込み)の進捗状況(%) ・Recovery-by-container plans:「CopyStorage:総バイト数/コピーされたバイト数」 ・Replay delete plans:「Delete:Replay deleteの合計数/Replay deleteされた数」 |
START_TIME | 開始時刻 |
END_TIME | 完了時刻 |
RUNTIME_PRIORITY | リソースプール内で処理を実行するために、割り当てるリソース(CPU、I/O)のサイズを示す。値は以下のいずれか。 ・HIGH ・MEDIUM ・LOW |
[実行例]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#リカバリ実行中の状態 dbadmin=> SELECT * FROM PROJECTION_RECOVERIES; node_name | projection_id | projection_name | transaction_id | statement_id | method | status | progress | detail | start_time | end_time | runtime_priority -------------------+-------------------+-----------------+-------------------+--------------+-----------------------+----------+----------+--------------------------+-------------------------------+-------------------------------+------------------ v_testdb_node0001 | 49539595901204146 | public.t_p1_b1 | 45035996273705037 | 1 | recovery-by-container | running | | CopyStorage:4019673101/0 | 2019-04-12 15:08:06.579123+09 | | MEDIUM v_testdb_node0001 | 49539595901204482 | public.t5_b1 | 45035996273705039 | 1 | recovery-by-container | running | | CopyStorage:4025510423/0 | 2019-04-12 15:08:06.579528+09 | | MEDIUM v_testdb_node0001 | 49539595901204230 | public.t_p2_b1 | 45035996273705040 | 1 | recovery-by-container | running | | CopyStorage:4028087903/0 | 2019-04-12 15:08:06.579436+09 | | MEDIUM v_testdb_node0001 | 49539595901204314 | public.t_p3_b1 | 45035996273705082 | 1 | recovery-by-container | running | | CopyStorage:756296184/0 | 2019-04-12 15:08:52.547789+09 | | HIGH v_testdb_node0001 | 49539595901204188 | public.t_p2_b0 | 45035996273705041 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.579969+09 | 2019-04-12 15:08:52.727366+09 | v_testdb_node0001 | 49539595901204398 | public.t4_b1 | 45035996273705042 | 1 | recovery-by-container | running | | CopyStorage:4004526404/0 | 2019-04-12 15:08:06.585342+09 | | MEDIUM v_testdb_node0001 | 49539595901204104 | public.t_p1_b0 | 45035996273705036 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.580029+09 | 2019-04-12 15:08:52.970547+09 | v_testdb_node0001 | 49539595901204440 | public.t5_b0 | 45035996273705038 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.579997+09 | 2019-04-12 15:08:52.778221+09 | v_testdb_node0001 | 49539595901204356 | public.t4_b0 | 45035996273705043 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.585373+09 | 2019-04-12 15:08:52.928753+09 | v_testdb_node0001 | 49539595901204272 | public.t_p3_b0 | 45035996273705044 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.585451+09 | 2019-04-12 15:08:52.545218+09 | (10 rows) #リカバリ完了後の状態 dbadmin=> SELECT * FROM PROJECTION_RECOVERIES; node_name | projection_id | projection_name | transaction_id | statement_id | method | status | progress | detail | start_time | end_time | runtime_priority -------------------+-------------------+-----------------+-------------------+--------------+-----------------------+----------+----------+--------+-------------------------------+-------------------------------+------------------ v_testdb_node0001 | 54043195528578144 | public.t7_b1 | 0 | | | ignored | | | | 2019-04-12 15:11:51.862788+09 | v_testdb_node0001 | 54043195528578120 | public.t7_b0 | 0 | | | ignored | | | | 2019-04-12 15:11:51.862756+09 | v_testdb_node0001 | 49539595901204188 | public.t_p2_b0 | 0 | | | ignored | | | | 2019-04-12 15:11:21.326003+09 | v_testdb_node0001 | 49539595901204230 | public.t_p2_b1 | 0 | | | ignored | | | | 2019-04-12 15:11:21.326025+09 | v_testdb_node0001 | 49539595901204104 | public.t_p1_b0 | 0 | | | ignored | | | | 2019-04-12 15:11:21.979298+09 | v_testdb_node0001 | 49539595901204146 | public.t_p1_b1 | 0 | | | ignored | | | | 2019-04-12 15:11:21.979316+09 | v_testdb_node0001 | 49539595901204440 | public.t5_b0 | 0 | | | ignored | | | | 2019-04-12 15:11:21.979371+09 | v_testdb_node0001 | 49539595901204482 | public.t5_b1 | 0 | | | ignored | | | | 2019-04-12 15:11:21.979398+09 | v_testdb_node0001 | 49539595901204356 | public.t4_b0 | 0 | | | ignored | | | | 2019-04-12 15:11:22.77903+09 | v_testdb_node0001 | 49539595901204398 | public.t4_b1 | 0 | | | ignored | | | | 2019-04-12 15:11:22.779053+09 | v_testdb_node0001 | 54043195528578068 | public.t6_b0 | 0 | | | ignored | | | | 2019-04-12 15:11:24.710685+09 | v_testdb_node0001 | 54043195528578092 | public.t6_b1 | 0 | | | ignored | | | | 2019-04-12 15:11:24.710701+09 | v_testdb_node0001 | 49539595901204272 | public.t_p3_b0 | 0 | | | ignored | | | | 2019-04-12 15:11:50.737441+09 | v_testdb_node0001 | 49539595901204314 | public.t_p3_b1 | 0 | | | ignored | | | | 2019-04-12 15:11:50.737474+09 | v_testdb_node0001 | 49539595901204230 | public.t_p2_b1 | 45035996273705040 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.579436+09 | 2019-04-12 15:11:21.276651+09 | v_testdb_node0001 | 49539595901204188 | public.t_p2_b0 | 45035996273705041 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.579969+09 | 2019-04-12 15:08:52.727366+09 | v_testdb_node0001 | 49539595901204398 | public.t4_b1 | 45035996273705042 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.585342+09 | 2019-04-12 15:11:22.270956+09 | v_testdb_node0001 | 49539595901204314 | public.t_p3_b1 | 45035996273705082 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:52.547789+09 | 2019-04-12 15:11:50.628016+09 | v_testdb_node0001 | 54043195528578068 | public.t6_b0 | 45035996273705197 | 1 | recovery-by-container | finished | | | 2019-04-12 15:11:23.051634+09 | 2019-04-12 15:11:24.511665+09 | v_testdb_node0001 | 54043195528578092 | public.t6_b1 | 45035996273705198 | 1 | recovery-by-container | finished | | | 2019-04-12 15:11:23.008166+09 | 2019-04-12 15:11:24.421599+09 | v_testdb_node0001 | 49539595901204104 | public.t_p1_b0 | 45035996273705036 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.580029+09 | 2019-04-12 15:08:52.970547+09 | v_testdb_node0001 | 49539595901204146 | public.t_p1_b1 | 45035996273705037 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.579123+09 | 2019-04-12 15:11:21.751424+09 | v_testdb_node0001 | 49539595901204440 | public.t5_b0 | 45035996273705038 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.579997+09 | 2019-04-12 15:08:52.778221+09 | v_testdb_node0001 | 49539595901204482 | public.t5_b1 | 45035996273705039 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.579528+09 | 2019-04-12 15:11:21.536074+09 | v_testdb_node0001 | 49539595901204356 | public.t4_b0 | 45035996273705043 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.585373+09 | 2019-04-12 15:08:52.928753+09 | v_testdb_node0001 | 49539595901204272 | public.t_p3_b0 | 45035996273705044 | 1 | recovery-by-container | finished | | | 2019-04-12 15:08:06.585451+09 | 2019-04-12 15:08:52.545218+09 | v_testdb_node0001 | 54043195528578144 | public.t7_b1 | 45035996273705234 | 1 | recovery-by-container | finished | | | 2019-04-12 15:11:51.380671+09 | 2019-04-12 15:11:51.772275+09 | v_testdb_node0001 | 54043195528578120 | public.t7_b0 | 45035996273705233 | 1 | recovery-by-container | finished | | | 2019-04-12 15:11:51.337419+09 | 2019-04-12 15:11:51.602433+09 | (28 rows) |
【6】ノードのステータスを確認します。ノード1のステータスが「UP」に遷移しました。
※「READY」は、基本的に時間がかからずに終了します。
1 2 3 4 5 6 |
[dbadmin@server02]$ admintools -t list_allnodes Node | Host | State | Version | DB -------------------+-----------+-------+-----------------+-------- v_testdb_node0001 | 10.0.0.25 | UP | vertica-9.2.0.6 | testdb v_testdb_node0002 | 10.0.0.26 | UP | vertica-9.2.0.6 | testdb v_testdb_node0003 | 10.0.0.27 | UP | vertica-9.2.0.6 | testdb |
参考情報
TABLE_RECOVERY_STATUShttps://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/SystemTables/MONITOR/TABLE_RECOVERY_STATUS.htm
TABLE_RECOVERIES
https://www.vertica.com/docs/9.2.x/HTML/index.htm#Authoring/SQLReferenceManual/SystemTables/MONITOR/TABLE_RECOVERIES.htm
PROJECTION_RECOVERIES
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/SystemTables/MONITOR/PROJECTION_RECOVERIES.htm
検証バージョンについて
この記事の内容はVertica 9.2で確認しています。更新履歴
2019/12/11 table_recovery_status.tables_remainの説明修正2019/04/25 本記事を公開