このセクションでは、ログアーカイブに関する概念と内部ロジックについて説明します。
ログアーカイブアーキテクチャ
ログアーカイブとは、データベースが生成するリドゥーログを他のメディア(例:NFS、OSSなど)に保存し、データベースの全リドゥー履歴操作レコードをより長期間保持することです。OceanBaseデータベースはマルチテナントデータベースであり、各テナントはログアーカイブ機能を有効にするかどうかを独立して決定できます。各テナント間でのログアーカイブは互いに影響しません。
同時に、OceanBaseデータベースはネイティブ分散型データベースでもあり、テナント内の各ログストリーム間のアーカイブも相互に独立しています。単一のログストリームについて見ると、アーカイブログはログストリームのリーダーが担当し、各ログは1部のみアーカイブされます。アーカイブプロセスでは、RS Leaderが各ログストリームのアーカイブ進捗状況に基づいて、現在のテナントのアーカイブ進捗状況を計算します。
ログアーカイブアーキテクチャは以下の図のとおりです。
ログアーカイブモード
ログアーカイブモードは、アーカイブ(ARCHIVELOG)と非アーカイブ(NOARCHIVELOG)の2種類があります。これはログアーカイブ機能のスイッチであり、テナントがアーカイブモードになっている場合にのみ、そのテナントでログアーカイブタスクを実行できます。
アーカイブ状態
ログアーカイブは、アーカイブ宛先のアーカイブ状態を記述するために有限状態集合を使用します。sysテナントはoceanbase.CDB_OB_ARCHIVELOGビューのSTATUSフィールドを確認できます。MySQLモードのユーザーテナントはoceanbase.DBA_OB_ARCHIVELOGビューのSTATUSフィールドを確認でき、Oracleモードのユーザーテナントはsys.DBA_OB_ARCHIVELOGビューのSTATUSフィールドを確認できます。
各アーカイブ状態とその説明は以下の表のとおりです。
状態 |
説明 |
|---|---|
| PREPARE | ログアーカイブを開始する初期状態。 |
| BEGINNING | ログアーカイブの起動を開始します。この状態では、各ログストリームにアーカイブ開始の通知が送信されます。 |
| DOING | ログアーカイブが実行中です。この状態では、ログの連続ポイント、すなわちcheckpoint_scnが継続的に進められます。 |
| INTERRUPTED | アーカイブが中断されました。少なくとも1つのログストリームでアーカイブが中断した場合、この状態に入ります。 |
| SUSPENDING | ログアーカイブが一時停止中です。 |
| SUSPEND | ログアーカイブが一時停止されました。 |
| STOPPING | ログアーカイブが終了しています。 |
| STOP | ログアーカイブが停止しました。 |
アーカイブログの構成
Log Group
OceanBaseデータベースでは、各アーカイブログは実際には複数のLog Entryを含むログ集合であり、このアーカイブログをLog Groupと呼びます。各Log Entryには関連するSCNがあり、Log GroupにもSCNがあります。これはすべてのLog Entryの中で最大のSCNです。ログアーカイブの作業は、アーカイブメディア上でLog Groupを管理・整理することです。
Piece
OceanBaseデータベースは、アーカイブログデータをPiece単位で整理・管理します。一つのPieceは、特定のテナントにおける連続した期間の完全なログの集合であり、左閉右開の区間です。ここには以下の二つの重要な特徴が含まれています:
一つのPieceには連続した期間のログのみが含まれ、その期間は
1dのように1日間でも、2dのように他の時間間隔でもかまいません。この期間はLOG_ARCHIVE_DESTパラメータのpiece_switch_intervalプロパティによって制御されます。一つのPiece内のログは完全であるということは、そのテナントがその期間内に生成したすべてのログストリームのロググループが、そのPiece内に整理されていることを意味します。
LOG_ARCHIVE_DESTパラメータのpiece_switch_intervalプロパティを1dに設定した場合、OceanBaseデータベースは1日ごとに一つのPieceを生成します。各アーカイブサイクルの最後のPieceを除き、他の各Pieceには完全な1日分のログが含まれ、すべてのログは規則に従ってそのPieceにアーカイブされます。例えば、'2022-06-01 06:00:00.000000'でログアーカイブを開始した後、生成される完全なPieceには、現在のテナントのログのSCN範囲が['2022-06-01 06:00:00.000000' , '2022-06-02 06:00:00.000000')として含まれます。
Pieceの重要なプロパティ
PieceにはSTART_SCN、END_SCN、CHECKPOINT_SCN、STATUS、FILE_STATUSなど、いくつかの重要なプロパティがあります。
START_SCN
START_SCNフィールドは、Piece内の連続するログの開始SCNを示します。
END_SCN
END_SCNフィールドは、Pieceの終了SCNを示します。END_SCN - START_SCNの値がpiece_switch_intervalプロパティの値に該当します。
例えば、LOG_ARCHIVE_DESTパラメータのpiece_switch_intervalプロパティを1dに設定し、アーカイブ開始時刻を2022-06-01 06:00:00とした場合、そのアーカイブサイクルで生成される最初のPieceのSTART_SCNは'2022-06-01 06:00:00'、END_SCNは'2022-06-02 06:00:00'となります。これは、'2022-06-01 06:00:00'以上、'2022-06-02 06:00:00'未満のすべてのロググループがこのPieceにアーカイブされることを意味します。2番目のPieceのSTART_SCNは'2022-06-02 06:00:00'、END_SCNは'2022-06-03 06:00:00'となります。
同一のアーカイブサイクル内では、SCNが[START_SCN, END_SCN)範囲内のLog Groupはすべて同じPieceに属し、SCNが[START_SCN, END_SCN)範囲内のLog Entryは必ずしも同じPieceに属するわけではありません。
例えば、Piece 1のアーカイブ区間[START_SCN, END_SCN)が['2022-06-01 06:00:00', '2022-06-02 06:00:00')と仮定します。この時、あるLog Groupが2つのLog Entryを含んでおり、それぞれのSCNは'2022-06-02 05:59:59'(区間内)と'2022-06-02 06:00:01'(区間外)です。このLog GroupのSCNは、これら2つのLog Entryの最大値、すなわち'2022-06-02 06:00:01'となります。この値はpiece 1のEND_SCNを超えているため、このLog Group内のすべてのLog Entryは次のPieceに属します。
CHECKPOINT_SCN
CHECKPOINT_SCNフィールドは、Piece内の連続するログの最大SCNを示します。これはそのPiece内のすべてのLog Groupの中で最大のSCNであり、すべてのSCNが[START_SCN, CHECKPOINT_SCN]範囲内のLog GroupはすでにそのPieceにアーカイブされています。
STATUS
STATUSフィールドはPieceの状態を示します。各状態とその説明は以下の表のとおりです。
状態 |
説明 |
|---|---|
| ACTIVE | アクティブなPiece。システムがこのPieceにログをアーカイブしていることを示します |
| FROZEN | 凍結されたPiece。このPiece内のログは完全であり、今後このPieceにログをアーカイブすることはありません |
FILE_STATUS
FILE_STATUSはPieceのファイル状態を示します。各状態とその説明は以下の表のとおりです。
字段 |
説明 |
|---|---|
| AVAILABLE | Piece内のデータは完全であり、クリーンアップされておらず、破損もしていないことを示します |
| INCOMPLETE | Piece内のデータが不完全であり、特定のログストリームのデータが欠けていることを示します |
| DELETING | 期限切れでクリーンアップされているPiece。 |
| DELETED | Pieceがクリーンアップされたことを示します |
| BROKEN | Piece内のデータが破損しています |