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

53,139 views

Published on

2011年10月19~21日に開催された「INSIGHT OUT 2011」のセッション「PostgreSQLアーキテクチャ入門」の講演資料です。

「INSIGHT OUT 2011」の詳細については、以下を参照ください。
http://www.insight-tec.com/insight-out-2011.html

Published in: Technology
0 Comments
16 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
53,139
On SlideShare
0
From Embeds
0
Number of Embeds
39,259
Actions
Shares
0
Downloads
227
Comments
0
Likes
16
Embeds 0
No embeds

No notes for slide

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

  1. 1. PostgreSQLアーキテクチャ入門 アップタイム・テクノロジーズ合同会社 永安 悟史 2011.10.21 Copyright 2011 Uptime Technologies LLC, All rights reserved. 1
  2. 2. PostgreSQLアーキテクチャ入門 アジェンダ1. アーキテクチャ概要2. クエリの処理3. I/O処理の詳細4. 領域の見積もり5. パフォーマンス管理6. 可用性管理 ※本資料の最新版は以下に掲載されています。 http://www.uptime.jp/ (ホーム→リソース→技術情報) Copyright 2011 Uptime Technologies LLC, All rights reserved. 2
  3. 3. 本セッションのねらい• PostgreSQL でシステムを構築して実運用をするためには、データベース管理者 (DBA)として ある程度内部構造を理解しておく必要があります。• 本講演では、開発や運用において必要とされる技術的知識について、 PostgreSQL の基本的な仕組みからバックアップ&リカバリ、レプリケーションま で、 PostgreSQL の動作原理を俯瞰して解説を行います。• 主に PostgreSQL 初級者から中級者向けの内容です。• 特に以下のような方にオススメです。 – データベースの特に運用管理・パフォーマンス管理に詳しくなりたい方。 – コンピュータアーキテクチャに詳しくなりたい方。 – コンピュータエンジニアリングの基礎を知りたい方。 – 他のRDBMSを利用していて、PostgreSQLについて知りたい方。 Copyright 2011 Uptime Technologies LLC, All rights reserved. 3
  4. 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連載)、他 Copyright 2011 Uptime Technologies LLC, All rights reserved. 4
  5. 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 Copyright 2011 Uptime Technologies LLC, All rights reserved. 5
  6. 6. pgsnaga.blogspot.comCopyright 2011 Uptime Technologies LLC, All rights reserved. 6
  7. 7. (1)アーキテクチャ概要Copyright 2011 Uptime Technologies LLC, All rights reserved. 7
  8. 8. PostgreSQLの構成要素 PostgreSQLは、さまざまなプロセス・メモリ領域・ファイルによって構 成されている。 writer postgres logger wal writer autovacuum (バックグラウンド (リスナプロセス) (サーバログ) (WALライタ) (自動vacuum) ライタ)プロセス群 archiver stat collector postgres wal sender wal receiver (WALアーカイバ) (統計情報収集) (サーバプロセス) (レプリケーション) (レプリケーション) shared_buffers wal_buffers visibilitymap freespacemap トランザクションメモリ群 (共有バッファ) (WALバッファ) (ブロック情報) (空き領域情報) 制御情報ファイル群 テーブル インデックス トランザクション アーカイブ 設定ファイル ファイル ファイル ログファイル ログファイル Copyright 2011 Uptime Technologies LLC, All rights reserved. 8
  9. 9. PostgreSQLの基本的なアーキテクチャ 共有バッファを中心として、複数のプロセス間で連携しながら処理を行うマルチプロセス構造。 postgres (リスナプロセス) ( shared_buffers postgres 共 postgres 有 (サーバプロセス) バ postgres (サーバプロセス)クライアント ッ (サーバプロセス) フ ァ ) writer (バックグラウンド ライタ) トランザクション ログファイル テーブル ファイル インデックス ファイル Copyright 2011 Uptime Technologies LLC, All rights reserved. 9
  10. 10. プロセス• Postgres(旧Postmaster)プロセス – PostgreSQLを起動すると最初に開始されるプロセス。 – クライアントからの接続を受け付け、認証処理を行う。 – 認証されたクライアントに対して、Postgresプロセスを生成(fork)して処理 を引き渡す。• Postgresプロセス – クライアントに対して1対1で存在する。 – クライアントからSQL文を受け付け、構文解析、最適化、実行、結果返却 を行う。 – 共有バッファを介してデータを読み書きし、トランザクションログを書く。• Writerプロセス – 共有バッファの内容をディスク(テーブルファイル、インデックスファイル) に非同期的に書き戻す。バックグラウンドライタとも呼ばれる。 Copyright 2011 Uptime Technologies LLC, All rights reserved. 10
  11. 11. メモリ(共有バッファ)• ディスク上のブロックをキャッシュするメモリ領域 – ディスク上のブロックのうち、アクセスするものだけを読み込む – すべてのバックエンドプロセスで共有• キャッシュすることで、ディスクI/Oを抑えて高速化 – 更新の永続性はトランザクションログで担保する – メモリ上で変更されたブロックは、ライタプロセス(非同期)またはチェックポイ ント(同期)がテーブル/インデックスファイルに書き戻す writer postgres 9 17 5 14 postgres postgres 共有バッファ 1 2 3 4 5 6 7 8 9 10 11 12バックエンド 13 14 15 16 17 18 19 ・・・・ トランザクション ログファイル テーブル/インデックスファイル Copyright 2011 Uptime Technologies LLC, All rights reserved. 11
  12. 12. トランザクションログ(XLOG)• テーブルやインデックスの更新情報が記録(追記)される – 共有バッファのデータを更新する「前」に記録(Write-ahead) – 16MBずつのセグメント(ファイル)に分割されている。 – リカバリの際に読み込まれる (pg_xlog/ 以下に配置) – アーカイブされて、PITRのバックアップ/リカバリで使われる(アーカイブログ) WAL 1 WAL 2 Aテーブルのレコード1をmに変更 Bテーブルのレコード6をnに変更 Aテーブルのレコード4をxに変更 Aテーブルのレコード1をyに変更 Bテーブルのレコード2をzに変更 ファイルの先頭から 順番に更新情報が 追記されていく Copyright 2011 Uptime Technologies LLC, All rights reserved. 12
  13. 13. テーブルファイル• 8kB単位のブロック単位で管理• ブロックの中に実データのレコード(タプル)を配置 – 基本的に追記のみ – 削除したら削除マークを付加する(VACUUMで回収) – レコード更新時は「削除+追記」を行う。 DBT1=# SELECT * FROM pgstattuple(customer); -[ RECORD 1 ]------+----------- レコード1 table_len | 1754857472 レコード2 ブロック1 tuple_count | 3456656 レコード3 tuple_len | 1703225491 レコード4 tuple_percent | 97.06 レコード5 ブロック2 dead_tuple_count | 695 dead_tuple_len | 350038 dead_tuple_percent | 0.02 free_space | 31391624 ブロック3 free_percent | 1.79 DBT1=# Copyright 2011 Uptime Technologies LLC, All rights reserved. 13
  14. 14. インデックス(B-Tree)ファイル• ブロック(8kB単位)をノードとする論理的なツリー構造を持つ – ルート、インターナル、リーフの各ノードから構成 – ルートノードから辿っていく – リーフノードは、インデックスのキーとレコードへのポインタを持つ DBT1=# SELECT * FROM インデックスファイル pgstatindex(customer_pkey); -[ RECORD 1 ]------+---------- version | 2 root tree_level | 2 index_size | 108953600 root_block_no | 217 internal_pages | 66 leaf_pages | 13233 empty_pages | 0 deleted_pages | 0 1~5 6~10 11~17 18~25 avg_leaf_density | 90.2 leaf_fragmentation | 0 DBT1=# Copyright 2011 Uptime Technologies LLC, All rights reserved. 14
  15. 15. 発生する3種類のI/O• 例えば、主キーで検索して該当レコードを更新する場合 – プライマリーキーでインデックスエントリを探す – インデックスのポインタを元に、テーブル内のレコードを探す – テーブルレコードを更新する前にトランザクションログに記録する – テーブルファイルを更新する 物理ディスク テーブルファイル ②読む テーブルファイル テーブルファイル ④書く ディスク ヘッド ①読む インデックスファイル インデックスファイル インデックスファイル ③書く トランザクション ログファイル Copyright 2011 Uptime Technologies LLC, All rights reserved. 15
  16. 16. UNLOGGED TABLE• トランザクションログを書かないテーブル – CREATE UNLOGGED TABLE … – テーブルのページブロックだけディスクに(非同期に)書き出される。 – クラッシュした場合、リスタートのリカバリの際、TRUNCATEされる。 pgbench on UNLOGGED (...and others) 1,800 1,600 1,400 tps (excluding conn.) 1,200 1,000 800 600 400 200 0 fsync = off (only history) sync_commit = LOGGED UNLOGGED UNLOGGED off Copyright 2011 Uptime Technologies LLC, All rights reserved. 16
  17. 17. (参考) I/Oパターンの混在• 複数のアクセスパターンが単一のHDD上に混在すると、パフォーマンス は低下する。 – 物理ディスクをどのように配置するかがストレージ戦略。 8K Sequential Access 7000 6000 5000 4000 IOps 3000 2000 1000 0 100%/0% 75%/25% 50%/50% 25%/75% 0%/100% Read/Write Ratio ※SATA接続のHDD 1台に対してiometerを用いて8kBブロック単位のI/Oで計測。 Copyright 2011 Uptime Technologies LLC, All rights reserved. 17
  18. 18. (2)クエリの処理Copyright 2011 Uptime Technologies LLC, All rights reserved. 18
  19. 19. SQL文の処理される流れ クエリ受信 •SQL構文の解析、文法エラーの検出 構文解析(parse) •構文木(parse tree)の生成 •VIEW / RULE に基づいた構文木の書き換え 書き換え(rewrite)実行計画生成 / 最適化 •最適なクエリプラン(実行計画)の生成 (plan / optimize) •統計情報などを用いて実行コストを最小化 (コストベース最適化) •クエリプランに沿ったデータアクセス、抽出/結合/ 実行(execute) 並べ替えなどの演算処理 •(更新時)トランザクションログ追記、共有バッファ更新 結果送信 Copyright 2011 Uptime Technologies LLC, All rights reserved. 19
  20. 20. クエリとクエリプラン ネステッドループ ジョインテーブルスキャン 集約 count()インデックス スキャン Copyright 2011 Uptime Technologies LLC, All rights reserved. 20
  21. 21. クエリプランの詳細Copyright 2011 Uptime Technologies LLC, All rights reserved. 21
  22. 22. クエリプランの確認方法• EXPLAINコマンド – 最適であると判断された「クエリプラン」を表示。 – 入力されたSQL文を、PostgreSQLがどのように解釈して処理しよう としているのかを表示。• EXPLAIN ANALYZEコマンド – 「クエリプラン」に加えて、「実行結果」を表示。 – 実際に、どのアクセスにどの程度の時間がかかっているのか、何件 のレコードを処理したのか、などを表示。• GUIツールで確認する方法(pgAdminIII) – 「クエリー解釈」=EXPLAIN – 「アナライズ解釈」=EXPLAIN ANALYZE Copyright 2011 Uptime Technologies LLC, All rights reserved. 22
  23. 23. データアクセスのパターン• シーケンシャルアクセス – 全レコード、または多くのレコードを処理する必要がある場合 – 集約処理、LIKE文の中間一致など• ランダムアクセス – 特定のレコード(を含むブロック)だけにアクセスする必要がある場合 – 主にインデックスを用いたアクセスシーケンシャル ランダム アクセス アクセス ファイルの先頭から 順番に読み込んでいく 必要なブロックだけ ピンポイントで読み込む テーブルファイル テーブルファイル Copyright 2011 Uptime Technologies LLC, All rights reserved. 23
  24. 24. テーブルスキャンSELECT count(*) FROM customer; Customer テーブルからの ブロック読込 ×214,216 Customer_pkey インデックスの ブロック読込×0 Copyright 2011 Uptime Technologies LLC, All rights reserved. 24
  25. 25. テーブルスキャン cont’d• すべてのデータを確認する必要があるため、customerテー ブルファイルを構成するブロックを先頭から読み込む – よって、データが増えれば増えるほど時間がかかるようになる。 – この例では、214,216 ブロック(約1.7GB)を読んでいる。 Customer_pkeyインデックス Customerテーブル レコード1 root レコード2 レコード3 レコード4 レコード5 1~5 6~10 11~17 18~25 Copyright 2011 Uptime Technologies LLC, All rights reserved. 25
  26. 26. インデックスアクセスSELECT * FROM customer c WHERE c.c_id=7; Customer テーブルからの ブロック読込×1 Customer_pkey インデックスの ブロック読込×3 Copyright 2011 Uptime Technologies LLC, All rights reserved. 26
  27. 27. インデックスアクセス cont’d• “c_id=7” レコードの位置を探すため、customer_pkeyを辿っ てポインタを見つけ、レコードを含むテーブルファイルのブ ロックを読み込む。 – この例では、customer_pkeyインデックスから3ブロック、customer テーブルから1ブロックを読んでいる。 – レコードの量とディスクアクセス量が比例しない。 Customer_pkeyインデックス Customerテーブル レコード1 root レコード2 レコード3 レコード4 レコード5 1~5 6~10 11~17 18~25 Copyright 2011 Uptime Technologies LLC, All rights reserved. 27
  28. 28. 結合(Nested Loop Join)• SELECT count(*) FROM orders o, customer c WHERE 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 Copyright 2011 Uptime Technologies LLC, All rights reserved. 28
  29. 29. (3)I/O処理詳細Copyright 2011 Uptime Technologies LLC, All rights reserved. 29
  30. 30. テーブルに対する更新処理 レコード1 「レコード5」を追加 レコード1 レコード レコード2 レコード2 追加処理 レコード3 レコード3 レコード4 レコード4(INSERT) レコード5 ファイル中に4件のレコードが 順番に並んでいる レコード5がファイル末尾に追加され、 ファイルサイズが増える 「レコード2」を削除 レコード1 レコード1 レコード レコード2 (レコード2) 削除処理 レコード3 レコード3 レコード4 レコード4(DELETE) ファイル中に4件のレコードが レコード2に削除マークが付けられる 順番に並んでいる 「レコード2」を レコード1 「レコード2’」として更新 レコード1 レコード レコード2 (レコード2) 更新処理 レコード3 レコード3 レコード4 レコード4(UPDATE) レコード2’ ファイル中に4件のレコードが レコード2に削除マークが付けられ、 順番に並んでいる レコード2’が新たに追加、ファイルサイズ増加 Copyright 2011 Uptime Technologies LLC, All rights reserved. 30
  31. 31. タプルの更新とインデックスの更新8.2以前 インデックス付きカラム インデックス無しカラム (例えばユーザID) (例えば住所)ヒープタプル レコード1 レコード1 インデックスのない(テーブル) レコード2 カラムを更新すると・・・ (レコード2) レコード2’ エントリ1 エントリ1 インデックスサイズもインデックス エントリ2 (エントリ2) 増える エントリ2’8.3以降 インデックス付きカラム インデックス無しカラム (例えばユーザID) (例えば住所)ヒープタプル レコード1 レコード1(テーブル) インデックスのない レコード2 カラムを更新すると・・・ (レコード2) ポインタを レコード2’ 貼る エントリ1 エントリ1 インデックスサイズはインデックス エントリ2 エントリ2 増えない インデックスの張られていないカラムを更新すると、 ヒープのみの(インデックスエントリが無い)カラムができ、 インデックスの増加が抑制される。 これが、HOT(Heap Only Tuple) Copyright 2011 Uptime Technologies LLC, All rights reserved. 31
  32. 32. テーブルに対する参照処理(MVCC)• 各タプル(テーブルのレコード)は、作成したトランザクション、または削除したトランザクショ ンのXIDをヘッダに持つ。• 作成・削除したトランザクションID(XID)を参照しながら、「読み飛ばすレコード」を決める。• レコードを読んだり、読み飛ばしたりすることで、MVCCを実現する。 作成 削除 レコードデータ XID XID 作成XID ・・・ レコードを作成したトランザクションのID 削除XID ・・・ レコードを削除したトランザクションID テーブル例 101 - レコードデータ1 101 103 レコードデータ2 103 - レコードデータ3 103 - レコードデータ4 トランザクション101 レコード1とレコード2を作成。コミット。 トランザクション102 トランザクション開始。 トランザクション103 レコード2を削除して、レコード3、レコード4を作成。コミット。 トランザクション102 レコード3、レコード4は参照可、レコード2は参照不可。 Copyright 2011 Uptime Technologies LLC, All rights reserved. 32
  33. 33. VACUUM処理 VACUUM前 VACUUM後 レコード1 レコード1 (レコード2) VACUUM処理 空き領域VACUUM レコード3 レコード3処理 レコード4 レコード4 レコード2’ レコード2’ レコード2に削除マークが レコード2の領域が「空き領域」として 付いている 再利用可能になる。 追記前 追記後 レコード1 レコード5を追記 レコード1 空き領域 レコード5VACUUM レコード3 レコード3してあると レコード4 レコード4 レコード2’ レコード2’ 「空き領域」がある ファイルサイズを変えずに追記できる レコード1 レコード1 レコード5を追記 (レコード2) (レコード2)VACUUM レコード3 レコード3してないと レコード4 レコード4 レコード2’ レコード2’ レコード2の領域が埋まったまま レコード5 ファイルサイズが増加 Copyright 2011 Uptime Technologies LLC, All rights reserved. 33
  34. 34. インデックススキャンとタプルの可視性9.1以前 インデックス ヒープタプル(テーブル) エントリ1 レコード1 エントリ2 レコード2 エントリ3 (レコード3) ページブロックA エントリ4 レコード4 可視? インデックスの指すレコードが可視かどうか(削除されているかどうか)は、 テーブルの行(ヘッダ)にアクセスしないと分からない。9.2dev以降 インデックス ヒープタプル(テーブル) エントリ1 レコード1 エントリ2 レコード2 エントリ3 空き領域 ページブロックA エントリ4 レコード4 可視? Visibility Map 削除されていない、またはVACUUM済の ページのフラグを持つ テーブルブロック内の全タプルが「可視」であることが分かる場合、 インデックススキャンでは各タプルへ参照は行わない。 これが、Index-only Scans Copyright 2011 Uptime Technologies LLC, All rights reserved. 34
  35. 35. Index-only Scans検証• pgbenchベンチマークのaccountsテーブルをcount(*) – データ作成直後は、インデックスのみのスキャンを実行。 – 一部のレコードが削除されると、可視性判断のためにテーブルブロックへのアクセスの 必要性が生じる。 – VACUUMが実施されると、可視性マップが最新化されるので、再度、インデックスのみ でスキャン可能になる。 Index-only Scansにおけるブロック読み込み 4,000 3,500 3,000 読み込みブロック数 2,500 インデックスブロック 2,000 テーブルブロック 1,500 1,000 500 0 作成直後 レコード10%削除後 VACUUM後 count(*)実行タイミング Copyright 2011 Uptime Technologies LLC, All rights reserved. 35
  36. 36. (4)領域の見積もりCopyright 2011 Uptime Technologies LLC, All rights reserved. 36
  37. 37. データファイルの物理的な配置データベースクラスタ(PGDATA) システムカタログ・共有 (global) 設定ファイル (postgresql.conf, pg_hba.conf) テーブルファイル インデックスファイル その他制御ファイル等 デフォルトテーブルスペース(base) トランザクションログ(pg_xlog) ユーザデータベース(OID) テーブルファイル インデックスファイル 外部テーブルスペース×N アーカイブログ Copyright 2011 Uptime Technologies LLC, All rights reserved. 37
  38. 38. 領域の見積もり• ユーザデータ領域 – テーブルファイル • テーブルファイルサイズ=8kB×必要ブロック数 • 必要ブロック数=全レコード数÷1ページ格納レコード数 • 1ページ格納レコード数=ページ利用可能サイズ×平均充填率÷レコードサイズ – インデックスファイル • インデックスファイルサイズ≒8kB×リーフノード数 • リーフノード数=全インデックスエントリ数÷1ページ格納エントリ数 • 1ページ格納エントリ数=ページ利用可能サイズ×平均充填率÷インデックスタプルサイズ• トランザクションログ領域 – 机上での見積もりは難しいので、実際にトランザクションを実行して見積もる。 – チェックポイントの間隔に注意 • 間隔が小さいとバックアップブロック(数kB)を記録する回数が増えてXLOGファイルが増大。 • 間隔が大きいと保持するXLOGファイルが増える。• アーカイブログ領域 – ベースバックアップ(非一貫性バックアップ)の間で生成されるトランザクションログ。 – 更新トランザクションの量とベースバックアップの頻度から算出。 Copyright 2011 Uptime Technologies LLC, All rights reserved. 38
  39. 39. テーブルのページレイアウト • テーブルファイルのページブロックは、ページヘッダ、アイテムポインタ、 タプルヘッダ、およびタプルデータで構成される。 ページヘッダ • ページヘッダを除くスペースを、アイテムポインタ が前から、レコードデータが後ろから使う。 アイテムポインタ1 • アイテムポインタは、タプルヘッダの開始位置、 アイテムポインタ2 および長さを保持する。 アイテムポインタ3 • タプルヘッダは、そのタプルを作成、削除したトラ ンザクションのXIDを保持する(タプルの可視性 (空きスペース) の判断に使用)。8KB タプルヘッダ3 • ページヘッダ(PageHeaderData 28バイト) タプルデータ3 • アイテムポインタ (ItemIdData 4バイト) タプルヘッダ2 • タプルヘッダ (HeapTupleHeaderData 24バイ ト) タプルデータ2 • タプルデータ (可変、データ型に依存) タプルヘッダ1 タプルデータ1 Copyright 2011 Uptime Technologies LLC, All rights reserved. 39
  40. 40. B-Tree(リーフ)のページレイアウト • B-Treeインデックスのリーフページブロックは、ページヘッダ、アイテムポ インタ、インデックスタプルで構成される。 ページヘッダ • ページヘッダを除くスペースを、アイテムポインタ が前から、インデックスタプルが後ろから使う。 アイテムポインタ1 • インデックスタプルは、テーブルファイル内におけ アイテムポインタ2 る該当レコードの「ブロック番号」と「アイテム番 アイテムポインタ3 号」、およびキーの値を保持する。 • スペシャルデータは、B-Treeにおける「隣のノー ドのブロック番号」や「ツリー中の深さ」を保持す (空きスペース) る(インデックススキャンで利用)。8KB • ページヘッダ(PageHeaderData 28バイト) インデックスタプル3 • インデックスタプル(IndexTupleData 8バイト+ 可変、キーサイズに依存) インデックスタプル2 • スペシャルデータ(BTPageOpaqueData 16バイ ト) インデックスタプル1 スペシャルデータ Copyright 2011 Uptime Technologies LLC, All rights reserved. 40
  41. 41. XLOGブロックのレイアウト • XLOGファイルの8kBのブロックは、XLOGページヘッダ、XLOGレコード ヘッダ、XLOGレコード、およびバックアップブロックで構成される。 XLOGページヘッダ • XLOGページヘッダを除くスペースを、前から使 う。 XLOGレコードヘッダ1 • XLOGレコードヘッダは、前のXLOGレコードの 位置、トランザクションID、更新の種別などを保 XLOGレコード1 持する。 XLOGレコードヘッダ2 • XLOGレコードは、実際の更新レコードを保持す XLOGレコード2 る。8KB • チェックポイント発生直後のページ更新の際、 ページ全体をバックアップブロックとして保存する。 バックアップブロック1 (full_page_writesオプション) • XLOGページヘッダ(XLogPageHeaderData 16 XLOGレコードヘッダ3 バイト) XLOGレコード3 • XLOGレコードヘッダ (XLogRecord 26バイト) • XLOGレコード (可変長) (空きスペース) Copyright 2011 Uptime Technologies LLC, All rights reserved. 41
  42. 42. トランザクションログ領域の見積もり• 最大容量は 16MB×(checkpoint_segments × 3 + 1) – WALセグメントファイル(16MB) – 各チェックポイント間の最大WALセグメント数(checkpoint_segments) – WALを保持しているチェックポイント数(3) Period B Period C Period D (WAL Bを生成) (WAL Cを生成) (WAL Dを生成) WAL A WAL B WAL C WAL Aを WAL D 再利用 WAL A WAL B WAL C チェックポイントWAL A/B/C/Dの最大サイズ WAL A WAL B →16MB×checkpoint_segments Copyright 2011 Uptime Technologies LLC, All rights reserved. 42
  43. 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 Copyright 2011 Uptime Technologies LLC, All rights reserved. 43
  44. 44. (参考)pageinspect• ページブロックの内容や統計情報を表示するユーティリティ。 – contribモジュールとしてPostgreSQLソースに同梱• 使い方 – cd ./contrib/pageinspect ; make && make install – CREATE EXTENSION pageinspect; http://www.postgresql.jp/document/9.1/html/pageinspect.html Copyright 2011 Uptime Technologies LLC, All rights reserved. 44
  45. 45. (参考)xlogdump• WALセグメントファイルの内容や統計情報を表示するユーティリティ。 – http://github.com/snaga/xlogdump• 使い方 – README.xlogdump を参照 https://github.com/snaga/xlogdump/blob/master/README.xlogdump Copyright 2011 Uptime Technologies LLC, All rights reserved. 45
  46. 46. (参考)pgestimate• テーブル/インデックスファイルサイズ見積もりツール http://www.uptime.jp/go/pgestimate Copyright 2011 Uptime Technologies LLC, All rights reserved. 46
  47. 47. (5)パフォーマンス管理Copyright 2011 Uptime Technologies LLC, All rights reserved. 47
  48. 48. パフォーマンスは何で決まるか?• 「単一クエリのレスポンス×クエリの同時実行数」 – 単一クエリのレスポンス • サーバ・クライアント間通信(ネットワーク) • SQLの構文解析、最適化(CPU処理) • ロックの競合(ロック待ち、デッドロックの発生) • テーブル、インデックス、ログへのI/O量(ディスクI/O) • ソート、結合などの演算処理(CPU処理、ディスクI/O) – クエリの同時実行数 • 接続クライアント数(いわゆるWebユーザ数) • コネクションプール接続数• 全体としてハードウェアのキャパシティの範囲内であるか? – ネットワーク、ディスクI/O、メモリ、CPUなどがボトルネックとなり得る。 – ただし、ボトルネック自体は「結果」であり、「原因」ではない。 – 「なぜ、それがボトルネックになっているのか?」が重要。 • テーブル設計? SQL文? 同時接続数? HW? 設定パラメータ?・・・ Copyright 2011 Uptime Technologies LLC, All rights reserved. 48
  49. 49. データベースを構成するハードウェアリソース• 複雑な構造を持つRDBMSでは、ボトルネックはいたるところに発生し得 るため、まずはきちんと切り分けることが重要。 – いきなりパラメータチューニングとかを始めない。 CPUネック? ソート? スキャン? CPU ネットワーク インターフェース メモリ ロック待ち? ネットワーク? プロセス空間 プロセス空間 共有メモリ プロセス空間 スワップ発生? ディスクキャッシュ 読み込み? 書き込み? テーブル/インデックス? トランザクションログ? ディスクソート? ディスク データベースサーバ Copyright 2011 Uptime Technologies LLC, All rights reserved. 49
  50. 50. パフォーマンス改善の基本手順• 全体のパフォーマンスの傾向をつかむ – どのデータベース、テーブルへのアクセスか? HWの利用状況はどうか?• 遅いSQL文を特定する or 実行回数の多いSQLを特定する – log_min_durationオプション – pgFouine• 特定のSQLだけが遅い場合・・・ – SQLのクエリプランおよび実行状況を確認する(EXPLAIN)• 遅いSQLが特定されない(偏りがない)場合・・・ – ハードウェアリソースのボトルネックを探す• 対策を実施する – SQL文を書き換える、インデックスを張る、テーブル設計を修正する – アプリケーションを修正する – ハードウェアを増強する – 他・・・ Copyright 2011 Uptime Technologies LLC, All rights reserved. 50
  51. 51. 全体の傾向を可視化する• pg_statinfo/pg_reporterを使って、アクセス統計情報を可視化する。 – データベース統計情報 – ディスク使用状況 – テーブル統計情報 – チェックポイント情報 – Autovacuum実行状況 – SQL文実行状況 – 等・・・ Copyright 2011 Uptime Technologies LLC, All rights reserved. 51
  52. 52. SQLパフォーマンス分析• pgFouineによる問題SQL文の抽出、ランキング作成 – 総実行時間=レスポンスタイム(実行時間)×実行回数 – 最長レスポンスタイム – 他・・・ Copyright 2011 Uptime Technologies LLC, All rights reserved. 52
  53. 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 Copyright 2011 Uptime Technologies LLC, All rights reserved. 53
  54. 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 Copyright 2011 Uptime Technologies LLC, All rights reserved. 54
  55. 55. (6)可用性管理Copyright 2011 Uptime Technologies LLC, All rights reserved. 55
  56. 56. バックアップとレストア/リカバリ• バックアップの難しさ – データはファイルの中にだけあるのではない! – 通常は、共有バッファの内容が最新 – ファイルだけバックアップを取ってもダメ – ミリ秒単位で処理が進む中、すべてを一貫性を保った状態で• バックアップの種類 – コールドバックアップ – ホットバックアップ – アーカイブログバックアップ• バックアップ&レストア/リカバリはリハーサルをしよう! – 簡単な試験や手順書を作るだけで満足してはいけない・・・ Copyright 2011 Uptime Technologies LLC, All rights reserved. 56
  57. 57. コールドバックアップ• サーバプロセスをすべてシャットダウンしてデータファイル全体をバックアップ – バックアップの間、サービス停止が発生する。 – リカバリの際には、バックアップ時のデータに戻る。 – ファイルバックアップなのでレストアが簡単。• 向いているケース – 前回バックアップ以降の更新データを、アプリログなどから復旧できる場合。 – ストレージスナップショットが一般化した今、案外現実的。• 向いていないケース – サービスを停止させられない場合。 – 障害発生の直前までの更新データが必要で、DB以外から復旧できない場合。 Crash ①ファイルを WAL1 WAL2 WAL3 ②障害発生 バックアップ (サービス中断) ③レストア Index Table Copyright 2011 Uptime Technologies LLC, All rights reserved. 57
  58. 58. ホットバックアップ(pg_dump/pg_restore)• あるタイミングでデータの一貫性を保ちつつバックアップ(export) – シンプルかつ柔軟(テーブル単位のバックアップも可) – バックアップ時にサービス停止は起こらない。 – リカバリの際には、バックアップ時のデータに戻る。• 向いているケース – 前回バックアップ以降の更新データを、アプリログなどから復旧できる場合。 – データベース単位、テーブル単位でバックアップを取りたい場合。 – 論理バックアップが必要な場合(メジャーバージョンアップなど)• 向いていないケース – 障害発生の直前までの更新データが必要で、DB以外から復旧できない場合。 Crash WAL1 WAL2 WAL3 ①pg_dumpで ②障害発生 スナップショットを バックアップ ③レストア Index Table Copyright 2011 Uptime Technologies LLC, All rights reserved. 58
  59. 59. アーカイブログとPITRを用いたバックアップ• ベースバックアップ(基準点)+アーカイブログ(更新差分) – サービスを継続したままベースバックアップを取得可能(非一貫性バックアップ) – クラッシュ直前のWALの内容まで復旧することが可能• 向いているケース – データベースクラスタ全体の完全なバックアップを取りたい場合。 – クラッシュ直前の更新まで復旧させる必要がある場合。• 向いていないケース – データベース単位、テーブル単位などでバックアップを取得したい場合。 Crash WAL1 WAL2 WAL3 ①ベースバック アップの取得 (非一貫性 ②WAL1を ③WAL2を ④WAL3を バックアップ) アーカイブ アーカイブ アーカイブ Index WAL1 WAL2 WAL3 Table レストア&リカバリに必要なファイル類 Copyright 2011 Uptime Technologies LLC, All rights reserved. 59
  60. 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 Copyright 2011 Uptime Technologies LLC, All rights reserved. 60
  61. 61. アーカイブログとPITRを用いたリカバリ• ベースバックアップ(基準点)+アーカイブログ(更新差分) – ベースバックアップをレストア後、アーカイブログをロールフォワードリカバリする。 – 前回のベースバックアップ以降、長期間が経過しているとアーカイブログが多くなり、リ カバリの時間が長くなる。 – ベースバックアップレストア時間+アーカイブログ適用時間×アーカイブログ数 WAL3適用完了 リカバリ完了 WAL1 WAL2 WAL3 ①ベースバック アップを展開 ②WAL1を ③WAL2を ④WAL3を 適用 適用 適用 Index WAL1 WAL2 WAL3 Table Copyright 2011 Uptime Technologies LLC, All rights reserved. 61
  62. 62. 冗長化方式の選定• 実現方式を評価するに当たって特に重視すべき点 – 負荷分散の必要性の有無。 – 単一障害点(Single Point of Failure、SPoF)の有無。 – 運用が容易であるかどうか(運用の作業負荷、ノウハウの蓄積)。 – データ一貫性の厳密性(レプリケーション遅延)の程度。実現方式 アーキテクチャ 負荷分散 同期遅延 運用性 備考アーカイブログ転送 アクティブ/スタンバイ × 数十秒 ◎ ウォームスタンバイ方式。 ~数分DRBDディスク同期 アクティブ/スタンバイ × なし △ 要DRBD運用ノウハウ。共有ディスク方式 アクティブ/スタンバイ × なし △ 共有ディスクが高価でSPOF。Slony-Iレプリケー アクティブ/アクティブ、 ○ 数秒 △ 公開されているSlony-Iの運用ノウハション マスター/スレーブ ウが少ない。バージョン混在可。pgpool-II アクティブ/アクティブ、 ○ なし ○ pgpoolサーバがSPOF(冗長化可)。 マスター/スレーブ 一部、APへの影響有り(now()等)。ストリーミング・レプリ アクティブ/アクティブ、 ○ 数百ms~ △ 公開されている運用ノウハウが少なケーション(9.0~) マスター/スレーブ なし(9.1) い。遅延なしは9.1以降。 Copyright 2011 Uptime Technologies LLC, All rights reserved. 62
  63. 63. 冗長化方式の選定 cont’d• PostgreSQLの代表的な冗長化方式の構成は以下の通り。 – シンプルな冗長化のみで良い場合は共有ディスク方式。 – スケールアウトが必要な場合は pgpool か Slony-I。 – 9.0以降はストリーミングレプリケーション(SR+HS)構成が可能。 共有ディスク方式 pgpool方式 SR+HS方式 Web/APサーバ Web/APサーバ Web/APサーバ Web/APサーバ Web/APサーバ Web/APサーバ 読み書き 読み込み可 不可 pgpoolサーバ マスタDB スレーブDB マスタDB スレーブDB SQL転送 ログ(レコード)転送 マスタDB スレーブDB 共有ストレージ Copyright 2011 Uptime Technologies LLC, All rights reserved. 63
  64. 64. Q&A?Copyright 2011 Uptime Technologies LLC, All rights reserved. 64
  65. 65. 最後に御紹介 WEB+DB PRESS総集編 WEB+DB PRESS vol.65• 連載「PostgreSQL安定運用のコツ」 vol.32~37 • PostgreSQL 9.1特集• 連載「PostgreSQLよろず相談所」 vol.39~44• 特集記事など多数 Copyright 2011 Uptime Technologies LLC, All rights reserved. 65
  66. 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) - Lets Postgres http://lets.postgresql.jp/documents/tutorial/hot_2/ – PostgreSQLのチューニング技法 - しくみを知って賢く使う- http://www.postgresql.jp/events/pgcon09j/doc/b2-3.pdf – スロークエリの分析 - Lets 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 Copyright 2011 Uptime Technologies LLC, All rights reserved. 66
  67. 67. 【お問い合わせ先】アップタイム・テクノロジーズ合同会社永安 悟史E-mail: snaga@uptime.jpWeb: http://www.uptime.jp/ Copyright 2011 Uptime Technologies LLC, All rights reserved. 67

×