はじめに

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処理でテストをします)
・コミット


実際に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 7.1で確認しています。