SlideShare a Scribd company logo
1 of 67
Download to read offline
PostgreSQLアーキテクチャ入門




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

                      永安 悟史

                     2011.10.21


  Copyright 2011 Uptime Technologies LLC, All rights reserved.   1
PostgreSQLアーキテクチャ入門
                  アジェンダ
1.   アーキテクチャ概要
2.   クエリの処理
3.   I/O処理の詳細
4.   領域の見積もり
5.   パフォーマンス管理
6.   可用性管理




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

           Copyright 2011 Uptime Technologies LLC, All rights reserved.        2
本セッションのねらい
•   PostgreSQL でシステムを構築して実運用をするためには、データベース管理者
    (DBA)として ある程度内部構造を理解しておく必要があります。

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

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

•   特に以下のような方にオススメです。
    –   データベースの特に運用管理・パフォーマンス管理に詳しくなりたい方。
    –   コンピュータアーキテクチャに詳しくなりたい方。
    –   コンピュータエンジニアリングの基礎を知りたい方。
    –   他のRDBMSを利用していて、PostgreSQLについて知りたい方。




                Copyright 2011 Uptime Technologies LLC, All rights reserved.   3
自己紹介
•   氏名
    –   永安 悟史 (ながやす さとし)

•   略歴
    –   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
開発している・していたもの
•   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
pgsnaga.blogspot.com




Copyright 2011 Uptime Technologies LLC, All rights reserved.   6
(1)アーキテクチャ概要




Copyright 2011 Uptime Technologies LLC, All rights reserved.   7
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
PostgreSQLの基本的なアーキテクチャ
 共有バッファを中心として、複数のプロセス間で連携しながら処理を
行うマルチプロセス構造。


                postgres
             (リスナプロセス)

                                                                                 (




                                                                                     shared_buffers
                                         postgres                                共
                                           postgres                              有
                                      (サーバプロセス)                                  バ
                                             postgres
                                       (サーバプロセス)
クライアント                                                                           ッ
                                        (サーバプロセス)                                フ
                                                                                 ァ
                                                                                 )
                                                       writer
                                                    (バックグラウンド
                                                       ライタ)


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

                                                                        インデックス
                                                                         ファイル

         Copyright 2011 Uptime Technologies LLC, All rights reserved.                                 9
プロセス
•   Postgres(旧Postmaster)プロセス
    – PostgreSQLを起動すると最初に開始されるプロセス。
    – クライアントからの接続を受け付け、認証処理を行う。
    – 認証されたクライアントに対して、Postgresプロセスを生成(fork)して処理
      を引き渡す。


•   Postgresプロセス
    – クライアントに対して1対1で存在する。
    – クライアントからSQL文を受け付け、構文解析、最適化、実行、結果返却
      を行う。
    – 共有バッファを介してデータを読み書きし、トランザクションログを書く。


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



                 Copyright 2011 Uptime Technologies LLC, All rights reserved.   10
メモリ(共有バッファ)
•    ディスク上のブロックをキャッシュするメモリ領域
      – ディスク上のブロックのうち、アクセスするものだけを読み込む
      – すべてのバックエンドプロセスで共有
•    キャッシュすることで、ディスク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
トランザクションログ(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
テーブルファイル
•   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
インデックス(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
発生する3種類のI/O
•   例えば、主キーで検索して該当レコードを更新する場合
    –   プライマリーキーでインデックスエントリを探す
    –   インデックスのポインタを元に、テーブル内のレコードを探す
    –   テーブルレコードを更新する前にトランザクションログに記録する
    –   テーブルファイルを更新する


                                                                                物理ディスク
           テーブルファイル                        ②読む
            テーブルファイル
             テーブルファイル
                                     ④書く
                                                                                 ディスク
                                                                                 ヘッド
                                         ①読む
           インデックスファイル
            インデックスファイル
             インデックスファイル


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


                 Copyright 2011 Uptime Technologies LLC, All rights reserved.            15
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
(参考) 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
(2)クエリの処理




Copyright 2011 Uptime Technologies LLC, All rights reserved.   18
SQL文の処理される流れ
    クエリ受信

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


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



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

                               •クエリプランに沿ったデータアクセス、抽出/結合/
   実行(execute)                  並べ替えなどの演算処理
                               •(更新時)トランザクションログ追記、共有バッファ更新

     結果送信
                 Copyright 2011 Uptime Technologies LLC, All rights reserved.   19
クエリとクエリプラン




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


テーブル
スキャン




                                                                        集約 count()


インデックス
 スキャン


         Copyright 2011 Uptime Technologies LLC, All rights reserved.                20
クエリプランの詳細




Copyright 2011 Uptime Technologies LLC, All rights reserved.   21
クエリプランの確認方法
• EXPLAINコマンド
  – 最適であると判断された「クエリプラン」を表示。
  – 入力されたSQL文を、PostgreSQLがどのように解釈して処理しよう
    としているのかを表示。


• EXPLAIN ANALYZEコマンド
  – 「クエリプラン」に加えて、「実行結果」を表示。
  – 実際に、どのアクセスにどの程度の時間がかかっているのか、何件
    のレコードを処理したのか、などを表示。



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

            Copyright 2011 Uptime Technologies LLC, All rights reserved.   22
データアクセスのパターン
• シーケンシャルアクセス
  – 全レコード、または多くのレコードを処理する必要がある場合
  – 集約処理、LIKE文の中間一致など
• ランダムアクセス
  – 特定のレコード(を含むブロック)だけにアクセスする必要がある場合
  – 主にインデックスを用いたアクセス




シーケンシャル                                                 ランダム
  アクセス                                                  アクセス

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


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

                Copyright 2011 Uptime Technologies LLC, All rights reserved.          23
テーブルスキャン
SELECT count(*) FROM customer;
                                                                       Customer
                                                                     テーブルからの
                                                                      ブロック読込
                                                                      ×214,216




                                                                   Customer_pkey
                                                                    インデックスの
                                                                   ブロック読込×0




    Copyright 2011 Uptime Technologies LLC, All rights reserved.                   24
テーブルスキャン 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
インデックスアクセス
SELECT * FROM customer c WHERE c.c_id=7;
                                                                          Customer
                                                                        テーブルからの
                                                                        ブロック読込×1




                                                                        Customer_pkey
                                                                         インデックスの
                                                                        ブロック読込×3




         Copyright 2011 Uptime Technologies LLC, All rights reserved.                   26
インデックスアクセス 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
結合(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
(3)I/O処理詳細




Copyright 2011 Uptime Technologies LLC, All rights reserved.   29
テーブルに対する更新処理
              レコード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
タプルの更新とインデックスの更新
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
テーブルに対する参照処理(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
VACUUM処理
            VACUUM前                                                                   VACUUM後
              レコード1                                                                    レコード1
             (レコード2)
                                            VACUUM処理
                                                                                       空き領域
VACUUM        レコード3                                                                    レコード3
処理            レコード4                                                                    レコード4
              レコード2’                                                                   レコード2’
         レコード2に削除マークが                                                      レコード2の領域が「空き領域」として
         付いている                                                             再利用可能になる。

            追記前                                                                       追記後
             レコード1                          レコード5を追記                                   レコード1
             空き領域                                                                      レコード5
VACUUM       レコード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
インデックススキャンとタプルの可視性
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
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
(4)領域の見積もり




Copyright 2011 Uptime Technologies LLC, All rights reserved.   36
データファイルの物理的な配置

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

  システムカタログ・共有 (global)                                     設定ファイル
                                                  (postgresql.conf, pg_hba.conf)
            テーブルファイル

            インデックスファイル                                    その他制御ファイル等


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

       ユーザデータベース(OID)
            テーブルファイル

            インデックスファイル



    外部テーブルスペース×N                                                  アーカイブログ



             Copyright 2011 Uptime Technologies LLC, All rights reserved.          37
領域の見積もり
•   ユーザデータ領域
    – テーブルファイル
      • テーブルファイルサイズ=8kB×必要ブロック数
      • 必要ブロック数=全レコード数÷1ページ格納レコード数
      • 1ページ格納レコード数=ページ利用可能サイズ×平均充填率÷レコードサイズ
    – インデックスファイル
      • インデックスファイルサイズ≒8kB×リーフノード数
      • リーフノード数=全インデックスエントリ数÷1ページ格納エントリ数
      • 1ページ格納エントリ数=ページ利用可能サイズ×平均充填率÷インデックスタプルサイズ


•   トランザクションログ領域
    – 机上での見積もりは難しいので、実際にトランザクションを実行して見積もる。
    – チェックポイントの間隔に注意
      • 間隔が小さいとバックアップブロック(数kB)を記録する回数が増えてXLOGファイルが増大。
      • 間隔が大きいと保持するXLOGファイルが増える。


•   アーカイブログ領域
    – ベースバックアップ(非一貫性バックアップ)の間で生成されるトランザクションログ。
    – 更新トランザクションの量とベースバックアップの頻度から算出。
                 Copyright 2011 Uptime Technologies LLC, All rights reserved.   38
テーブルのページレイアウト
 •    テーブルファイルのページブロックは、ページヘッダ、アイテムポインタ、
      タプルヘッダ、およびタプルデータで構成される。

         ページヘッダ                     •     ページヘッダを除くスペースを、アイテムポインタ
                                          が前から、レコードデータが後ろから使う。
        アイテムポインタ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
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
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
トランザクションログ領域の見積もり
•   最大容量は 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
(参考)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
(参考)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
(参考)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
(参考)pgestimate
•   テーブル/インデックスファイルサイズ見積もりツール




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




            Copyright 2011 Uptime Technologies LLC, All rights reserved.            46
(5)パフォーマンス管理




Copyright 2011 Uptime Technologies LLC, All rights reserved.   47
パフォーマンスは何で決まるか?
•   「単一クエリのレスポンス×クエリの同時実行数」
    – 単一クエリのレスポンス
      •   サーバ・クライアント間通信(ネットワーク)
      •   SQLの構文解析、最適化(CPU処理)
      •   ロックの競合(ロック待ち、デッドロックの発生)
      •   テーブル、インデックス、ログへのI/O量(ディスクI/O)
      •   ソート、結合などの演算処理(CPU処理、ディスクI/O)
    – クエリの同時実行数
      • 接続クライアント数(いわゆるWebユーザ数)
      • コネクションプール接続数

•   全体としてハードウェアのキャパシティの範囲内であるか?
    – ネットワーク、ディスクI/O、メモリ、CPUなどがボトルネックとなり得る。
    – ただし、ボトルネック自体は「結果」であり、「原因」ではない。
    – 「なぜ、それがボトルネックになっているのか?」が重要。
      • テーブル設計? SQL文? 同時接続数? HW? 設定パラメータ?・・・




                 Copyright 2011 Uptime Technologies LLC, All rights reserved.   48
データベースを構成するハードウェアリソース
•   複雑な構造を持つRDBMSでは、ボトルネックはいたるところに発生し得
    るため、まずはきちんと切り分けることが重要。
     – いきなりパラメータチューニングとかを始めない。
                                                                                    CPUネック?
                                                                                  ソート? スキャン?
                                                            CPU

               ネットワーク
              インターフェース                                      メモリ                     ロック待ち?
    ネットワーク?
                                          プロセス空間


                                          プロセス空間                       共有メモリ

                                          プロセス空間

                   スワップ発生?                           ディスクキャッシュ                  読み込み? 書き込み?
                                                                                テーブル/インデックス?
                                                                                 トランザクションログ?
                            ディスクソート?


                                                               ディスク
              データベースサーバ

                 Copyright 2011 Uptime Technologies LLC, All rights reserved.                  49
パフォーマンス改善の基本手順
•   全体のパフォーマンスの傾向をつかむ
    – どのデータベース、テーブルへのアクセスか? HWの利用状況はどうか?

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

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

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

•   対策を実施する
    –   SQL文を書き換える、インデックスを張る、テーブル設計を修正する
    –   アプリケーションを修正する
    –   ハードウェアを増強する
    –   他・・・

                  Copyright 2011 Uptime Technologies LLC, All rights reserved.   50
全体の傾向を可視化する
•   pg_statinfo/pg_reporterを使って、アクセス統計情報を可視化する。
    –   データベース統計情報
    –   ディスク使用状況
    –   テーブル統計情報
    –   チェックポイント情報
    –   Autovacuum実行状況
    –   SQL文実行状況
    – 等・・・




                 Copyright 2011 Uptime Technologies LLC, All rights reserved.   51
SQLパフォーマンス分析
•   pgFouineによる問題SQL文の抽出、ランキング作成
    – 総実行時間=レスポンスタイム(実行時間)×実行回数
    – 最長レスポンスタイム
    – 他・・・




             Copyright 2011 Uptime Technologies LLC, All rights reserved.   52
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
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
(6)可用性管理




Copyright 2011 Uptime Technologies LLC, All rights reserved.   55
バックアップとレストア/リカバリ
• バックアップの難しさ
 –   データはファイルの中にだけあるのではない!
 –   通常は、共有バッファの内容が最新
 –   ファイルだけバックアップを取ってもダメ
 –   ミリ秒単位で処理が進む中、すべてを一貫性を保った状態で


• バックアップの種類
 – コールドバックアップ
 – ホットバックアップ
 – アーカイブログバックアップ


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

           Copyright 2011 Uptime Technologies LLC, All rights reserved.   56
コールドバックアップ
•   サーバプロセスをすべてシャットダウンしてデータファイル全体をバックアップ
    – バックアップの間、サービス停止が発生する。
    – リカバリの際には、バックアップ時のデータに戻る。
    – ファイルバックアップなのでレストアが簡単。
•   向いているケース
    – 前回バックアップ以降の更新データを、アプリログなどから復旧できる場合。
    – ストレージスナップショットが一般化した今、案外現実的。
•   向いていないケース
    – サービスを停止させられない場合。
    – 障害発生の直前までの更新データが必要で、DB以外から復旧できない場合。



                                                                                   Crash

               ①ファイルを  WAL1                        WAL2                   WAL3
                                                                                   ②障害発生
                バックアップ
                (サービス中断)
                                                                                    ③レストア

           Index
       Table

                    Copyright 2011 Uptime Technologies LLC, All rights reserved.            57
ホットバックアップ(pg_dump/pg_restore)
•   あるタイミングでデータの一貫性を保ちつつバックアップ(export)
    – シンプルかつ柔軟(テーブル単位のバックアップも可)
    – バックアップ時にサービス停止は起こらない。
    – リカバリの際には、バックアップ時のデータに戻る。
•   向いているケース
    – 前回バックアップ以降の更新データを、アプリログなどから復旧できる場合。
    – データベース単位、テーブル単位でバックアップを取りたい場合。
    – 論理バックアップが必要な場合(メジャーバージョンアップなど)
•   向いていないケース
    – 障害発生の直前までの更新データが必要で、DB以外から復旧できない場合。



                                                                                    Crash
                         WAL1                       WAL2                   WAL3
               ①pg_dumpで                                                            ②障害発生
                スナップショットを
                バックアップ
                                                                                     ③レストア

           Index
       Table

                     Copyright 2011 Uptime Technologies LLC, All rights reserved.            58
アーカイブログとPITRを用いたバックアップ
•   ベースバックアップ(基準点)+アーカイブログ(更新差分)
    – サービスを継続したままベースバックアップを取得可能(非一貫性バックアップ)
    – クラッシュ直前のWALの内容まで復旧することが可能
•   向いているケース
    – データベースクラスタ全体の完全なバックアップを取りたい場合。
    – クラッシュ直前の更新まで復旧させる必要がある場合。
•   向いていないケース
    – データベース単位、テーブル単位などでバックアップを取得したい場合。

                                                                                       Crash
                             WAL1                   WAL2                    WAL3
               ①ベースバック
                アップの取得
                (非一貫性              ②WAL1を                  ③WAL2を                  ④WAL3を
                 バックアップ)            アーカイブ                   アーカイブ                   アーカイブ



           Index
                             WAL1                   WAL2                    WAL3
       Table
                   レストア&リカバリに必要なファイル類
                    Copyright 2011 Uptime Technologies LLC, All rights reserved.               59
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
アーカイブログとPITRを用いたリカバリ
•   ベースバックアップ(基準点)+アーカイブログ(更新差分)
    – ベースバックアップをレストア後、アーカイブログをロールフォワードリカバリする。
    – 前回のベースバックアップ以降、長期間が経過しているとアーカイブログが多くなり、リ
      カバリの時間が長くなる。
    – ベースバックアップレストア時間+アーカイブログ適用時間×アーカイブログ数

                                                                                      WAL3適用完了
                                                                                      リカバリ完了




                       WAL1                   WAL2                    WAL3

             ①ベースバック
              アップを展開         ②WAL1を                  ③WAL2を                  ④WAL3を
                              適用                      適用                      適用



         Index
                       WAL1                   WAL2                    WAL3
     Table


                       Copyright 2011 Uptime Technologies LLC, All rights reserved.          61
冗長化方式の選定
•    実現方式を評価するに当たって特に重視すべき点
      – 負荷分散の必要性の有無。
      – 単一障害点(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
冗長化方式の選定 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
Q&A?




Copyright 2011 Uptime Technologies LLC, All rights reserved.   64
最後に御紹介
    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
参考文献
•   書籍・雑誌
    –   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



                               Copyright 2011 Uptime Technologies LLC, All rights reserved.    66
【お問い合わせ先】
アップタイム・テクノロジーズ合同会社
永安 悟史
E-mail: snaga@uptime.jp
Web: http://www.uptime.jp/

                  Copyright 2011 Uptime Technologies LLC, All rights reserved.   67

More Related Content

What's hot

PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)NTT DATA Technology & Innovation
 
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!NTT DATA Technology & Innovation
 
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...NTT DATA Technology & Innovation
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションMasahiko Sawada
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)NTT DATA Technology & Innovation
 
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)NTT DATA Technology & Innovation
 
Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Masahiko Sawada
 
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)NTT DATA Technology & Innovation
 
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)NTT DATA Technology & Innovation
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!Tetsutaro Watanabe
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)NTT DATA Technology & Innovation
 
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...NTT DATA Technology & Innovation
 
PostgreSQL運用管理入門
PostgreSQL運用管理入門PostgreSQL運用管理入門
PostgreSQL運用管理入門Yoshiyuki Asaba
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介Tetsutaro Watanabe
 

What's hot (20)

PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
 
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
 
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
 
NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦
 
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
 
Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会
 
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
 
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
 
PostgreSQL運用管理入門
PostgreSQL運用管理入門PostgreSQL運用管理入門
PostgreSQL運用管理入門
 
Hadoop入門
Hadoop入門Hadoop入門
Hadoop入門
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
 

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

PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)Uptime Technologies LLC (JP)
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努Insight Technology, Inc.
 
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014Shigeru Hanada
 
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@KyotoPostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@KyotoShigeru Hanada
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012Shigeru Hanada
 
HAクラスタで PostgreSQLレプリケーション構成の 高可用化
HAクラスタで PostgreSQLレプリケーション構成の 高可用化HAクラスタで PostgreSQLレプリケーション構成の 高可用化
HAクラスタで PostgreSQLレプリケーション構成の 高可用化Takatoshi Matsuo
 
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009Ryota Watabe
 
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会Shigeru Hanada
 
JTF2021w F3 postgresql frontline
JTF2021w F3 postgresql frontlineJTF2021w F3 postgresql frontline
JTF2021w F3 postgresql frontlineHaruka Takatsuka
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャKohei KaiGai
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)Kosuke Kida
 
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜gree_tech
 
ログブラウズ、解析サービスSumologicの紹介
ログブラウズ、解析サービスSumologicの紹介ログブラウズ、解析サービスSumologicの紹介
ログブラウズ、解析サービスSumologicの紹介Yasuhiro Araki, Ph.D
 
rsyslog + SE-PostgreSQL = ???
rsyslog + SE-PostgreSQL = ???rsyslog + SE-PostgreSQL = ???
rsyslog + SE-PostgreSQL = ???Hiroki Ishikawa
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会Shigeru Hanada
 

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

いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
 
PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
 
PostgreSQL安定運用のコツ2009 @hbstudy#5
PostgreSQL安定運用のコツ2009 @hbstudy#5PostgreSQL安定運用のコツ2009 @hbstudy#5
PostgreSQL安定運用のコツ2009 @hbstudy#5
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
 
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
 
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@KyotoPostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
 
HAクラスタで PostgreSQLレプリケーション構成の 高可用化
HAクラスタで PostgreSQLレプリケーション構成の 高可用化HAクラスタで PostgreSQLレプリケーション構成の 高可用化
HAクラスタで PostgreSQLレプリケーション構成の 高可用化
 
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
 
Nginx
NginxNginx
Nginx
 
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
 
JTF2021w F3 postgresql frontline
JTF2021w F3 postgresql frontlineJTF2021w F3 postgresql frontline
JTF2021w F3 postgresql frontline
 
Fluentd casual
Fluentd casualFluentd casual
Fluentd casual
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)
 
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
 
ログブラウズ、解析サービスSumologicの紹介
ログブラウズ、解析サービスSumologicの紹介ログブラウズ、解析サービスSumologicの紹介
ログブラウズ、解析サービスSumologicの紹介
 
rsyslog + SE-PostgreSQL = ???
rsyslog + SE-PostgreSQL = ???rsyslog + SE-PostgreSQL = ???
rsyslog + SE-PostgreSQL = ???
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
 

More from Uptime Technologies LLC (JP)

PL/Pythonで独自の集約関数を作ってみる
PL/Pythonで独自の集約関数を作ってみるPL/Pythonで独自の集約関数を作ってみる
PL/Pythonで独自の集約関数を作ってみるUptime Technologies LLC (JP)
 
pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法Uptime Technologies LLC (JP)
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisitedUptime Technologies LLC (JP)
 
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告Uptime Technologies LLC (JP)
 
Uptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビューUptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビューUptime Technologies LLC (JP)
 
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#135ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13Uptime Technologies LLC (JP)
 

More from Uptime Technologies LLC (JP) (10)

PL/Pythonで独自の集約関数を作ってみる
PL/Pythonで独自の集約関数を作ってみるPL/Pythonで独自の集約関数を作ってみる
PL/Pythonで独自の集約関数を作ってみる
 
PostgreSQLセキュリティ総復習
PostgreSQLセキュリティ総復習PostgreSQLセキュリティ総復習
PostgreSQLセキュリティ総復習
 
Postgres Toolkit
Postgres ToolkitPostgres Toolkit
Postgres Toolkit
 
Postgres Toolkitのご紹介
Postgres Toolkitのご紹介Postgres Toolkitのご紹介
Postgres Toolkitのご紹介
 
pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited
 
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
 
PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"
 
Uptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビューUptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビュー
 
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#135ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
 

Recently uploaded

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 

Recently uploaded (10)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 

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

  • 1. PostgreSQLアーキテクチャ入門 アップタイム・テクノロジーズ合同会社 永安 悟史 2011.10.21 Copyright 2011 Uptime Technologies LLC, All rights reserved. 1
  • 2. PostgreSQLアーキテクチャ入門 アジェンダ 1. アーキテクチャ概要 2. クエリの処理 3. I/O処理の詳細 4. 領域の見積もり 5. パフォーマンス管理 6. 可用性管理 ※本資料の最新版は以下に掲載されています。 http://www.uptime.jp/ (ホーム→リソース→技術情報) Copyright 2011 Uptime Technologies LLC, All rights reserved. 2
  • 3. 本セッションのねらい • PostgreSQL でシステムを構築して実運用をするためには、データベース管理者 (DBA)として ある程度内部構造を理解しておく必要があります。 • 本講演では、開発や運用において必要とされる技術的知識について、 PostgreSQL の基本的な仕組みからバックアップ&リカバリ、レプリケーションま で、 PostgreSQL の動作原理を俯瞰して解説を行います。 • 主に PostgreSQL 初級者から中級者向けの内容です。 • 特に以下のような方にオススメです。 – データベースの特に運用管理・パフォーマンス管理に詳しくなりたい方。 – コンピュータアーキテクチャに詳しくなりたい方。 – コンピュータエンジニアリングの基礎を知りたい方。 – 他のRDBMSを利用していて、PostgreSQLについて知りたい方。 Copyright 2011 Uptime Technologies LLC, All rights reserved. 3
  • 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. 開発している・していたもの • 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. pgsnaga.blogspot.com Copyright 2011 Uptime Technologies LLC, All rights reserved. 6
  • 7. (1)アーキテクチャ概要 Copyright 2011 Uptime Technologies LLC, All rights reserved. 7
  • 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. PostgreSQLの基本的なアーキテクチャ 共有バッファを中心として、複数のプロセス間で連携しながら処理を 行うマルチプロセス構造。 postgres (リスナプロセス) ( shared_buffers postgres 共 postgres 有 (サーバプロセス) バ postgres (サーバプロセス) クライアント ッ (サーバプロセス) フ ァ ) writer (バックグラウンド ライタ) トランザクション ログファイル テーブル ファイル インデックス ファイル Copyright 2011 Uptime Technologies LLC, All rights reserved. 9
  • 10. プロセス • Postgres(旧Postmaster)プロセス – PostgreSQLを起動すると最初に開始されるプロセス。 – クライアントからの接続を受け付け、認証処理を行う。 – 認証されたクライアントに対して、Postgresプロセスを生成(fork)して処理 を引き渡す。 • Postgresプロセス – クライアントに対して1対1で存在する。 – クライアントからSQL文を受け付け、構文解析、最適化、実行、結果返却 を行う。 – 共有バッファを介してデータを読み書きし、トランザクションログを書く。 • Writerプロセス – 共有バッファの内容をディスク(テーブルファイル、インデックスファイル) に非同期的に書き戻す。バックグラウンドライタとも呼ばれる。 Copyright 2011 Uptime Technologies LLC, All rights reserved. 10
  • 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. トランザクションログ(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. テーブルファイル • 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. インデックス(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. 発生する3種類のI/O • 例えば、主キーで検索して該当レコードを更新する場合 – プライマリーキーでインデックスエントリを探す – インデックスのポインタを元に、テーブル内のレコードを探す – テーブルレコードを更新する前にトランザクションログに記録する – テーブルファイルを更新する 物理ディスク テーブルファイル ②読む テーブルファイル テーブルファイル ④書く ディスク ヘッド ①読む インデックスファイル インデックスファイル インデックスファイル ③書く トランザクション ログファイル Copyright 2011 Uptime Technologies LLC, All rights reserved. 15
  • 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. (参考) 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. (2)クエリの処理 Copyright 2011 Uptime Technologies LLC, All rights reserved. 18
  • 19. SQL文の処理される流れ クエリ受信 •SQL構文の解析、文法エラーの検出 構文解析(parse) •構文木(parse tree)の生成 •VIEW / RULE に基づいた構文木の書き換え 書き換え(rewrite) 実行計画生成 / 最適化 •最適なクエリプラン(実行計画)の生成 (plan / optimize) •統計情報などを用いて実行コストを最小化 (コストベース最適化) •クエリプランに沿ったデータアクセス、抽出/結合/ 実行(execute) 並べ替えなどの演算処理 •(更新時)トランザクションログ追記、共有バッファ更新 結果送信 Copyright 2011 Uptime Technologies LLC, All rights reserved. 19
  • 20. クエリとクエリプラン ネステッドループ ジョイン テーブル スキャン 集約 count() インデックス スキャン Copyright 2011 Uptime Technologies LLC, All rights reserved. 20
  • 21. クエリプランの詳細 Copyright 2011 Uptime Technologies LLC, All rights reserved. 21
  • 22. クエリプランの確認方法 • EXPLAINコマンド – 最適であると判断された「クエリプラン」を表示。 – 入力されたSQL文を、PostgreSQLがどのように解釈して処理しよう としているのかを表示。 • EXPLAIN ANALYZEコマンド – 「クエリプラン」に加えて、「実行結果」を表示。 – 実際に、どのアクセスにどの程度の時間がかかっているのか、何件 のレコードを処理したのか、などを表示。 • GUIツールで確認する方法(pgAdminIII) – 「クエリー解釈」=EXPLAIN – 「アナライズ解釈」=EXPLAIN ANALYZE Copyright 2011 Uptime Technologies LLC, All rights reserved. 22
  • 23. データアクセスのパターン • シーケンシャルアクセス – 全レコード、または多くのレコードを処理する必要がある場合 – 集約処理、LIKE文の中間一致など • ランダムアクセス – 特定のレコード(を含むブロック)だけにアクセスする必要がある場合 – 主にインデックスを用いたアクセス シーケンシャル ランダム アクセス アクセス ファイルの先頭から 順番に読み込んでいく 必要なブロックだけ ピンポイントで読み込む テーブルファイル テーブルファイル Copyright 2011 Uptime Technologies LLC, All rights reserved. 23
  • 24. テーブルスキャン SELECT count(*) FROM customer; Customer テーブルからの ブロック読込 ×214,216 Customer_pkey インデックスの ブロック読込×0 Copyright 2011 Uptime Technologies LLC, All rights reserved. 24
  • 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. インデックスアクセス SELECT * FROM customer c WHERE c.c_id=7; Customer テーブルからの ブロック読込×1 Customer_pkey インデックスの ブロック読込×3 Copyright 2011 Uptime Technologies LLC, All rights reserved. 26
  • 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. 結合(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. (3)I/O処理詳細 Copyright 2011 Uptime Technologies LLC, All rights reserved. 29
  • 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. タプルの更新とインデックスの更新 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. テーブルに対する参照処理(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. VACUUM処理 VACUUM前 VACUUM後 レコード1 レコード1 (レコード2) VACUUM処理 空き領域 VACUUM レコード3 レコード3 処理 レコード4 レコード4 レコード2’ レコード2’ レコード2に削除マークが レコード2の領域が「空き領域」として 付いている 再利用可能になる。 追記前 追記後 レコード1 レコード5を追記 レコード1 空き領域 レコード5 VACUUM レコード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. インデックススキャンとタプルの可視性 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. 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. (4)領域の見積もり Copyright 2011 Uptime Technologies LLC, All rights reserved. 36
  • 37. データファイルの物理的な配置 データベースクラスタ(PGDATA) システムカタログ・共有 (global) 設定ファイル (postgresql.conf, pg_hba.conf) テーブルファイル インデックスファイル その他制御ファイル等 デフォルトテーブルスペース(base) トランザクションログ(pg_xlog) ユーザデータベース(OID) テーブルファイル インデックスファイル 外部テーブルスペース×N アーカイブログ Copyright 2011 Uptime Technologies LLC, All rights reserved. 37
  • 38. 領域の見積もり • ユーザデータ領域 – テーブルファイル • テーブルファイルサイズ=8kB×必要ブロック数 • 必要ブロック数=全レコード数÷1ページ格納レコード数 • 1ページ格納レコード数=ページ利用可能サイズ×平均充填率÷レコードサイズ – インデックスファイル • インデックスファイルサイズ≒8kB×リーフノード数 • リーフノード数=全インデックスエントリ数÷1ページ格納エントリ数 • 1ページ格納エントリ数=ページ利用可能サイズ×平均充填率÷インデックスタプルサイズ • トランザクションログ領域 – 机上での見積もりは難しいので、実際にトランザクションを実行して見積もる。 – チェックポイントの間隔に注意 • 間隔が小さいとバックアップブロック(数kB)を記録する回数が増えてXLOGファイルが増大。 • 間隔が大きいと保持するXLOGファイルが増える。 • アーカイブログ領域 – ベースバックアップ(非一貫性バックアップ)の間で生成されるトランザクションログ。 – 更新トランザクションの量とベースバックアップの頻度から算出。 Copyright 2011 Uptime Technologies LLC, All rights reserved. 38
  • 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. 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. 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. トランザクションログ領域の見積もり • 最大容量は 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. (参考)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. (参考)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. (参考)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. (参考)pgestimate • テーブル/インデックスファイルサイズ見積もりツール http://www.uptime.jp/go/pgestimate Copyright 2011 Uptime Technologies LLC, All rights reserved. 46
  • 47. (5)パフォーマンス管理 Copyright 2011 Uptime Technologies LLC, All rights reserved. 47
  • 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. データベースを構成するハードウェアリソース • 複雑な構造を持つRDBMSでは、ボトルネックはいたるところに発生し得 るため、まずはきちんと切り分けることが重要。 – いきなりパラメータチューニングとかを始めない。 CPUネック? ソート? スキャン? CPU ネットワーク インターフェース メモリ ロック待ち? ネットワーク? プロセス空間 プロセス空間 共有メモリ プロセス空間 スワップ発生? ディスクキャッシュ 読み込み? 書き込み? テーブル/インデックス? トランザクションログ? ディスクソート? ディスク データベースサーバ Copyright 2011 Uptime Technologies LLC, All rights reserved. 49
  • 50. パフォーマンス改善の基本手順 • 全体のパフォーマンスの傾向をつかむ – どのデータベース、テーブルへのアクセスか? HWの利用状況はどうか? • 遅いSQL文を特定する or 実行回数の多いSQLを特定する – log_min_durationオプション – pgFouine • 特定のSQLだけが遅い場合・・・ – SQLのクエリプランおよび実行状況を確認する(EXPLAIN) • 遅いSQLが特定されない(偏りがない)場合・・・ – ハードウェアリソースのボトルネックを探す • 対策を実施する – SQL文を書き換える、インデックスを張る、テーブル設計を修正する – アプリケーションを修正する – ハードウェアを増強する – 他・・・ Copyright 2011 Uptime Technologies LLC, All rights reserved. 50
  • 51. 全体の傾向を可視化する • pg_statinfo/pg_reporterを使って、アクセス統計情報を可視化する。 – データベース統計情報 – ディスク使用状況 – テーブル統計情報 – チェックポイント情報 – Autovacuum実行状況 – SQL文実行状況 – 等・・・ Copyright 2011 Uptime Technologies LLC, All rights reserved. 51
  • 52. SQLパフォーマンス分析 • pgFouineによる問題SQL文の抽出、ランキング作成 – 総実行時間=レスポンスタイム(実行時間)×実行回数 – 最長レスポンスタイム – 他・・・ Copyright 2011 Uptime Technologies LLC, All rights reserved. 52
  • 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. 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. (6)可用性管理 Copyright 2011 Uptime Technologies LLC, All rights reserved. 55
  • 56. バックアップとレストア/リカバリ • バックアップの難しさ – データはファイルの中にだけあるのではない! – 通常は、共有バッファの内容が最新 – ファイルだけバックアップを取ってもダメ – ミリ秒単位で処理が進む中、すべてを一貫性を保った状態で • バックアップの種類 – コールドバックアップ – ホットバックアップ – アーカイブログバックアップ • バックアップ&レストア/リカバリはリハーサルをしよう! – 簡単な試験や手順書を作るだけで満足してはいけない・・・ Copyright 2011 Uptime Technologies LLC, All rights reserved. 56
  • 57. コールドバックアップ • サーバプロセスをすべてシャットダウンしてデータファイル全体をバックアップ – バックアップの間、サービス停止が発生する。 – リカバリの際には、バックアップ時のデータに戻る。 – ファイルバックアップなのでレストアが簡単。 • 向いているケース – 前回バックアップ以降の更新データを、アプリログなどから復旧できる場合。 – ストレージスナップショットが一般化した今、案外現実的。 • 向いていないケース – サービスを停止させられない場合。 – 障害発生の直前までの更新データが必要で、DB以外から復旧できない場合。 Crash ①ファイルを WAL1 WAL2 WAL3 ②障害発生 バックアップ (サービス中断) ③レストア Index Table Copyright 2011 Uptime Technologies LLC, All rights reserved. 57
  • 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. アーカイブログとPITRを用いたバックアップ • ベースバックアップ(基準点)+アーカイブログ(更新差分) – サービスを継続したままベースバックアップを取得可能(非一貫性バックアップ) – クラッシュ直前のWALの内容まで復旧することが可能 • 向いているケース – データベースクラスタ全体の完全なバックアップを取りたい場合。 – クラッシュ直前の更新まで復旧させる必要がある場合。 • 向いていないケース – データベース単位、テーブル単位などでバックアップを取得したい場合。 Crash WAL1 WAL2 WAL3 ①ベースバック アップの取得 (非一貫性 ②WAL1を ③WAL2を ④WAL3を バックアップ) アーカイブ アーカイブ アーカイブ Index WAL1 WAL2 WAL3 Table レストア&リカバリに必要なファイル類 Copyright 2011 Uptime Technologies LLC, All rights reserved. 59
  • 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. アーカイブログとPITRを用いたリカバリ • ベースバックアップ(基準点)+アーカイブログ(更新差分) – ベースバックアップをレストア後、アーカイブログをロールフォワードリカバリする。 – 前回のベースバックアップ以降、長期間が経過しているとアーカイブログが多くなり、リ カバリの時間が長くなる。 – ベースバックアップレストア時間+アーカイブログ適用時間×アーカイブログ数 WAL3適用完了 リカバリ完了 WAL1 WAL2 WAL3 ①ベースバック アップを展開 ②WAL1を ③WAL2を ④WAL3を 適用 適用 適用 Index WAL1 WAL2 WAL3 Table Copyright 2011 Uptime Technologies LLC, All rights reserved. 61
  • 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. 冗長化方式の選定 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. Q&A? Copyright 2011 Uptime Technologies LLC, All rights reserved. 64
  • 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. 参考文献 • 書籍・雑誌 – 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 Copyright 2011 Uptime Technologies LLC, All rights reserved. 66
  • 67. 【お問い合わせ先】 アップタイム・テクノロジーズ合同会社 永安 悟史 E-mail: snaga@uptime.jp Web: http://www.uptime.jp/ Copyright 2011 Uptime Technologies LLC, All rights reserved. 67