postgresql 9.6 新機能紹介

48
Copyright©2016 NTT corp. All Rights Reserved. 祝リリース!PostgreSQL 9.6新機能紹介! ~長年待ち望まれてきた機能から、NTTデータ、NTTOSSセン タがホンキで開発貢献した機能までトコトン解説~ 日本電信電話株式会社 NTTオープンソースソフトウェアセンタ 澤田 雅彦 @NTTデータオープンソースDAY 2016 (11/16)

Upload: masahiko-sawada

Post on 15-Apr-2017

4.961 views

Category:

Software


1 download

TRANSCRIPT

Page 1: PostgreSQL 9.6 新機能紹介

Copyright©2016 NTT corp. All Rights Reserved.

祝リリース!PostgreSQL 9.6新機能紹介!~長年待ち望まれてきた機能から、NTTデータ、NTTOSSセンタがホンキで開発貢献した機能までトコトン解説~

日本電信電話株式会社NTTオープンソースソフトウェアセンタ澤田 雅彦

@NTTデータオープンソースDAY 2016 (11/16)

Page 2: PostgreSQL 9.6 新機能紹介

2Copyright©2016 NTT corp. All Rights Reserved.

1. PostgreSQLについて簡単に紹介

2. PostgreSQL9.6新機能紹介

3. 今後のPostgreSQL

4. まとめ

目次

Page 3: PostgreSQL 9.6 新機能紹介

3Copyright©2016 NTT corp. All Rights Reserved.

• PostgreSQL Global Development Groupが主体となり開発

• 1994年にSQLをサポートし、1996年にPostgreSQLに名前を変えた

• 今年20周年

•最新バージョンは9.6.1 (10/27リリース)

• 同時に9.1系がEOL

PostgreSQLとは?

Page 4: PostgreSQL 9.6 新機能紹介

4Copyright©2016 NTT corp. All Rights Reserved.

• Uberの記事 (7月26日)

• “Why Uber Engineering Switched from Postgres to MySQL”

• 初PGConf.ASIA 2016開催予定 (12月1,2,3日@秋葉原)

• アジアを横断したPostgreSQLの国際カンファレンス

• 第二回PgDay Asia 2017開催予定(2017年3月@シンガポール)

• アジアを横断したPostgreSQLの国際カンファレンス

最近話題になっているPostgreSQL

Page 5: PostgreSQL 9.6 新機能紹介

5Copyright©2016 NTT corp. All Rights Reserved.

PostgreSQL 9.6新機能紹介

Page 6: PostgreSQL 9.6 新機能紹介

6Copyright©2016 NTT corp. All Rights Reserved.

2011

2012

2013

PostgreSQLは、年1回のメジャーバージョンアップをしています。

PostgreSQLのこれまで

9.1 (2011-09)

・同期レプリケーション

9.2 (2012-09)・大幅な性能向上

9.3 (2013-09)・マテリアライズドビューの実装・更新可能ビューの実装・フェイルオーバ時間の大幅な短縮・DDLトリガの実装

2014

9.4(2014-12)

・更新ログの書き出し性能向上・マテリアライズドビューの改善・遅延レプリケーションの実装・ロジカルデコーディングの実装

2015

9.6 (2016-9)

・パラレルクエリ・VACUUM性能向上・マルチ同期レプリケーション・FDW強化

本日ご紹介部分

2016

9.5 (2016-1)

・UPSERTの実装・BRINの実装・Row-Level Securityの実装・pg_rewindのコア機能化・同時実行性の改善

Page 7: PostgreSQL 9.6 新機能紹介

7Copyright©2016 NTT corp. All Rights Reserved.

主要機能を解説します

性能向上

• パラレルクエリ

VACUUMの性能、運用性向上

• Freeze Map

• VACUUM進捗

レプリケーション

• マルチ同期レプリケーション

外部データ連携(FDW)

• FDW強化

Page 8: PostgreSQL 9.6 新機能紹介

8Copyright©2016 NTT corp. All Rights Reserved.

パラレルクエリ

(Robert Haas, Amit Kapila, David Rowley, many others)

“Parallelism” by Maciej Meller

Page 9: PostgreSQL 9.6 新機能紹介

9Copyright©2016 NTT corp. All Rights Reserved.

多くのユーザが待ち望んでいた機能の一つ

https://postgresql.uservoice.com/forums/21853-general

Page 10: PostgreSQL 9.6 新機能紹介

10Copyright©2016 NTT corp. All Rights Reserved.

CPU

パラレルクエリってどんな機能? -これまでのPG -

サーバプロセス

巨大なテーブル

SELECT * FROM tbl;

• 1つのSQLを1つのプロセスでしか処理できない

• 巨大なテーブルを扱うと、処理に時間がかかってしまう

• 特に集計、結合処理を行うと1プロセスにかかる負担は増大する

スキャン

Page 11: PostgreSQL 9.6 新機能紹介

11Copyright©2016 NTT corp. All Rights Reserved.

CPU

CPU

CPU

サーバプロセス

パラレルクエリってどんな機能?

巨大なテーブル

SELECT * FROM tbl;

サーバプロセス

サーバプロセス

スキャン

スキャン

スキャン

連携

連携

• 1つのSQLを複数のプロセスで分担して処理できる

• 1つのSQL処理速度が向上する

• CPUリソースを効率的に使うことができる

• パラレルクエリはシーケンシャルスキャン、結合処理、集計処理で有効

Page 12: PostgreSQL 9.6 新機能紹介

12Copyright©2016 NTT corp. All Rights Reserved.

パラレルクエリ実現には以下の機能が必要

① 実際に処理を行うプロセスを制御する機能

② プロセス間のコミュニケーション領域を作る機能

③ 並列処理中は一貫した情報を見えるようにする機能

④ 並列結果をまとめる機能

⑤ 並列処理を意識した実行計画を立てる

PostgreSQLコミュニティが長年準備してきた機能の一つ

PG9.3(2013)

PG9.4(2014)

① ワーカープロセスを動的に起動可能

② 共有メモリを動的に確保可能

③ ワーカープロセスで一貫した情報がみれる機能

④ 並列処理結果をまとめる機能

⑤ 並列処理を意識した実行計画を立てる

① 独自のワーカープロセスが定義、起動可能

完成

PG9.5(2015)

PG9.6(2016)

Page 13: PostgreSQL 9.6 新機能紹介

13Copyright©2016 NTT corp. All Rights Reserved.

9.6でパラレル(並列)処理できるのは、

検索と集計と結合

何がパラレルになる?

Seq Scan Nested Loop JoinHash Join

avg()min()max()

count()など

Page 14: PostgreSQL 9.6 新機能紹介

14Copyright©2016 NTT corp. All Rights Reserved.

これまでの集計処理

集計(Agg)

集計結果

テーブルスキャン(SeqScan)

テーブル

=# SELECT count(*) FROM test_table;

1プロセスでスキャン、集計を

実施

Page 15: PostgreSQL 9.6 新機能紹介

15Copyright©2016 NTT corp. All Rights Reserved.

集計処理の並列化

部分集計(Partial Agg)

部分集計(Partial Agg)

部分集計(Partial Agg)

集める(Gather)

集計結果

集計結果集計結果

集計結果

テーブルスキャン(Partial SeqScan)

テーブルスキャン(Partial SeqScan)

テーブルスキャン(Partial SeqScan)

集計結果

集計結果

テーブル

集計結果

• テーブルスキャン、集計を並列で実行可能

• 各プロセスで部分的な集計を行い、最後に結果をまとめる

行数/3

行数/3

行数/3

最終集計(Final Agg)

Page 16: PostgreSQL 9.6 新機能紹介

16Copyright©2016 NTT corp. All Rights Reserved.

これまでの結合処理

結合(Nested Loop Join)

テーブルスキャン(Partial SeqScan)

インデックススキャン(IndexScan)

内部表

外部表

=# SELECT id FROM hoge h, bar b WHERE h.id = b.id;

Page 17: PostgreSQL 9.6 新機能紹介

17Copyright©2016 NTT corp. All Rights Reserved.

結合処理の並列化

結合(Nested Loop Join)

テーブルスキャン(Partial SeqScan)

インデックススキャン(IndexScan)

結合(Nested Loop Join)

テーブルスキャン(Partial SeqScan)

インデックススキャン(IndexScan)

内部表 内部表

結果をまとめる(Gather)

外部表

• 各プロセスで外部表のスキャン、内部表との結合を実施

• Hash Joinも並列実行可能

行数/2

行数/2

Page 18: PostgreSQL 9.6 新機能紹介

18Copyright©2016 NTT corp. All Rights Reserved.

• クエリ実行の並列度を変えて全件スキャンを実施

• CPUコア数分(並列度4)までクエリが高速化した

どれくらい速くなる?

0

5

10

15

20

25

1 2 3 4 5

実行

時間

(秒)

並列度

13GBテーブルの全件スキャン

CPU:4コアメモリ:32GB

約1/4の実行時間

Page 19: PostgreSQL 9.6 新機能紹介

19Copyright©2016 NTT corp. All Rights Reserved.

•並列度決定に物理CPU数は考慮されない

• テーブルサイズを元に並列度を算出

• CPUコア数以上の並列度が設定されないように

•ディスクI/Oに気を使おう!

使用上の注意点

Page 20: PostgreSQL 9.6 新機能紹介

20Copyright©2016 NTT corp. All Rights Reserved.

• 1つのSQL処理を複数のCPUで並列に実行• 1つのSQL処理速度を上げる機能

• Seq Scan、Nested Loop Join、Hash Join、集計が対応• 更新、削除、ソート、Merge Join、Index Scanは未対応

•「並列に処理する実行計画」も含み、最適な実行計画が選択される• “パラレルクエリを使った方が遅い”と判断されることも

•並列度はテーブルサイズを元に設定される

絶賛機能、性能検証中!

詳しい情報は随時発信していきます!

パラレルクエリ まとめ

Page 21: PostgreSQL 9.6 新機能紹介

21Copyright©2016 NTT corp. All Rights Reserved.

PostgreSQLが管理するトランザクションIDのメンテナンスのために、定期的(デフォルトでは2億トランザクション毎)にデータベース全体のVACUUMが実行されます。

9.5までのPostgreSQL

いつも通りの処理♪急にDB全体が重くなった!

半年後のある日

Page 22: PostgreSQL 9.6 新機能紹介

22Copyright©2016 NTT corp. All Rights Reserved.

=# SELECT pid, state,

now() – query_start as duration, query

FROM pg_stat_activity;

-[ RECORD 1 ]---------------------------------------

pid | 43556

query | autovacuum: VACUUM

| public.very_large_table (to prevent

| wraparound)

state | active

duration | 5 days 18:50:44.256561②

5日間以上VACUUM実行中

PostgreSQLで実行されているSQLの状況を見てみると・・・

①“to prevent wraparound”

が付いている

Page 23: PostgreSQL 9.6 新機能紹介

23Copyright©2016 NTT corp. All Rights Reserved.

Freeze Map

(Masahiko Sawada, Robert Haas)

The Unsung Founders Memorial at UNC. It's an interesting table sculpture dedicated to the men and women of color who helped build the University. by Jed Record

Page 24: PostgreSQL 9.6 新機能紹介

24Copyright©2016 NTT corp. All Rights Reserved.

非常に重要な機能(でも内部の細かい話になるので、その重要さが伝わりづらい。。)

Freeze Mapとは?

Page 25: PostgreSQL 9.6 新機能紹介

25Copyright©2016 NTT corp. All Rights Reserved.

内部構造に興味がある方は

http://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid

Page 26: PostgreSQL 9.6 新機能紹介

26Copyright©2016 NTT corp. All Rights Reserved.

このVACUUM(通称XID周回防止VACUUM)では全テーブルを問答無用でフルスキャン• ディスクI/OやCPUを消費

• DBサイズに比例してより大きい影響を受けやすくなる

XID周回防止VACUUMがいつ発生するかはPostgreSQL次第• 繁忙期、閑散期関係なく実行される

• ただし、事前に意識的にメンテナンスしておくことで、ある程度制御することは可能

キャンセルできるが、実行しないままでいると、PostgreSQLがある日突然停止する

Q. なぜ今になって解決されたのか?(これまで問題にならなかったのか?)

A. 近年DBに格納するデータが大きくなってきたことにより、問題が顕在化してきたため。

甘く見ていると危険

Page 27: PostgreSQL 9.6 新機能紹介

27Copyright©2016 NTT corp. All Rights Reserved.

•これらの悩みを解消

•デフォルトで有効• オーバーヘッドを極力少なくなるように実装しているため、新

機能導入によるデメリットはほぼない

• OFFにできない

• DBMSの重要な部分を改変したため、万が一のときの対処策も一緒に追加

• pg_visibilityモジュール

• pg_truncate_visibility_map

• pg_check_visible, pg_check_frozen

• VACUUM (DISABLE_PAGE_SKIPPING)

Freeze Map

Page 28: PostgreSQL 9.6 新機能紹介

28Copyright©2016 NTT corp. All Rights Reserved.

=# SELECT pid, state,

now() – query_start as duration, query

FROM pg_stat_activity;

-[ RECORD 1 ]---------------------------------------

pid | 43556

query | autovacuum: VACUUM

| public.very_large_table (to prevent

| wraparound)

state | active

duration | 5 days 18:50:44.256561②

5日間以上VACUUM実行中

PostgreSQLで実行されているSQLの状況を見てみると・・・

①“to prevent wraparound”

が付いている

Page 29: PostgreSQL 9.6 新機能紹介

29Copyright©2016 NTT corp. All Rights Reserved.

Vacuum Progress Checker

(Amit Langote, Robert Haas, Vinayak Pokale, Rahila Syed)

Page 30: PostgreSQL 9.6 新機能紹介

30Copyright©2016 NTT corp. All Rights Reserved.

• VACUUMの進捗状況をレポートするビューが導入

• どのテーブルのVACUUMが、どれくらい進んでいるのかを数値でレポート

VACUUMの進捗状況が見える

=# ¥d pg_stat_progress_vacuum

Column | Type | Modifiers

-------------------+---------+----------

pid | integer |

datid | oid |

datname | name |

relid | oid |

phase | text |

heap_blks_total | bigint |

heap_blks_scanned | bigint |

heap_blks_vacuumed | bigint |

index_vacuum_count | bigint |

max_dead_tuples | bigint |

num_dead_tuples | bigint |

Page 31: PostgreSQL 9.6 新機能紹介

31Copyright©2016 NTT corp. All Rights Reserved.

=# SELECT pid, datname, relname,

((heap_blks_scanned / heap_blks_total::numeric(10,2)) * 100)::numeric(10,2) as percentage,

p.phase,

index_vacuum_count

FROM pg_stat_progress_vacuum as p, pg_class as c

WHERE p.relid = c.oid;

-[ RECORD 1 ]------+-----------------

pid | 100026

datname | postgres

relname | pgbench_accounts

percentage | 19.72

phase | scanning heap

index_vacuum_count | 10

-[ RECORD 2 ]------+-----------------

pid | 100027

datname | postgres

relname | very_large_table

percentage | 95.12

phase | scanning heap

index_vacuum_count | 300

進捗状況の確認やチューニングにも使える

他ビューと組み合わせることで、・VACUUM対象のテーブル・進捗状況(パーセンテージ)・今何をしているか・VACUUMの効率など算出可能

Page 32: PostgreSQL 9.6 新機能紹介

32Copyright©2016 NTT corp. All Rights Reserved.

主要機能を解説します

性能向上

• パラレルクエリ

VACUUMの性能、運用性向上

• Freeze Map

• VACUUM進捗

レプリケーション

• マルチ同期レプリケーション

外部データ連携(FDW)

• FDW強化

Page 33: PostgreSQL 9.6 新機能紹介

33Copyright©2016 NTT corp. All Rights Reserved.

レプリケーション機能の歴史

9.0(2010)

9.4(2014)

9.5(2015)

9.6(2016)

9.2(2012)

9.3(2013)

9.1(2011)

・同期レプリケーション

・カスケードレプリケーション

・スタンバイサーバへの高速切り替え

・レプリケーションスロット・ロジカルデコーディング

・高速フェイルオーバー

M S S

M S

S

レプリケーション機能の拡充、使いやすさの向上

・非同期レプリケーション

Page 34: PostgreSQL 9.6 新機能紹介

34Copyright©2016 NTT corp. All Rights Reserved.

マルチ同期レプリケーション

(Masahiko Sawada, Beena Emerson, Michael Paquier,

Fujii Masao, Kyotaro Horiguchi)

Polska > Kraków by antifluor

Page 35: PostgreSQL 9.6 新機能紹介

35Copyright©2016 NTT corp. All Rights Reserved.

同期レプリケーション

http://www.slideshare.net/hadoopxnttdata/postgresql-39739357

Page 36: PostgreSQL 9.6 新機能紹介

36Copyright©2016 NTT corp. All Rights Reserved.

PG9.5 までのレプリケーション

マスタ

スタンバイA

スタンバイB

スタンバイC

同期レプリケーション

非同期レプリケーション

非同期レプリケーション

• マスタサーバは複数のスタンバイサーバを持つことができるが、同期レプリケーションを使用

できるのは最大1台まで

同期レプリケーションを使えるのはスタンバイAの1台のみ

Page 37: PostgreSQL 9.6 新機能紹介

37Copyright©2016 NTT corp. All Rights Reserved.

マルチ同期レプリケーション

マスタ

スタンバイA

スタンバイB

スタンバイC

同期レプリケーション

同期レプリケーション

非同期レプリケーション

• 複数のスタンバイサーバに対して同期レプリケーションを使用可能• より高可用な構成を組むことが可能に

スタンバイAとスタンバイBに同期レプリケーションを使用

Page 38: PostgreSQL 9.6 新機能紹介

38Copyright©2016 NTT corp. All Rights Reserved.

構成例

マスタ

● 同期レプリケーションを使用したWAL二重書き込み(pg_receivexlog使用)

WALWAL

のみ

スタンバイ同期

レプリケーション

同期レプリケーション

● 同一DC内に同期スタンバイを複数配置

マスタ

スタンバイ

スタンバイ

同期レプリケーション

同期レプリケーション

Page 39: PostgreSQL 9.6 新機能紹介

39Copyright©2016 NTT corp. All Rights Reserved.

Foreign Data Wrapper(FDW)強化

(Etsuro Fujita, Shigeru Hanada, Ashutosh Bapat)

pot shards by psyberartist

Page 40: PostgreSQL 9.6 新機能紹介

40Copyright©2016 NTT corp. All Rights Reserved.

新機能紹介の前に - Foreign Data Wrapper(FDW)とは?

ID, COL100, 北海道200, 青森県

id col

100 北海道

200 青森県

id col

100 北海道

200 青森県

PostgreSQL

Oracle

CSVファイル

oracle_fdw

file_fdwSELECT id, col FROM tbl

外部データをあたかもPostgreSQLのデータとして扱える機能

Page 41: PostgreSQL 9.6 新機能紹介

41Copyright©2016 NTT corp. All Rights Reserved.

• postgres_fdwを使った分散処理構成は、「どれだけ外部サーバで処理させるか」が重要• 親サーバが全てのデータを取得して計算、では外部サーバを使うメリットを生かせな

• 演算子、条件句も一緒に送る(Push Downする)ことが大切

分散処理基盤を続々と強化中

SELECT price FROM 3月分WHERE genre = …

1,2月分

postgres_fdw

子サーバ

3,4月分 5,6月分

SELECT … WHERE …

親サーバ

Page 42: PostgreSQL 9.6 新機能紹介

42Copyright©2016 NTT corp. All Rights Reserved.

•参照

• スキャンやWHERE句により絞込み外部サーバで実行される

• New!! 結合、ソート処理も外部サーバのリソースが使える

•更新

• New!! 更新、削除を外部サーバに依頼可能

挿入、集計、他の結合等は現在開発中!

分散処理基盤を続々と強化中

Page 43: PostgreSQL 9.6 新機能紹介

43Copyright©2016 NTT corp. All Rights Reserved.

今後のPostgreSQL

Future Energy by Floris Oosterveld

Page 44: PostgreSQL 9.6 新機能紹介

44Copyright©2016 NTT corp. All Rights Reserved.

• PostgreSQL開発に注力している会社が、PostgreSQL開発のロードマップを公開

• パラレルクエリ導入が、PostgreSQLの様々な処理のパラレル化を加速

• ロジカルレプリケーションを含め、様々なレプリケーション機能が追加されていく

• 外部データ連携機能(FDW)がさらに強化されていく

• パーティショニング専用の構文が導入され、簡単に使えるようになる

https://wiki.postgresql.org/wiki/PostgreSQL10_Roadmap

• PostgreSQLのバージョニングが変わる

今後のPostgreSQL

Page 45: PostgreSQL 9.6 新機能紹介

45Copyright©2016 NTT corp. All Rights Reserved.

バージョニングが変わります!

~PG9.6 PG10~

9.6.0

9.5.0メジャー マイナー

9.5.1 11.0

10.0メジャー マイナー

10.1

Page 46: PostgreSQL 9.6 新機能紹介

46Copyright©2016 NTT corp. All Rights Reserved.

•本日はPG9.6の目玉機能を紹介しました

• PostgreSQL 9.6でパラレルクエリを初めとした200以上の機能が追加されました

• NTTデータ、NTT OSSセンタが開発貢献した機能も多数

•大規模データの管理、処理がH/Wリソースを効率的に使いながら可能になった

•今後のPostgreSQLはパラレル化、レプリケーション強化にも期待

まとめ

Page 47: PostgreSQL 9.6 新機能紹介

47Copyright©2016 NTT corp. All Rights Reserved.

ご清聴ありがとうございました

Page 48: PostgreSQL 9.6 新機能紹介

48Copyright©2016 NTT corp. All Rights Reserved.

• Too old snapshot

• Idle_in_transaction_session_timeout

• CREATE ACCESS METHOD

• Generic WAL Interface

• Bloomインデックス

•類似度検索の強化(Word Similarity Search)

•待機イベント

• postgres_fdwで演算子をPush Down可能に

•部分インデックスを使用した、Index Only Scan

(参考) その他の改善