目次
はじめに
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処理でテストをします)
・コミット
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 |
・操作をする前の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を設定する |