はじめに
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番号の進み方を見てみましょう。
以下の簡単なトランザクション処理を行い、各処理の合間にCurrent Epoch番号を確認する事で、Epoch番号の進み方を見てみます。
・SELECT処理
・DML処理(今回はINSERT処理でテストをします)
・コミット
・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のパラメータがあります。
そのパラメータ一覧を以下に記載致します。
| 項番 | パラメータ名 | 説明 | デフォルト値 | 変更時の実行例 |
|---|---|---|---|---|
| 1 | AdvanceAHMInterval | Verticaの履歴を保存ステータスをチェックする頻度を指定します(秒指定)。 このパラメータはEpochMapIntervalよりも小さな値に設定する事はできません。 | 180(3分) | ALTER DATABASE mydb SET AdvanceAHMInterval = '3600'; |
| 2 | EpochMapInterval | Historical query(履歴クエリ)を有効にするために、Epochと時刻をマッピングする粒度を指定します。 AT TIME 'timestamp' SELECT...のHistorical query(履歴クエリ)が発行されると、 EpochMapIntervalで指定した値の時間内にEpoch番号にマッピングします。 この値を小さく設定すると、Epochの数を増やす事になります。 そのため、Verticaが保持するEpochの履歴数を制限するために、 HistoryRetentionTimeパラメータを減らす事を検討してください。 | 180(3分) | ALTER DATABASE mydb SET EpochMapInterval = '300'; |
| 3 | HistoryRetentionTime | 参照用の履歴情報として削除済みのデータをどれくらい保持するかを指定します(秒指定)。 このパラメータに指定した時間を経過すると、削除済みのデータを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; | 0 | ALTER DATABASE mydb SET HistoryRetentionTime = '240'; |
| 4 | HistoryRetentionEpochs | Epoch履歴の数を指定します。これによって、削除済みデータを保持する量が決まります。 特別な理由がない限り、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…
AT EPOCH epoch_number SELECT…
AT EPOCH LATEST SELECT…
Tips
Epochに関するコマンドを紹介致します。
| 項番 | コマンド | 説明 |
|---|---|---|
| 1 | SELECT * FROM epochs; | 直近のEpoch番号(Latest Epoch)とその時刻を確認する |
| 2 | SELECT GET_CURRENT_EPOCH(); | Current EpochのEpoch番号を確認する。 |
| 3 | SELECT GET_AHM_EPOCH(); | AHMのEpoch番号を確認する |
| 4 | SELECT GET_AHM_TIME(); | AHMのEpoch番号に関連付けられた時刻を確認する |
| 5 | SELECT GET_LAST_GOOD_EPOCH(); | LGE(LastGoodEpoch)に関連付けられたEpoch番号を確認する |
| 6 | SELECT ADVANCE_EPOCH(integer); | 手動でEpoch番号を進める (指定した整数が加算される) |
| 7 | SELECT MAKE_AHM_NOW( [true] ); | ・AHMを可能な限り大きい値に進める ・オプションのパラメーターをtrueに設定し、AHMを停止したノードのLGEより後に進める ・「true」を使う際の注意点 停止していたノードがリカバリする際に、1からノードを再構築する必要が出てくる |
| 8 | SELECT SET_AHM_EPOCH( epoch, [true]); | 希望のEpoch番号にAHMを設定する |
| 9 | SELECT SET_AHM_TIME( time, [true]); | 希望の時刻にAHMを設定する |
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。
