67
Copyright 2011 Uptime Technologies LLC, All rights reserved. 1 PostgreSQLアーキテクチャ入門 アップタイム・テクノロジーズ合同会社 永安 悟史 2011.10.21

PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Embed Size (px)

DESCRIPTION

2011年10月19~21日に開催された「INSIGHT OUT 2011」のセッション「PostgreSQLアーキテクチャ入門」の講演資料です。 「INSIGHT OUT 2011」の詳細については、以下を参照ください。 http://www.insight-tec.com/insight-out-2011.html

Citation preview

Page 1: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 1

PostgreSQLアーキテクチャ入門

アップタイム・テクノロジーズ合同会社

永安 悟史

2011.10.21

Page 2: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 2

PostgreSQLアーキテクチャ入門

アジェンダ

1. アーキテクチャ概要

2. クエリの処理

3. I/O処理の詳細

4. 領域の見積もり

5. パフォーマンス管理

6. 可用性管理

※本資料の 新版は以下に掲載されています。http://www.uptime.jp/(ホーム→リソース→技術情報)

Page 3: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 3

本セッションのねらい

• PostgreSQL でシステムを構築して実運用をするためには、データベース管理者(DBA)として ある程度内部構造を理解しておく必要があります。

• 本講演では、開発や運用において必要とされる技術的知識について、PostgreSQL の基本的な仕組みからバックアップ&リカバリ、レプリケーションまで、 PostgreSQL の動作原理を俯瞰して解説を行います。

• 主に PostgreSQL 初級者から中級者向けの内容です。

• 特に以下のような方にオススメです。

– データベースの特に運用管理・パフォーマンス管理に詳しくなりたい方。

– コンピュータアーキテクチャに詳しくなりたい方。

– コンピュータエンジニアリングの基礎を知りたい方。

– 他のRDBMSを利用していて、PostgreSQLについて知りたい方。

Page 4: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 4

自己紹介

• 氏名– 永安 悟史 (ながやす さとし)

• 略歴– 2004/4-2007/9 (3年6ヵ月)

• 株式会社NTTデータ入社。• PostgreSQLによる並列分散RDBMSの研究開発。• SIプロジェクトの技術支援、並列分散PostgreSQLミドルウェアの製品サポートおよび保守。

– 2007/10-2008/9 (1年)• データセンタ企画部門にて、次世代ITプラットフォームサービスの企画・開発。

– 2008/10-2009/10 (1年1ヵ月)• データセンタ運用部門にて、OSS系システムの基盤保守・運用、および運用チームの統括。• 株式会社NTTデータ退職。

– 2009/11-• アップタイム・テクノロジーズ創業(共同創業者兼CEO)。

• 専門分野– データベースシステム、並列分散システム、クラスタシステム– オープンソース・インフラ技術– ITサービスマネジメント(ITIL)、ITインフラ運用管理(運用設計~運用)

• 執筆等– 翔泳社「PostgreSQL徹底入門 ~ 8対応」(共著)– 技術評論社「PostgreSQL安定運用のコツ」(WEB+DB PRESS vol.32~37連載)、他

Page 5: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 5

開発している・していたもの

• pgstatindexユーティリティ

– B-Treeインデックスの情報をダンプするユーティリティツール

– PostgreSQL 8.2から本家のソースツリー(pgstattuple/pageinspect)にマー

• PostgreSQL Query Cache– PostgreSQLへの問い合わせ結果をMemcachedを使ってキャッシュすること

で高速化するProxyソフトウェア

– http://code.google.com/p/pqc/

• xlogdumpユーティリティ

– 近メンテナになりました

– トランザクションログ(XLOG)の内容や統計情報をダンプするユーティリティ

– http://github.com/snaga/xlogdump

Page 6: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 6

pgsnaga.blogspot.com

Page 7: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 7

(1)アーキテクチャ概要

Page 8: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 8

PostgreSQLの構成要素

PostgreSQLは、さまざまなプロセス・メモリ領域・ファイルによって構成されている。

テーブルファイル

トランザクションログファイル

インデックスファイル

アーカイブログファイル

postgres(リスナプロセス)

postgres(サーバプロセス)

writer(バックグラウンド

ライタ)

stat collector(統計情報収集)

プロセス群

ファイル群

メモリ群shared_buffers(共有バッファ)

wal_buffers(WALバッファ)

archiver(WALアーカイバ)

設定ファイル

logger(サーバログ)

autovacuum(自動vacuum)

freespacemap(空き領域情報)

トランザクション制御情報

wal writer(WALライタ)

wal sender(レプリケーション)

wal receiver(レプリケーション)

visibilitymap(ブロック情報)

Page 9: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 9

PostgreSQLの基本的なアーキテクチャ

共有バッファを中心として、複数のプロセス間で連携しながら処理を行うマルチプロセス構造。

share

d_buffe

rs

(共有バッファ)

テーブルファイル

トランザクションログファイル

postgres(リスナプロセス)

postgres(サーバプロセス)

インデックスファイル

writer(バックグラウンド

ライタ)

postgres(サーバプロセス)クライアント

postgres(サーバプロセス)

Page 10: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 10

プロセス

• Postgres(旧Postmaster)プロセス

– PostgreSQLを起動すると 初に開始されるプロセス。

– クライアントからの接続を受け付け、認証処理を行う。

– 認証されたクライアントに対して、Postgresプロセスを生成(fork)して処理を引き渡す。

• Postgresプロセス

– クライアントに対して1対1で存在する。

– クライアントからSQL文を受け付け、構文解析、 適化、実行、結果返却を行う。

– 共有バッファを介してデータを読み書きし、トランザクションログを書く。

• Writerプロセス

– 共有バッファの内容をディスク(テーブルファイル、インデックスファイル)に非同期的に書き戻す。バックグラウンドライタとも呼ばれる。

Page 11: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 11

メモリ(共有バッファ)

• ディスク上のブロックをキャッシュするメモリ領域

– ディスク上のブロックのうち、アクセスするものだけを読み込む

– すべてのバックエンドプロセスで共有

• キャッシュすることで、ディスクI/Oを抑えて高速化

– 更新の永続性はトランザクションログで担保する

– メモリ上で変更されたブロックは、ライタプロセス(非同期)またはチェックポイント(同期)がテーブル/インデックスファイルに書き戻す

9 17 5 14

共有バッファ

テーブル/インデックスファイル

postgres

postgres

postgres

バックエンド

1 2 3 47 8

5 69 10 11 12

13 14 15 1619

17 18・・・・

トランザクションログファイル

writer

Page 12: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 12

トランザクションログ(XLOG)

• テーブルやインデックスの更新情報が記録(追記)される

– 共有バッファのデータを更新する「前」に記録(Write-ahead)

– 16MBずつのセグメント(ファイル)に分割されている。

– リカバリの際に読み込まれる (pg_xlog/ 以下に配置)

– アーカイブされて、PITRのバックアップ/リカバリで使われる(アーカイブログ)

Aテーブルのレコード1をmに変更

Bテーブルのレコード6をnに変更

Aテーブルのレコード4をxに変更

Aテーブルのレコード1をyに変更

Bテーブルのレコード2をzに変更

ファイルの先頭から順番に更新情報が

追記されていく

WAL 1 WAL 2

Page 13: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 13

テーブルファイル

• 8kB単位のブロック単位で管理

• ブロックの中に実データのレコード(タプル)を配置

– 基本的に追記のみ

– 削除したら削除マークを付加する(VACUUMで回収)

– レコード更新時は「削除+追記」を行う。

レコード1

レコード2

レコード3

レコード4

レコード5

ブロック1

ブロック2

ブロック3

DBT1=# SELECT * FROM pgstattuple('customer');-[ RECORD 1 ]------+-----------table_len | 1754857472tuple_count | 3456656tuple_len | 1703225491tuple_percent | 97.06dead_tuple_count | 695dead_tuple_len | 350038dead_tuple_percent | 0.02free_space | 31391624free_percent | 1.79

DBT1=#

Page 14: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 14

インデックス(B-Tree)ファイル

• ブロック(8kB単位)をノードとする論理的なツリー構造を持つ

– ルート、インターナル、リーフの各ノードから構成

– ルートノードから辿っていく

– リーフノードは、インデックスのキーとレコードへのポインタを持つ

1~5 6~10 11~17 18~25

インデックスファイルDBT1=# SELECT * FROM pgstatindex('customer_pkey');-[ RECORD 1 ]------+----------version | 2tree_level | 2index_size | 108953600root_block_no | 217internal_pages | 66leaf_pages | 13233empty_pages | 0deleted_pages | 0avg_leaf_density | 90.2leaf_fragmentation | 0

DBT1=#

root

Page 15: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 15

発生する3種類のI/O

• 例えば、主キーで検索して該当レコードを更新する場合

– プライマリーキーでインデックスエントリを探す

– インデックスのポインタを元に、テーブル内のレコードを探す

– テーブルレコードを更新する前にトランザクションログに記録する

– テーブルファイルを更新する

トランザクションログファイル

テーブルファイルテーブルファイル

テーブルファイル

インデックスファイルインデックスファイル

インデックスファイル

②読む

③書く

①読む

④書くディスクヘッド

物理ディスク

Page 16: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 16

UNLOGGED TABLE

• トランザクションログを書かないテーブル

– CREATE UNLOGGED TABLE …– テーブルのページブロックだけディスクに(非同期に)書き出される。

– クラッシュした場合、リスタートのリカバリの際、TRUNCATEされる。

pgbench on UNLOGGED (...and others)

0

200

400

600

800

1,000

1,200

1,400

1,600

1,800LO

GG

ED

UN

LO

GG

ED

(only

his

tory

)

UN

LO

GG

ED

sync_c

om

mit =

off

fsync =

off

tps

(exc

ludi

ng

conn.)

Page 17: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 17

8K Sequential Access

0

1000

2000

3000

4000

5000

6000

7000

100%/0% 75%/25% 50%/50% 25%/75% 0%/100%

Read/Write Ratio

IOps

(参考) I/Oパターンの混在

• 複数のアクセスパターンが単一のHDD上に混在すると、パフォーマンス

は低下する。

– 物理ディスクをどのように配置するかがストレージ戦略。

※SATA接続のHDD 1台に対してiometerを用いて8kBブロック単位のI/Oで計測。

Page 18: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 18

(2)クエリの処理

Page 19: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 19

SQL文の処理される流れ

構文解析(parse)

書き換え(rewrite)

実行計画生成 / 適化(plan / optimize)

実行(execute)

•SQL構文の解析、文法エラーの検出•構文木(parse tree)の生成

•VIEW / RULE に基づいた構文木の書き換え

• 適なクエリプラン(実行計画)の生成•統計情報などを用いて実行コストを 小化(コストベース 適化)

•クエリプランに沿ったデータアクセス、抽出/結合/並べ替えなどの演算処理

•(更新時)トランザクションログ追記、共有バッファ更新

クエリ受信

結果送信

Page 20: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 20

クエリとクエリプラン

テーブルスキャン

インデックススキャン

ネステッドループジョイン

集約 count()

Page 21: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 21

クエリプランの詳細

Page 22: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 22

クエリプランの確認方法

• EXPLAINコマンド

– 適であると判断された「クエリプラン」を表示。

– 入力されたSQL文を、PostgreSQLがどのように解釈して処理しよう

としているのかを表示。

• EXPLAIN ANALYZEコマンド

– 「クエリプラン」に加えて、「実行結果」を表示。

– 実際に、どのアクセスにどの程度の時間がかかっているのか、何件のレコードを処理したのか、などを表示。

• GUIツールで確認する方法(pgAdminIII)– 「クエリー解釈」=EXPLAIN– 「アナライズ解釈」=EXPLAIN ANALYZE

Page 23: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 23

データアクセスのパターン

• シーケンシャルアクセス– 全レコード、または多くのレコードを処理する必要がある場合

– 集約処理、LIKE文の中間一致など

• ランダムアクセス– 特定のレコード(を含むブロック)だけにアクセスする必要がある場合

– 主にインデックスを用いたアクセス

シーケンシャルアクセス

ランダムアクセス

テーブルファイル テーブルファイル

ファイルの先頭から順番に読み込んでいく 必要なブロックだけ

ピンポイントで読み込む

Page 24: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 24

テーブルスキャン

SELECT count(*) FROM customer;Customer

テーブルからのブロック読込×214,216

Customer_pkeyインデックスの

ブロック読込×0

Page 25: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 25

• すべてのデータを確認する必要があるため、customerテー

ブルファイルを構成するブロックを先頭から読み込む– よって、データが増えれば増えるほど時間がかかるようになる。

– この例では、214,216 ブロック(約1.7GB)を読んでいる。

1~5 6~10 11~17 18~25

Customer_pkeyインデックス

rootレコード1

レコード2

レコード3

レコード4

レコード5

Customerテーブル

テーブルスキャン cont’d

Page 26: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 26

インデックスアクセス

SELECT * FROM customer c WHERE c.c_id=7;

Customerテーブルからのブロック読込×1

Customer_pkeyインデックスの

ブロック読込×3

Page 27: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 27

• “c_id=7” レコードの位置を探すため、customer_pkeyを辿っ

てポインタを見つけ、レコードを含むテーブルファイルのブロックを読み込む。– この例では、customer_pkeyインデックスから3ブロック、customer

テーブルから1ブロックを読んでいる。

– レコードの量とディスクアクセス量が比例しない。

1~5 6~10 11~17 18~25

Customer_pkeyインデックス

rootレコード1

レコード2

レコード3

レコード4

レコード5

Customerテーブル

インデックスアクセス cont’d

Page 28: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 28

結合(Nested Loop Join)

• SELECT count(*) FROM orders o, customer cWHERE o.o_c_id=c.c_id AND c.c_uname=‘UL’;– customer を c_uname=‘UL’ でインデックススキャン

– customer のレコードの c_id を使って orders をインデックススキャン

i_c_uname customer i_o_c_id orders

Page 29: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 29

(3)I/O処理詳細

Page 30: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 30

テーブルに対する更新処理

レコード1レコード2レコード3レコード4

レコード1(レコード2)

レコード3レコード4レコード2’

「レコード2」を「レコード2’」として更新

ファイル中に4件のレコードが

順番に並んでいるレコード2に削除マークが付けられ、レコード2’が新たに追加、ファイルサイズ増加

レコード1レコード2レコード3レコード4

レコード1レコード2レコード3レコード4レコード5

「レコード5」を追加

ファイル中に4件のレコードが

順番に並んでいる レコード5がファイル末尾に追加され、

ファイルサイズが増える

レコード1レコード2レコード3レコード4

レコード1(レコード2)

レコード3レコード4

「レコード2」を削除

ファイル中に4件のレコードが

順番に並んでいるレコード2に削除マークが付けられる

レコード追加処理

(INSERT)

レコード削除処理

(DELETE)

レコード更新処理

(UPDATE)

Page 31: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 31

タプルの更新とインデックスの更新

エントリ1

ヒープタプル(テーブル)

レコード1レコード2

レコード1(レコード2)レコード2’

エントリ2エントリ1

(エントリ2)エントリ2’

インデックス

エントリ1

ヒープタプル(テーブル)

レコード1レコード2

レコード1(レコード2)レコード2’

エントリ2エントリ1エントリ2インデックス

インデックス付きカラム(例えばユーザID)

インデックスのないカラムを更新すると・・・

インデックスのないカラムを更新すると・・・

インデックスの張られていないカラムを更新すると、ヒープのみの(インデックスエントリが無い)カラムができ、

インデックスの増加が抑制される。

これが、HOT(Heap Only Tuple)

インデックスサイズは増えない

インデックスサイズも増える

8.3以降

8.2以前 インデックス無しカラム(例えば住所)

インデックス付きカラム(例えばユーザID)

インデックス無しカラム(例えば住所)

ポインタを貼る

Page 32: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 32

テーブルに対する参照処理(MVCC)

レコードデータ作成XID

削除XID

レコードデータ1101 -レコードデータ2101 103レコードデータ3103 -レコードデータ4103 -

トランザクション101 レコード1とレコード2を作成。コミット。トランザクション102 トランザクション開始。

トランザクション103 レコード2を削除して、レコード3、レコード4を作成。コミット。トランザクション102 レコード3、レコード4は参照可、レコード2は参照不可。

テーブル例

作成XID ・・・ レコードを作成したトランザクションのID削除XID ・・・ レコードを削除したトランザクションID

• 各タプル(テーブルのレコード)は、作成したトランザクション、または削除したトランザクションのXIDをヘッダに持つ。

• 作成・削除したトランザクションID(XID)を参照しながら、「読み飛ばすレコード」を決める。• レコードを読んだり、読み飛ばしたりすることで、MVCCを実現する。

Page 33: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 33

VACUUM処理

レコード1(レコード2)

レコード3レコード4レコード2’

VACUUM前

レコード2に削除マークが

付いている

VACUUM処理レコード1空き領域

レコード3レコード4レコード2’

VACUUM後

レコード2の領域が「空き領域」として

再利用可能になる。

レコード1空き領域

レコード3レコード4レコード2’

追記前

「空き領域」がある

VACUUMしてあると

レコード1レコード5レコード3レコード4レコード2’

追記後

ファイルサイズを変えずに追記できる

レコード1(レコード2)

レコード3レコード4レコード2’

レコード2の領域が埋まったまま

VACUUMしてないと

レコード5を追記

レコード1(レコード2)レコード3レコード4レコード2’

ファイルサイズが増加

レコード5を追記

VACUUM処理

レコード5

Page 34: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 34

インデックススキャンとタプルの可視性

エントリ1

ヒープタプル(テーブル)

レコード1レコード2エントリ2

インデックス

インデックスの指すレコードが可視かどうか(削除されているかどうか)は、テーブルの行(ヘッダ)にアクセスしないと分からない。

テーブルブロック内の全タプルが「可視」であることが分かる場合、インデックススキャンでは各タプルへ参照は行わない。

これが、Index-only Scans

9.2dev以降

9.1以前

エントリ3エントリ4

(レコード3)

レコード4ページブロックA

エントリ1

ヒープタプル(テーブル)

レコード1レコード2エントリ2

インデックス

エントリ3エントリ4

空き領域

レコード4ページブロックA

Visibility Map

可視?

可視?

削除されていない、またはVACUUM済の

ページのフラグを持つ

Page 35: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 35

Index-only Scans検証

• pgbenchベンチマークのaccountsテーブルをcount(*)– データ作成直後は、インデックスのみのスキャンを実行。

– 一部のレコードが削除されると、可視性判断のためにテーブルブロックへのアクセスの必要性が生じる。

– VACUUMが実施されると、可視性マップが 新化されるので、再度、インデックスのみ

でスキャン可能になる。

Index-only Scansにおけるブロック読み込み

0

500

1,000

1,500

2,000

2,500

3,000

3,500

4,000

作成直後 レコード10%削除後 VACUUM後

count(*)実行タイミング

読み

込み

ブロ

ック

インデックスブロック

テーブルブロック

Page 36: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 36

(4)領域の見積もり

Page 37: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 37

データファイルの物理的な配置

データベースクラスタ(PGDATA)

デフォルトテーブルスペース(base) トランザクションログ(pg_xlog)

設定ファイル(postgresql.conf, pg_hba.conf)

アーカイブログ

ユーザデータベース(OID)

テーブルファイル

インデックスファイル

外部テーブルスペース×N

その他制御ファイル等

システムカタログ・共有 (global)

テーブルファイル

インデックスファイル

Page 38: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 38

領域の見積もり

• ユーザデータ領域

– テーブルファイル• テーブルファイルサイズ=8kB×必要ブロック数

• 必要ブロック数=全レコード数÷1ページ格納レコード数

• 1ページ格納レコード数=ページ利用可能サイズ×平均充填率÷レコードサイズ

– インデックスファイル• インデックスファイルサイズ≒8kB×リーフノード数

• リーフノード数=全インデックスエントリ数÷1ページ格納エントリ数

• 1ページ格納エントリ数=ページ利用可能サイズ×平均充填率÷インデックスタプルサイズ

• トランザクションログ領域

– 机上での見積もりは難しいので、実際にトランザクションを実行して見積もる。

– チェックポイントの間隔に注意• 間隔が小さいとバックアップブロック(数kB)を記録する回数が増えてXLOGファイルが増大。

• 間隔が大きいと保持するXLOGファイルが増える。

• アーカイブログ領域

– ベースバックアップ(非一貫性バックアップ)の間で生成されるトランザクションログ。

– 更新トランザクションの量とベースバックアップの頻度から算出。

Page 39: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 39

テーブルのページレイアウト

• テーブルファイルのページブロックは、ページヘッダ、アイテムポインタ、タプルヘッダ、およびタプルデータで構成される。

ページヘッダ

アイテムポインタ1アイテムポインタ2アイテムポインタ3

タプルデータ1

タプルデータ2

タプルデータ3

(空きスペース)

8KBタプルヘッダ3

タプルヘッダ2

タプルヘッダ1

• ページヘッダを除くスペースを、アイテムポインタが前から、レコードデータが後ろから使う。

• アイテムポインタは、タプルヘッダの開始位置、および長さを保持する。

• タプルヘッダは、そのタプルを作成、削除したトランザクションのXIDを保持する(タプルの可視性の判断に使用)。

• ページヘッダ(PageHeaderData 28バイト)

• アイテムポインタ (ItemIdData 4バイト)

• タプルヘッダ (HeapTupleHeaderData 24バイト)

• タプルデータ (可変、データ型に依存)

Page 40: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 40

B-Tree(リーフ)のページレイアウト

• B-Treeインデックスのリーフページブロックは、ページヘッダ、アイテムポインタ、インデックスタプルで構成される。

ページヘッダ

アイテムポインタ1アイテムポインタ2

インデックスタプル1

インデックスタプル2

(空きスペース)8KB

• ページヘッダを除くスペースを、アイテムポインタが前から、インデックスタプルが後ろから使う。

• インデックスタプルは、テーブルファイル内における該当レコードの「ブロック番号」と「アイテム番号」、およびキーの値を保持する。

• スペシャルデータは、B-Treeにおける「隣のノードのブロック番号」や「ツリー中の深さ」を保持する(インデックススキャンで利用)。

• ページヘッダ(PageHeaderData 28バイト)

• インデックスタプル(IndexTupleData 8バイト+可変、キーサイズに依存)

• スペシャルデータ(BTPageOpaqueData 16バイト)

スペシャルデータ

アイテムポインタ3

インデックスタプル3

Page 41: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 41

XLOGブロックのレイアウト

• XLOGファイルの8kBのブロックは、XLOGページヘッダ、XLOGレコードヘッダ、XLOGレコード、およびバックアップブロックで構成される。

XLOGページヘッダ

8KB

• XLOGページヘッダを除くスペースを、前から使う。

• XLOGレコードヘッダは、前のXLOGレコードの位置、トランザクションID、更新の種別などを保持する。

• XLOGレコードは、実際の更新レコードを保持する。

• チェックポイント発生直後のページ更新の際、ページ全体をバックアップブロックとして保存する。(full_page_writesオプション)

• XLOGページヘッダ(XLogPageHeaderData 16バイト)

• XLOGレコードヘッダ (XLogRecord 26バイト)

• XLOGレコード (可変長)

XLOGレコードヘッダ1

XLOGレコード1

XLOGレコードヘッダ2XLOGレコード2

バックアップブロック1

(空きスペース)

XLOGレコードヘッダ3

XLOGレコード3

Page 42: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 42

トランザクションログ領域の見積もり

• 大容量は 16MB×(checkpoint_segments × 3 + 1)

– WALセグメントファイル(16MB)

– 各チェックポイント間の 大WALセグメント数(checkpoint_segments)

– WALを保持しているチェックポイント数(3)

WAL A WAL B

WAL A

WAL C

WAL B

WAL A

WAL D

WAL C

WAL B

Period B(WAL Bを生成)

Period C(WAL Cを生成)

Period D(WAL Dを生成)

WAL A/B/C/Dの 大サイズ→16MB×checkpoint_segments

WAL Aを

再利用

チェックポイント

Page 43: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 43

(参考)pgstattuple/pgstatindex

• テーブルとB-Treeインデックスの統計情報を表示するユーティリティ。

– contribモジュールとしてPostgreSQLソースに同梱

• 使い方

– cd ./contrib/pgstattuple ; make && make install– CREATE EXTENSION pgstattuple;

http://www.postgresql.jp/document/9.1/html/pgstattuple.html

Page 44: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 44

(参考)pageinspect

• ページブロックの内容や統計情報を表示するユーティリティ。

– contribモジュールとしてPostgreSQLソースに同梱

• 使い方

– cd ./contrib/pageinspect ; make && make install– CREATE EXTENSION pageinspect;

http://www.postgresql.jp/document/9.1/html/pageinspect.html

Page 45: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 45

(参考)xlogdump

• WALセグメントファイルの内容や統計情報を表示するユーティリティ。

– http://github.com/snaga/xlogdump• 使い方

– README.xlogdump を参照

https://github.com/snaga/xlogdump/blob/master/README.xlogdump

Page 46: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 46

(参考)pgestimate

• テーブル/インデックスファイルサイズ見積もりツール

http://www.uptime.jp/go/pgestimate

Page 47: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 47

(5)パフォーマンス管理

Page 48: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 48

パフォーマンスは何で決まるか?

• 「単一クエリのレスポンス×クエリの同時実行数」– 単一クエリのレスポンス

• サーバ・クライアント間通信(ネットワーク)

• SQLの構文解析、 適化(CPU処理)

• ロックの競合(ロック待ち、デッドロックの発生)

• テーブル、インデックス、ログへのI/O量(ディスクI/O)

• ソート、結合などの演算処理(CPU処理、ディスクI/O)

– クエリの同時実行数• 接続クライアント数(いわゆるWebユーザ数)

• コネクションプール接続数

• 全体としてハードウェアのキャパシティの範囲内であるか?– ネットワーク、ディスクI/O、メモリ、CPUなどがボトルネックとなり得る。

– ただし、ボトルネック自体は「結果」であり、「原因」ではない。

– 「なぜ、それがボトルネックになっているのか?」が重要。• テーブル設計? SQL文? 同時接続数? HW? 設定パラメータ?・・・

Page 49: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 49

データベースを構成するハードウェアリソース

ネットワークインターフェース

CPU

メモリ

プロセス空間

プロセス空間

プロセス空間

共有メモリ

ディスクキャッシュ

ディスク

データベースサーバ

ネットワーク?

CPUネック?

ソート? スキャン?

ロック待ち?

読み込み? 書き込み?テーブル/インデックス?

トランザクションログ?

スワップ発生?

ディスクソート?

• 複雑な構造を持つRDBMSでは、ボトルネックはいたるところに発生し得

るため、まずはきちんと切り分けることが重要。

– いきなりパラメータチューニングとかを始めない。

Page 50: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 50

パフォーマンス改善の基本手順

• 全体のパフォーマンスの傾向をつかむ– どのデータベース、テーブルへのアクセスか? HWの利用状況はどうか?

• 遅いSQL文を特定する or 実行回数の多いSQLを特定する– log_min_durationオプション– pgFouine

• 特定のSQLだけが遅い場合・・・– SQLのクエリプランおよび実行状況を確認する(EXPLAIN)

• 遅いSQLが特定されない(偏りがない)場合・・・– ハードウェアリソースのボトルネックを探す

• 対策を実施する– SQL文を書き換える、インデックスを張る、テーブル設計を修正する

– アプリケーションを修正する– ハードウェアを増強する– 他・・・

Page 51: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 51

全体の傾向を可視化する

• pg_statinfo/pg_reporterを使って、アクセス統計情報を可視化する。

– データベース統計情報

– ディスク使用状況

– テーブル統計情報

– チェックポイント情報

– Autovacuum実行状況

– SQL文実行状況

– 等・・・

Page 52: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 52

SQLパフォーマンス分析

• pgFouineによる問題SQL文の抽出、ランキング作成

– 総実行時間=レスポンスタイム(実行時間)×実行回数

– 長レスポンスタイム

– 他・・・

Page 53: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 53

pg_stat_statements

• 実行したSQL文の情報(SQL文、回数、時間、ブロックアクセス)を表示

– contribモジュールとしてPostgreSQLソースに同梱

• 使い方

– cd contrib/pg_stat_statements; make && make install– shared_preload_libraries = ‘pg_stat_statements’ @ postgresql.conf– CREATE EXTENSION pg_stat_statements

http://www.postgresql.jp/document/9.1/html/pgstatstatements.html

Page 54: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 54

auto_explain

• 一定以上の時間のかかったSQL文の実行プランを出力

– contribモジュールとしてPostgreSQLソースに同梱

• 使い方

– cd contrib/auto_explain; make && make install– shared_preload_libraries = ‘auto_explain’ @ postgresql.conf– custom_variable_classes = 'auto_explain‘@ postgresql.conf– auto_explain.log_min_duration = ‘1000’ @ postgresql.conf

http://www.postgresql.jp/document/9.1/html/auto-explain.html

Page 55: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 55

(6)可用性管理

Page 56: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 56

バックアップとレストア/リカバリ

• バックアップの難しさ– データはファイルの中にだけあるのではない!

– 通常は、共有バッファの内容が 新

– ファイルだけバックアップを取ってもダメ

– ミリ秒単位で処理が進む中、すべてを一貫性を保った状態で

• バックアップの種類– コールドバックアップ

– ホットバックアップ

– アーカイブログバックアップ

• バックアップ&レストア/リカバリはリハーサルをしよう!– 簡単な試験や手順書を作るだけで満足してはいけない・・・

Page 57: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 57

コールドバックアップ

• サーバプロセスをすべてシャットダウンしてデータファイル全体をバックアップ– バックアップの間、サービス停止が発生する。– リカバリの際には、バックアップ時のデータに戻る。– ファイルバックアップなのでレストアが簡単。

• 向いているケース– 前回バックアップ以降の更新データを、アプリログなどから復旧できる場合。– ストレージスナップショットが一般化した今、案外現実的。

• 向いていないケース– サービスを停止させられない場合。– 障害発生の直前までの更新データが必要で、DB以外から復旧できない場合。

IndexTable

WAL1 WAL2 WAL3

Crash

①ファイルをバックアップ(サービス中断)

②障害発生

③レストア

Page 58: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 58

ホットバックアップ(pg_dump/pg_restore)

• あるタイミングでデータの一貫性を保ちつつバックアップ(export)– シンプルかつ柔軟(テーブル単位のバックアップも可)– バックアップ時にサービス停止は起こらない。– リカバリの際には、バックアップ時のデータに戻る。

• 向いているケース– 前回バックアップ以降の更新データを、アプリログなどから復旧できる場合。– データベース単位、テーブル単位でバックアップを取りたい場合。– 論理バックアップが必要な場合(メジャーバージョンアップなど)

• 向いていないケース– 障害発生の直前までの更新データが必要で、DB以外から復旧できない場合。

①pg_dumpで

スナップショットをバックアップ

IndexTable

WAL1 WAL2 WAL3

Crash

②障害発生

③レストア

Page 59: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 59

アーカイブログとPITRを用いたバックアップ

• ベースバックアップ(基準点)+アーカイブログ(更新差分)

– サービスを継続したままベースバックアップを取得可能(非一貫性バックアップ)

– クラッシュ直前のWALの内容まで復旧することが可能

• 向いているケース

– データベースクラスタ全体の完全なバックアップを取りたい場合。

– クラッシュ直前の更新まで復旧させる必要がある場合。

• 向いていないケース

– データベース単位、テーブル単位などでバックアップを取得したい場合。

レストア&リカバリに必要なファイル類

IndexTable

WAL1①ベースバック

アップの取得(非一貫性

バックアップ)

②WAL1を

アーカイブ

WAL1

WAL2

③WAL2を

アーカイブ

WAL2

WAL3

④WAL3を

アーカイブ

WAL3

Crash

Page 60: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 60

pg_basebackup

• PITRに必要なベースバックアップ(非一貫性バックアップ)を取得する。

– 「データベースクラスタ全体+テーブルスペース」をバックアップ。

– リモートのPostgreSQLのディレクトリ構成をローカルに再現するのが基本。tar形式に

まとめることも可能。

– ユーザに LOGIN 権限と REPLICATION 権限が必要。

• 手順

– バックアップを行うユーザに REPLICATION 権限を与える。

• ALTER ROLE <user> WITH REPLICATION;– pg_hba.conf で REPLICATION 接続を許可する。

• host replication all 10.0.2.0/24 password– postgresql.conf で max_wal_senders, wal_level を設定する(レプリケーションプロト

コルを使うために必要)。• max_wal_senders = 1• wal_level = archive

– pg_basebackupコマンドを実行(サーバdevsv02をtar形式で./backupに保存)

• pg_basebackup –h devsv02 -F t –D ./backup/ -P

http://www.postgresql.jp/document/9.1/html/app-pgbasebackup.html

Page 61: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 61

アーカイブログとPITRを用いたリカバリ

IndexTable

WAL1

①ベースバックアップを展開 ②WAL1を

適用

WAL1

WAL2

③WAL2を

適用

WAL2

WAL3

④WAL3を

適用

WAL3

WAL3適用完了

リカバリ完了

• ベースバックアップ(基準点)+アーカイブログ(更新差分)

– ベースバックアップをレストア後、アーカイブログをロールフォワードリカバリする。

– 前回のベースバックアップ以降、長期間が経過しているとアーカイブログが多くなり、リカバリの時間が長くなる。

– ベースバックアップレストア時間+アーカイブログ適用時間×アーカイブログ数

Page 62: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 62

冗長化方式の選定

• 実現方式を評価するに当たって特に重視すべき点

– 負荷分散の必要性の有無。

– 単一障害点(Single Point of Failure、SPoF)の有無。

– 運用が容易であるかどうか(運用の作業負荷、ノウハウの蓄積)。

– データ一貫性の厳密性(レプリケーション遅延)の程度。

公開されているSlony-Iの運用ノウハウが少ない。バージョン混在可。

△数秒○アクティブ/アクティブ、

マスター/スレーブ

Slony-Iレプリケーション

公開されている運用ノウハウが少ない。遅延なしは9.1以降。

pgpoolサーバがSPOF(冗長化可)。

一部、APへの影響有り(now()等)。

共有ディスクが高価でSPOF。

要DRBD運用ノウハウ。

ウォームスタンバイ方式。

備考

運用性

数百ms~なし(9.1)

なし

なし

なし

数十秒

~数分

同期遅延

○アクティブ/アクティブ、

マスター/スレーブ

pgpool-II

×アクティブ/スタンバイ共有ディスク方式

○アクティブ/アクティブ、

マスター/スレーブ

ストリーミング・レプリケーション(9.0~)

×アクティブ/スタンバイDRBDディスク同期

×

負荷分散

アクティブ/スタンバイ

アーキテクチャ

アーカイブログ転送

実現方式

Page 63: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 63

冗長化方式の選定 cont’d

• PostgreSQLの代表的な冗長化方式の構成は以下の通り。

– シンプルな冗長化のみで良い場合は共有ディスク方式。

– スケールアウトが必要な場合は pgpool か Slony-I。– 9.0以降はストリーミングレプリケーション(SR+HS)構成が可能。

共有ストレージ

読み書き不可

マスタDB スレーブDB

Web/APサーバ Web/APサーバ

マスタDB スレーブDB

Web/APサーバ Web/APサーバ

ログ(レコード)転送

読み込み可

マスタDB スレーブDB

Web/APサーバ Web/APサーバ

pgpoolサーバ

SQL転送

共有ディスク方式 pgpool方式 SR+HS方式

Page 64: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 64

Q&A?

Page 65: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 65

後に御紹介

• 連載「PostgreSQL安定運用のコツ」 vol.32~37• 連載「PostgreSQLよろず相談所」 vol.39~44• 特集記事など多数

• PostgreSQL 9.1特集

WEB+DB PRESS総集編 WEB+DB PRESS vol.65

Page 66: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 66

参考文献

• 書籍・雑誌– WEB+DB PRESS vol.24、25 「徒然PostgreSQL散策」 (技術評論社)– WEB+DB PRESS vol.32~37 「PostgreSQL安定運用のコツ」 (技術評論社)– WEB+DB PRESS vol.63 「Web開発の『べし』 『べからず』 」 (技術評論社)– データベースパフォーマンスアップの教科書 基本原理編 (翔泳社)

• オンラインドキュメント類– PostgreSQL 9.1.1文書

http://www.postgresql.jp/document/pg911doc/html/index.html– Explaining Explain ~ PostgreSQLの実行計画を読む ~ (PDF版)

http://lets.postgresql.jp/documents/technical/query_tuning/explaining_explain_ja.pdf– HOTの仕組み (1) - Let's Postgres

http://lets.postgresql.jp/documents/tutorial/hot_2/– PostgreSQLのチューニング技法 - しくみを知って賢く使う-

http://www.postgresql.jp/events/pgcon09j/doc/b2-3.pdf– スロークエリの分析 - Let's Postgres

http://lets.postgresql.jp/documents/technical/query_analysis– ソーシャルゲームのためのデータベース設計

http://www.slideshare.net/matsunobu/ss-6584540– 高信頼システム構築標準教科書 -仮想化と高可用性-

http://www.lpi.or.jp/linuxtext/system.shtml– MVCC in PostgreSQL

http://chesnok.com/talks/mvcc_couchcamp.pdf– Query Execution Techniques in PostgreSQL

http://neilconway.org/talks/executor.pdf– Robert Haas: Index-Only Scans

http://rhaas.blogspot.com/2010/11/index-only-scans.html

Page 67: PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)

Copyright 2011 Uptime Technologies LLC, All rights reserved. 67

【お問い合わせ先】アップタイム・テクノロジーズ合同会社永安 悟史E-mail: [email protected]: http://www.uptime.jp/