OpenText Analytics Database 旧Vertica

技術情報サイト

OpenText Analytics Database(旧Vertica)技術情報サイト

Epochの概要

公開日:
更新日:
アーキテクチャ
#トランザクション

はじめに

Verticaがトランザクション処理を扱う際に内部的な管理に使うEpoch(エポック)について紹介致します。

Epochとは

Epoch(エポック)は、Verticaが一貫性と原子性を提供するメカニズムです。
VerticaのトランザクションはEpochと呼ばれる数値で管理されています。
Epochはユニークな点をあらわす64ビットの数値です。

Epochの関連用語

Verticaを管理する中で頻繁に見かけるEpoch関連の用語がいくつかあります。
これらはVerticaを管理する上では必要な知識ですので以下に説明します。

項番用語説明
①CE
(Current Epoch)
現時点のEpochを意味します。
Current EpochはDMLコミット時に進みます。
②LGE
(Last Good Epoch)
手動リカバリを行う際に使われるもので、リカバリが可能な最も直近のEpoch番号です。
③AHM
(Ancient History Mark)
・AdvanceAHMIntervalパラメータに基づいて、AHMを自動的に進めます。
・PURGE処理をする時、AHMよりの前のデータがPURGEされます。
・AHMはクラスタ全体(全ノード)で一意。ノードがダウンしている時は、AHMは進みません。

上記の各Epochを時系列であらわすと以下のような図になります。

epoch

ここで、Epoch番号の進み方を見てみましょう。
以下の簡単なトランザクション処理を行い、各処理の合間にCurrent Epoch番号を確認する事で、Epoch番号の進み方を見てみます。

・SELECT処理
・DML処理(今回はINSERT処理でテストをします)
・コミット
・操作をする前のEpoch番号の確認
dbadmin=> SELECT GET_CURRENT_EPOCH();
 GET_CURRENT_EPOCH
-------------------
               923
(1 row)

・SELECT処理を行った後のEpoch番号の確認
dbadmin=> SELECT * FROM t1;
 col1 | col2
------+------
(0 rows)

dbadmin=> SELECT GET_CURRENT_EPOCH();
 GET_CURRENT_EPOCH
-------------------
               923
(1 row)

・DML処理(INSERT処理)を行った後のEpoch番号の確認
dbadmin=> INSERT INTO t1 VALUES(1,'aaa');
 OUTPUT
--------
      1
(1 row)

dbadmin=> SELECT GET_CURRENT_EPOCH();
 GET_CURRENT_EPOCH
-------------------
               923
(1 row)

・コミットを行った後のEpoch番号の確認
dbadmin=> COMMIT;
COMMIT

dbadmin=> SELECT GET_CURRENT_EPOCH();
 GET_CURRENT_EPOCH
-------------------
               924
(1 row)

実際にDML処理をコミットした場合にのみEpoch番号が進む様子が確認できます。

Epoch関連のパラメータ

Epochに関連するVerticaのパラメータがあります。
そのパラメータ一覧を以下に記載致します。

項番パラメータ名説明デフォルト値変更時の実行例
1AdvanceAHMIntervalVerticaの履歴を保存ステータスをチェックする頻度を指定します(秒指定)。

このパラメータはEpochMapIntervalよりも小さな値に設定する事はできません。
180(3分)ALTER DATABASE mydb SET AdvanceAHMInterval = '3600';
2EpochMapIntervalHistorical query(履歴クエリ)を有効にするために、Epochと時刻をマッピングする粒度を指定します。
AT TIME 'timestamp' SELECT...のHistorical query(履歴クエリ)が発行されると、
EpochMapIntervalで指定した値の時間内にEpoch番号にマッピングします。

この値を小さく設定すると、Epochの数を増やす事になります。
そのため、Verticaが保持するEpochの履歴数を制限するために、
HistoryRetentionTimeパラメータを減らす事を検討してください。
180(3分)ALTER DATABASE mydb SET EpochMapInterval = '300';
3HistoryRetentionTime参照用の履歴情報として削除済みのデータをどれくらい保持するかを指定します(秒指定)。
このパラメータに指定した時間を経過すると、削除済みのデータをPurgeする事ができるようになります。
HistoryRetentionEpochsを使って削除済みデータをPurgeしたい場合は、-1を設定してください。

デフォルトの0では、admintoolで「Roll Back Database to Last Good Epoch」を実行する事を防止します。
これは、AHMがCurrent Epochに近い状態であり、またAHMよりも過去のEpoch番号にロールバックする事を許可しないからです。

例えば、直近でロードしたデータを削除する方法としてロールバックオプションを使う運用をされる場合は、以下のように1日(86400秒)を指定する事をご検討ください。

ALTER DATABASE mydb SET HistoryRetentionTime = 86400;
0ALTER DATABASE mydb SET HistoryRetentionTime = '240';
4HistoryRetentionEpochsEpoch履歴の数を指定します。これによって、削除済みデータを保持する量が決まります。

特別な理由がない限り、Epoch番号で指定するのではなく、削除済みデータを保持する期間以上の値を指定する事が推奨されています。

2つのパラメータが指定された場合、HistoryRetentionTimeパラメータが優先されます。
両方のパラメータを-1に設定すると、すべての履歴情報が残ります。
-1(無効)ALTER DATABASE mydb SET HistoryRetentionEpochs = '40';

参考情報

Historical query(履歴クエリ)について

Historical query(履歴クエリ)とは、過去のデータを参照する事ができる機能です。
(スナップショットクエリとも呼ばれます)
この機能によって、クエリに過去のEpoch番号や過去の時刻を指定する事でその時点のデータを参照する事ができます。
ただし、参照できる過去のデータはAHMのEpoch番号以上である必要があります。
(AHMよりも古いデータは参照できません。)

Historical query(履歴クエリ)のSQL構文は以下の3種類があります。

AT TIME ‘timestamp’ SELECT…
AT EPOCH epoch_number SELECT…
AT EPOCH LATEST SELECT…

Tips

Epochに関するコマンドを紹介致します。

項番コマンド説明
1SELECT * FROM epochs;直近のEpoch番号(Latest Epoch)とその時刻を確認する
2SELECT GET_CURRENT_EPOCH();Current EpochのEpoch番号を確認する。
3SELECT GET_AHM_EPOCH();AHMのEpoch番号を確認する
4SELECT GET_AHM_TIME();AHMのEpoch番号に関連付けられた時刻を確認する
5SELECT GET_LAST_GOOD_EPOCH();LGE(LastGoodEpoch)に関連付けられたEpoch番号を確認する
6SELECT ADVANCE_EPOCH(integer);手動でEpoch番号を進める
(指定した整数が加算される)
7SELECT MAKE_AHM_NOW( [true] );・AHMを可能な限り大きい値に進める
・オプションのパラメーターをtrueに設定し、AHMを停止したノードのLGEより後に進める
・「true」を使う際の注意点
 停止していたノードがリカバリする際に、1からノードを再構築する必要が出てくる
8SELECT SET_AHM_EPOCH( epoch, [true]);希望のEpoch番号にAHMを設定する
9SELECT SET_AHM_TIME( time, [true]);希望の時刻にAHMを設定する

検証バージョンについて

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