• 検索結果がありません。

1 Log のしくみ 平成十六年七月廿六日 NTT サイバースペース研究所坂田哲夫

N/A
N/A
Protected

Academic year: 2021

シェア "1 Log のしくみ 平成十六年七月廿六日 NTT サイバースペース研究所坂田哲夫"

Copied!
36
0
0

読み込み中.... (全文を見る)

全文

(1)

1

NTTサイバースペース研究所

坂田 哲夫

廿

Logのしくみ

(2)

2

あらまし

ログの概要

ログとはどのようなモノか

ログによるリカバリ

WAL

について

論理物理ロギング

ログデータの構造

PostgreSQL7.4でのログのしくみ

大きな枠組み:ロギングサブシステムの位置付け

内部構造:関数とデータ構造レベルでの説明

PITRについて

追加機能の概要

RPIT

について

まとめ、文献

(3)

3

Logの概要

PostgreSQLのログの説明をする前に

DBMS一般でのログの説明をします

(4)

4

ログとはどのようなモノか

トランザクションの原子性と持続性

原子性:

All or Nothing

持続性:コミットされた

TrX

の結果を確実に保存

ログファイルを別に持っている意義

コミットの際に全ての結果を

DB

ファイルへ書き出す

(

原子性と持続性を満たすため

)

コミット処理時にダウンするとどうなるか?

ディスクが隘路になる

ディスク上の別の場所に一旦書き出す

システムダウンしてしても記録は残る

固めて書き出す⇒隘路の軽減

(5)

5

ログとはどのようなモノか

ログには何が入っているか?

どのトランザクションのログか

(XID)

データベースに対する更新操作

(action)

記録方式は、論理・物理の2に大別される

1操作=1レコード(log record)

更新を実施したサブシステム

(RM)

それら操作の順序

(LSN)

取得方式の留意点

ログの容量

(

論理ログは小さく、物理ログは大きい

)

巾等

(

idempotent)

であること

(6)

6

ログによるリカバリ

ログの記録を時系列にそって「再生」して、データ

ベースに「反映」する

再生開始時点まで巻き戻す

'undo

スキャン

'

未コミットTrXのログを参照して、DBを元に戻す

これ以上巻き戻さなくても良い地点(下限水位)があ

ログを順方向にスキャンする

'redo

スキャン

'

コミット済みTrXのログのみ反映する

(7)

7

リカバリ動作のイメージ

下限水位の決定

それ以上古いログは不要

チェックポイントの時点で、

それ以前のコミット済み

TrXの内容はDK上にある

undoスキャン

下限水位まで逆走査

PosgreSQLでは不要

redoスキャン

下限水位から走査

ログレコードを順次適用

(XID, RM, LSN, ACT)

Log record

(1

, h

ea

p,1,

in

ser

t)

(1

, i

nd

ex

,2

, i

nser

t)

(2

, h

eap

,3, ins

er

t)

(2

, h

eap

,4

, i

nser

t)

(2

, i

nd

ex

,5

, i

nser

t)

(1

, h

ea

p,6,

in

ser

t)

(1

, i

nd

ex

,7

, i

nser

t)

(2

, TM,

7, C

O

M

MI

T)

(3

, h

eap

,8

, d

el

et

e)

(3

, TM,

9,

C

O

M

MI

T)

ログの成長方向

下限水位

ログ末尾

(8)

8

ログへの書き込み

ログに対する書き込み

リソースマネージャ

(RM)

からのデータをログに記録

RM

:ログに格納すべきデータを管理しているサブシ

ステム

Heap, B-Tree, xact, など

Log manager

Heap Manager

executor

Heap (Table)

ログ領域

DB領域

B-Tree Index

(9)

9

ログへの書き込み:

WAL

いつログに書き込むか?

変更を実際の

DB(heap)

に反映する前にログに書く

コミット前にDBを更新できる(可視性は別として)

変更が確実に記録される

この手順をwrite ahead log(WAL)と呼ぶ

Heapとファイルの同期はcheckpointで行う

Log manager

Heap Manager

executor

Heap (Table)

ログ領域

DB領域

Log record

check point

(10)

10

何がログへ書き込まれるか

各種のログ方式に共通

何番目のログレコードか

(log serial number; LSN)

log manager

が付与する

物理ロギングの場合

どのページを出力したか

更新後のページが出力される

(after image)

更新前のページも出力される

(before image)

ページ

1

ページ

2

ページ

3

ページ

4

バッファ

更新された

Log manager

ログ領域

After image Before Image Page Number

(11)

11

何がログへ書き込まれるか

論理ロギングの場合

DBMS

に対する操作を記録する

容量が小さいという

利点がある

INSERT INTO table1 value (1,2,3);

INSERT INTO table2 value (4,5,6);

Log manager

ログ領域

DBMS

(12)

12

何がログへ書き込まれるか

各方式の得失を考える観点

べき等性:同じ操作を何度実行しても、常に同じ

結果を得ること

ログデータの量:少ない方がよい

観点

物理

論理

べき等性

あり。

実現困難

例えば、

insert を考えよ

ログの容量

物理ログより小

両者を組み合わせた方式が必要

(13)

13

何がログへ書き込まれるか

物理論理ロギング

ページ内の特定の箇所に対する

論理的な操作を記録する

PostgreSQLでも採用されている

物理論理ログの例

Opcode -- 操作種別

Page -- 物理ページ番号

Offset -- ページ内オフセット

length -- データ長

record[length] -- データ本体

論理的部分

物理的部分

(14)

14

ログデータの全体的な構造

基本的には、無限に伸びるログレコードの列データ

現実にはセグメント化&リサイクル

セグメントのアーカイブ化

(PITR)

ログレコードにはLSNが付与される

下限水位が(ログとは別に)設定される

(1 , h eap ,1 , in ser t) (1 , i nde x, 2, in ser t) (2 , h eap ,3 , in ser t) (2 , h eap ,4 , in ser t) (2 , in dex ,5 , in ser t) (1 , h eap ,6 , in ser t) (1 , i nd ex ,7 , i nser t) (2 , T M ,7 , C OM M IT ) (3 , h ea p,8, del et e) (3 , T M ,9 , C OM M IT )

下限水位

(4 , h eap ,1 0, d el ete )

segment1

segment2

ログの成長方向

(4 , T M ,1 1, C OM M IT )

segment3

ログは

segmentという名前の

 ファイルに分割されて格納される

segmentファイルは順次

再利用される

書き込みが完了した

segmentは

 別のディスクへコピーする

 ⇒アーカイブ化

(PITR)

(15)

15

PostgreSQL 7.4

での

Logのしくみ

PostgreSQL7.4でのログの

実装の説明をします

大きな枠組み

内部構造

主要データ構造

(16)

16

大きな枠組み

PostgreSQL内でのLogging systemの位置付け

リソースマネージャ

(RM)

heap

の間にある

check point

と協調動作する

Log資源の管理

物理ログと物理論理ログの混在

可能なら早期に書き込む

複数

backend

の協調動作

(

排他制御

)

Log manager Heap Manager executor Heap(Table) ログ領域 DB領域 B-Tree Index

Trx Manager Log record

これらの特徴のため

内部の動作は複雑

(17)

17

Loggingシステム内部構造

関数レベルでの内部構造(下図)

在り処

src/backend/access/transam/xlog.c

XLogInsert

XLogWrite

XLogFileInit

ログ領域:セグメントファイル

(16MB)

WAL buffer page

・Loggingシステムのインタフェース ・RMデータを受け取り、LSNを返却 ・WALバッファ上のデータ生成 ・WALバッファの書き出し

AdvanceXLInsertBuffer

WALバッファのローテート ・Logセグメントのローテート ・セグメントの新規生成 ・セグメントファイルにlog recを保存 ・一杯になると次のセグメントへ保存 ・複数のセグメントを循環再利用

(18)

18

Loggingシステムのデータ構造

XLogInsert関連の主要データ(その1)

RM

WAL

バッファのデータ構造概要

RM data rdata InvalidBuffer rdata rdata buffer len data next buffer len data next buffer len data next タプルの本体へ タプル本体 XLogRecPtr Buffer (heap) k ptr WAL Buffer バッファは8KBごとの ページに分割される

dtbuf_rdf[] buffer len data next buffer len data next buffer len data next null ディスク上のログレコードへ タプルの本体へ 2個一対で使われる xlogid:int32 xlogファイルの番号 xrecoff:int32 ファイル内オフセット xlogid:int32 xlogファイルの番号 xrecoff:int32 ファイル内オフセット   ⇒LSNの実現 buffer (entry) page先頭

(19)

19

Loggingシステムのデータ構造

XLogInsert関連の主要データ(その2)

ディスク上のログデータの配置

WAL Buffer バッファは8KBごとの ページに分割される dtbuf_rdf[] ディスクファイル ページヘッダ log re c ヘッダ lo g re c 本体 lo g re c ヘッダ lo g re c 本体 lo g re c ヘッダ ページヘッダ lo g re c 本体 lo g re c ヘッダ WALセグメント WALページ 1Seg=16MB 1pg=8KB

w

rit

e

lo g re c 本体 lo g re c ヘッダ lo g re c 本体 lo g re c ヘッダ ページヘッダ log re c 本体 1TrXのlog rec ・直前のlog recへのリンク 直前のTrXへのリンク

ログの成長方向

(20)

20

Loggingシステムのデータ構造

XLogInsert関連の主要データ(その3)

ヘッダほか

xl_crc crc64 誤り訂正コード

xl_prev XLogRecPtr 直前log recへのリンク

xl_xact_prev XLogRecPtr 直前TrXのlog recへのリンク xl_xid TrID log recを書き込んだTrX xl_len uint16 ログレコード長 xl_info uint8 RMでの操作を示すコード xl_rmid RmgrId どのRMのデータか ログレコードの破損を 検出する XLogRecord

xlp_magic uint16 0xD05A; WALの版を示す xlp_info uint16 0; 使われていない?

StartUpId xlp_sui 0; 全てのbackendで同じ xlp_pageaddr XLogRecPtr このページヘッダの位置 XLogPageHeaderData

XLogInsertで設定 AdvanceXLogInsert で設定

(21)

21

XLogInsertの概要

入出力I/F

XLogRecPtr

XLogInsert(RmgrID

rmid,

uint8

info,

XLogRecData *rdata )

戻り値:ログレコード挿入箇所 どのRMからのリクエストかを示す RMによる操作の種類を示す RMによる操作に付随するデータ

RM data

rdata InvalidBuffer rdata rdata buffer len data next buffer len data next buffer len data next タプルの本体へ

関数仕様

(22)

22

XLogInsertの概要

主な機能

WALバッファに書き込む前のデータ構造の準備

データ構造(その1)でのdr_buf[]など

CRC(巡回冗長コード)の生成:誤り訂正&検出

書き込みデータの最新性の確認

(

後述

)

物理ログ

/

論理ログの判断

(

後述

)

WALバッファ上へのデータ転送

ページが一杯になったらページ送りする

⇒AdvanceXLogInsertBuffer()を呼ぶ

半分以上埋まっており、ロックが獲得出来る

⇒早期書き込み XLogWrite()を呼ぶ

後始末

(23)

23

XLogInsertの概要

物理モード/物理論理モードの動作切り替え

通常は物理論理モードで動作する

チェックポイント後、そのページの内容が初めてロ

グに書かれる時は、ページ全体を出力

(

物理モー

)

詳細は次のスライドで

(24)

物理

/物理論理の切り替えロジック

Buffer page HeapInsert XLogInsert

LSN: log serial number LSN CheckPoint LSN LSN 比較する 書き込む 物理モード書込 RedoRecPtr LSN Log

>

リクエスト LSN 戻り値 LSN 書き込む リクエスト LSN 比較する LSN LSN

<

物理論理モード書込 書き込む チェックポイント後最初の リクエストを判別する LSNの大小関係 LSN

>

LSN LSN

>

(25)

25

XLogInsertの概要

ログ書き込みの排他制御

DB

バッファは排他資源

WALポインタ自身も排他資源

WALの書き込みオーバヘッドを減らすため極力ロック

を獲得しない

各backendはWALポインタのコピーを持つ

ロックせずに読めるがDBバッファ/WALポインタの最新性の

保証はない

他のbackendがWALポインタを更新して、何時の間に

か古くなることがある

書き込むべきページが他のbackendによって更新される

こともある

途中までデータを準備し、最新性を確認してから

WALバッファに書き込む

(

楽観的制御

)

(26)

26

XLogWriteの概要

機能

WALバッファの内容を実際にファイルに書き出す

書き込み位置の管理を行う

API

void XLogWrite(

XLogwrtRqst WriteRqst)

戻り値:なし 書き込むべきWALバッファの先端位置 WALバッファのアドレス(LSN)

関数仕様

(27)

27

XLogWriteの概要

WALバッファの書き込み管理

同じ型を持つ

3

つの変数

WriteRqst

書き込みたい先端の位置(引数)

LogwrtResult

実際に書き込んだ位置の各backendでの控え

xlogctl->LogwrtResult

システム全体でのログの書き込み位置

メンバの型

Write型 write()で書き込んだ位置の先端

Flush型 fsync()などでディスク上に確実に書き込ん

だ位置の先端

flush

する条件

segmentが一杯で最終ページも完結している

(28)

28

XLogWriteの概要

WALバッファの書き込み管理

WriteRqst, LogwrtResult

のイメージ

ログの成長方向

WriteRqst ページとは無関係に要求される。 LogwrtResult 初期値はxlogctl->LogwrtResult (システム全体での位置)からもらう。 ページ境界に設定され、 fileに書き込むとページ単位で進む LogwrtResult このケースではここまでfileに書き込む segmentの途中ではflushしない Page末にてSegmentが 一杯ならばflushする

WAL Buffer

(29)

29

AdvanceXLInsertBufferの概

機能

WALバッファのページを

1

つ送る

送り先ページが使用中なら書き出す

API

static bool

AdvanceXLInsertBuffer(void)

戻り値:論理型  WAL管理の共有変数の更新の要否 引数はない

関数仕様

(30)

30

AdvanceXLInsertBufferの概

動作概要

WALバッファのページを

1

つ送る

WALバッファの現在の書き込み位置はWALの書き込

み位置を示す共有変数

XLogCtl->xlblocks[nextidx] から取得する

送り先ページが使用中なら書き出す

書き出し自体はXLogWrite()で実行

書き出したら、WALの書き込み位置を示す共有変

数を更新する

使用中でなくとも共有変数の更新が必要だが、ここ

では行わずに必要性を戻り値で返す

(他の処理でもっと前に進める可能性が高いため)

新しいページを初期化する

(31)

31

PostgreSQL 7.5

での

PITRのしくみ

PostgreSQL7.5のLogの中での

Point In Time Recoveryの

改造個所を説明をします

主な改造個所

課題

(32)

32

PITRのための改造個所

関数レベルでの主な改造個所(下図)

在り処

src/backend/access/transam/xlog.c

XLogInsert

XLogWrite

XLogFileInit

ログセグメント

WAL buffer page

AdvanceXLInsertBuffer

XLogArchiveNotify

・Logセグメントが一杯になったことを  通知するファイルを作成する

(33)

33

PITRのための改造個所

関数レベルでの主な改造個所(続き)

セグメントファイルの管理方針の変更

単純なリサイクルからアーカイブ方式へ

既存方式

Log manager

アーカイブ方式

Log manager

書込中 書込済 未使用 未使用 書込中 pg_arch 保管済 保管中 アーカイブファイル ・Checkpointの際に  削除or再利用 ・XLogArchiveNotify 経由で間接的に  起動される

(34)

34

Log-Recoveryシステムでの課

PostgreSQL 7.5では、PITRによって懸案だった roll

forward loggingが可能となった

以下の課題が残っていると考えられる

重要なファイルの

2

重化

トランザクションログ

コントロールファイル

バックアップ方式の充実

差分/増分バックアップ

RPIT(recovery to point in time)

(35)

35

参考文献

概要レベル

入門書レベルでは以下の本が簡潔

北川 博之, “データベースシステム”, 昭晃堂, 1996.

以下の本は丁寧でお勧めできる

Garcia-Molina, J. D. Ullman, J. D. Widom,

“Database Systems: The Complete

Book”,Prentice Hall, 2001.

詳細レベル

Gray&Reuter

の教科書

J. Gray, A. Reuter, “トランザクション処理―概念と

技法〈上/下〉”, 日経BP, 2001.

WALを実装したM. Vadimも読んだらしい

(36)

36

お疲れさまでした

参照

関連したドキュメント

 哺乳類のヘモグロビンはアロステリック蛋白質の典

1-1 睡眠習慣データの基礎集計 ……… p.4-p.9 1-2 学習習慣データの基礎集計 ……… p.10-p.12 1-3 デジタル機器の活用習慣データの基礎集計………

『国民経済計算年報』から「国内家計最終消費支出」と「家計国民可処分 所得」の 1970 年〜 1996 年の年次データ (

概要/⑥主要穀物の生産量.

「地方債に関する調査研究委員会」報告書の概要(昭和54年度~平成20年度) NO.1 調査研究項目委員長名要

と発話行為(バロール)の関係が,社会構造(システム)とその実践(行

モノーは一八六七年一 0 月から翌年の六月までの二学期を︑ ドイツで過ごした︒ ドイツに留学することは︑

参考第 1 表 中空断面構造物の整理結果(7 号炉 ※1 ) 構造物名称 構造概要 基礎形式 断面寸法