近年では、ほとんどのソフトウェアやウェブアプリケーションにバックエンドのデータベースが欠かせません。1秒間で処理されるトランザクションの増加や、何テラバイトものデータの保存には、データを格納・配信するための安定性と柔軟性の高いフレームワークが求められます。

そしてもちろん、新興企業にとっては費用の問題も絡んできます。では、データベースを無料で利用・構築することができると言ったらどうでしょう。

実は、そんなデータベースが本当に存在します。PostgreSQLは、上に挙げた要素をすべてクリアし、さらに便利な機能がたくさん備わっています。今回の記事では、急成長するセグメントにおいて、PostgreSQLが高い地位を確立する理由を、さまざまな側面からご説明します。

それでは、早速始めましょう。

PostgreSQLについて動画での解説もご用意しています

PostgreSQLとは

The PostgreSQL logo, showing the text below a stylized blue elephant head outlined in black and white.
PostgreSQLのロゴ(出典: Uberconf

PostgreSQLは、オープンソースで安定性の高いデータベース管理システムです。外部キー、サブクエリ、トリガー、ユーザ定義型や関数など、SQLのさまざまな機能が揃っています。さらには、SQL言語を拡張し、データのワークロードを綿密にスケーリング・確保する機能もあり、モバイル、ウェブ、地理空間、分析などのアプリケーションのデータ保存に使用されるのが一般的です。

まずはPostgreSQLの主な機能をご紹介してから、PostgreSQLのあらゆる側面を深く掘り下げていきます。

PostgreSQLの主な機能

PostgreSQLには、他のデータベースにはないユニークな特徴があり、高い評価を受けています。現在、PostgreSQLはMySQLに次いで2番目に最も使用されているデータベースです。

これの優れた機能について、詳しくみていきましょう。

信頼性・規格適合性

PostgreSQLは、トランザクションにおいて真のACID特性を持ち、あらゆる言語での外部キー、結合、ビュー、トリガー、ストアドプロシージャに完全対応しています。さらに、INTEGER、VARCHAR、TIMESTAMP、BOOLEANといったSQLのほとんどのデータ型、そして画像、動画、音声などのバイナリラージオブジェクト(BLOB)の保存もサポートしています。また、PostgreSQLには大規模なコミュニティによるサポートネットワークがあり、信頼性が高いのも特長です。そして、ログ先行書き込み機能で、耐障害性の高いデータベースになっています。

エクステンション

PostgreSQLには、ポイントインタイムリカバリ、多版型同時実行制御(MVCC)、表領域、緻密なアクセス制御、非同期レプリケーション、優れたクエリプランナ/オプティマイザ、ログ先行書き込みなどの強力な機能が勢揃い。多版型同時実行制御は、テーブルの読み込みと書き込みを同時に行い、同じ行の更新のみをブロックすることができるため、データの衝突を回避することができます。

スケーラビリティ

PostgreSQLはUnicode、国際文字セット、マルチバイト文字のエンコーディングをサポートし、ソート、大文字・小文字の識別、フォーマットのロケールを考慮して構築されています。また、同時接続数や管理できるデータ量など、高いスケーラビリティも持っています。さらに、PostgreSQLはクロスプラットフォームであり、Linux、Microsoft Windows、macOS、FreeBSD、Solarisなどの多くのオペレーティングシステムで使用できます。

動的ローディング

動的ロードにより、ユーザーが記述したコードをPostgreSQLのサーバーに追加することができ、オブジェクトファイルを指定することも可能です。例えば、新しい関数や型を実装した共有ライブラリを指定すると、必要に応じPostgreSQLにロードされます。また、その場で操作の変更も可能なため、ストレージ構造やアプリケーションを即座に実装するのに適しています。

PostgreSQLのアーキテクチャ

PostgreSQLサーバーは、共有メモリ、バックグラウンドプロセス、データのディレクトリ構造からなるシンプルなつくりになっています。次に、各構成要素について、そして各要素がどのように連動しているかをみていきましょう。以下は、PostgreSQLのアーキテクチャ図です。まず、クライアントからサーバーにリクエストが送信されます。その後、PostgreSQLサーバーが共有バッファとバックグラウンドプロセスを使用してデータを処理します。PostgreSQLデータベースサーバーの物理ファイルは、dataディレクトリに格納されます。

The PostgreSQL architecture diagram, showing the text below a hierarchy of blue PostgreSQL processes, outlined in black
PostgreSQLのアーキテクチャ図(出典: Wikimedia Commons

共有メモリ

共有メモリは、トランザクションログとデータベースのキャッシュ用に確保されており、共有バッファ、WALバッファ、ワークメモリ、メンテナンスワークメモリなどの領域もあります。

共有バッファ

共有バッファは、サーバーのディスクI/Oを最小限に抑える役割を果たしています。PostgreSQLの専用サーバーを使用している場合は、共有バッファの値を総メモリの25%に設定するのが妥当です。バージョン 9.3 以降の共有バッファのデフォルトサイズは128MBです。複数のユーザーが同時にアクセスする場合には、コンテンションを必要最小限に抑える工夫が必要になります。頻繁に使用されるブロックは、できるだけ長い期間バッファに保持しておけば、可能な限り素早くデータにアクセスすることができます。

WALバッファ

WALバッファには、データベースへの変更が一時的に保存されます。WALファイル(トランザクションログとも)の中身は、各時点でWALバッファに保存されているデータとなります。WALファイルは、継続的なデータのバックアップに利用できます。

プロセスメモリ(「work_mem」)

「work_mem」は、ビットマップ操作、ソート、マージ結合、ハッシュ結合を行い、一時ディスクファイルにデータを書き込むためのメモリ領域です。バージョン9.3以降のデフォルトサイズは4MB。

プロセスメモリ(「maintenance_work_mem」)

ANALYZE、VACUUM、ALTER TABLE、CREATE INDEXなどのデータベース操作に使用されます。バージョン9.4以降のデフォルトサイズは64MB。

バックグラウンド(ワーカー)プロセス

バックグラウンドプロセスは、サーバー管理に不可欠であり、独自の役割を担っています。以下、特に重要なものをいくつか取り上げてご説明します。

チェックポイント

チェックポイントが発生すると、ダーティバッファがファイルに書き込まれます。チェックポイント処理により、すべてのダーティページがメモリからディスクに書き込まれ、共有バッファ領域のクリーニングが行われます。データベースがクラッシュした場合、最後のチェックポイントの時刻とPostgreSQLが停止した時刻の差を取得して、データ損失を測定することが可能です。

バックグラウンドライタ

ログとバックアップ情報を更新する処理です。バージョン9.1までは、定期的に実行されるチェックポイント処理と統合されていましたが、バージョン9.2以降ではチェックポイント処理と切り離されています。

WALライタ

WALバッファ上のWALデータを定期的に永続ストレージに書き込み、そして、そこからフラッシュする処理です。

アーカイバ

(有効化された状態で)WALログファイルを指定されたディレクトリにコピーします。

ログコレクタ

WALバッファをWALファイルに書き込む処理です。

データファイル/データディレクトリ構造

PostgreSQLには、いくつかのデータベースがあり、その集合体はデータベースクラスタと呼ばれます。初期化時には、template0、template1、Postgresのデータベースが作成され、データベースを新規作成する場合は、システムカタログテーブルからなるテンプレートデータベースを利用します。初期化後のtemplate0とtemplate1のテーブルリストは同じですが、template1を複製してデータベースを新規作成します。

クラスタに必要なデータは、クラスタのデータディレクトリ(PGDATA)内に格納されます。データディレクトリは、以下のような複数のサブディレクトリで構成されています。

  • Global:ユーザーデータベースなどのクラスタ単位のテーブルで構成される。
  • Base:デフォルトの表領域の物理的な格納場所。データベースごとに複数のサブディレクトリがあり、その中にシステムカタログが格納されている。
  • PID(プロセス識別子):postmaster.pidで管理される。
  • PG_VERSION:データベースのバージョン情報が参照できる。
  • PG_NOTIFY:LISTEN/NOTIFY状態データを格納(トラブルシューティングに有用)。

PostgreSQLの強み

インデックス、ビュー、ストアドプロシージャのような数々の機能を利用できるだけでなく、PostgreSQLには以下のような機能や特徴もあります。

  • 多言語対応
  • オープンソース
  • オブジェクトリレーショナルデータベース
  • 優れたパフォーマンス
  • スケーラビリティ
  • ロードバランシング機能
  • 信頼性
  • 国際化対応

各機能をそれぞれ詳しくみていきましょう。

多言語対応

PL/PGSQLは、PostgreSQL内蔵の手続き言語であり、さまざまな最新機能を備えています。軽量であり、パッケージ内での柔軟性が高いJSONデータ型をサポートしているため、Perl、Ruby、Python、.Net、C/C++、Java、ODBC、Goなどのプログラミング言語、プロトコルの利用が可能です。

オープンソース

これこそが、PostgreSQL最大の特長です。完成度の高いデータベースは、20年以上にわたるコミュニティの開発により支えられています。ソースコードは、オープンソースライセンスの下で誰でも自由に利用でき、追加費用なしで、好みの方法で使用、変更、実装することができます。

オブジェクトリレーショナルデータベース

PostgreSQLには、オブジェクト、クラス、関数のオーバーロードなどの機能があります。オブジェクト指向の特性のおかげで、データ型を拡張して独自のデータ型を作成することができます。柔軟性が高く、データベース統合を必要とする複雑なデータ型を扱う開発者にとっては理想的な特長です。

また、テーブルの継承もオブジェクト指向ならではの機能。子テーブルは、子テーブルが持つ他の列に加えて、親テーブルの列を継承することができ、結果として異なるテーブルの作成が可能です。

優れたパフォーマンス

書き込み操作は、読み取り/書き込みロックなしで同時に行うことができます。大量のデータを扱う際のクエリ高速化にはインデックスが使用され、すべてのデータを対象に検索することなく、特定の行を素早く見つけることができます。

また、式インデックスの作成も可能で、カラムの値だけでなく、式や関数の結果に対しても有効です。テーブルの一部だけにインデックスを付ける部分インデックス機能もあります。さらに、クエリの読み込みの並列化、式のジャストインタイム(JIT)コンパイル、セーブポイントを使ったネストされたトランザクションもサポートしており、優れたパフォーマンスと効率性を誇ります。

スケーラビリティ

PostgreSQLはカタログ駆動型であり、データベース、カラム、テーブルなどに情報が格納されるため、高いスケーラビリティを持っています。また、カタログの情報量を増やすだけでなく、データ型、アクセス方法、関数などの詳細も保持されます。また、データベースを再コンパイルすることなく、別のプログラミング言語からコードを記述し、データ型を定義することもできます。

ロードバランシング機能

スタンバイサーバーの運用、継続的な計画、スタンバイサーバー用のプライマリの準備とセットアップ、ストリーミングレプリケーション、レプリケーションスロット、カスケードレプリケーション、スタンバイでの継続的なアーカイブなどにより、高可用性と負荷分散という面でも優れています。さらに、同期レプリケーションも可能で、2つのデータベースインスタンスを同時に実行し、マスターデータベースとスレーブデータベースを同時に同期させることで、さらに高い可用性を実現します。

信頼性

データを安全に保存し、リクエスト処理時にデータを取り出すことができるだけでなく、有志のコミュニティによって定期的にバグの検出とソフトウェアの改善が行われるおかげで、高い信頼性が確保できています。

国際化

様々な地域で利用できるようにソフトウェアを設計する作業は、国際化と呼ばれます。マルチバイト文字のエンコーディング、ICU照合順序、Unicodeによってあらゆる文字セットをサポートし、ソート、書式設定、大文字・小文字を区別する、ロケールを考慮した設計になっています。例えば、PostgreSQLが生成したメッセージを好きな言語で表示できるのは国際化の一例です。

PostgreSQLが役立つ事例

複雑なクエリやリレーションシップを構築して、頻繁に更新を行い、費用対効果の高い方法で保守管理をするには、PostgreSQLが答えかもしれません。PostgreSQLは無料で利用できるだけでなく、クロスプラットフォームです。そのため、Windows限定ということもありません。データ分析を行いたければ、PostgreSQLを使えば分析作業の基礎となる膨大な量の正規表現が利用できます。

CSVのサポートに関して言えば、PostgreSQLは最も優れたデータベースの1つ。コピー元やコピー先といったシンプルなコマンドは、データの高速処理に役立ちます。インポートに問題がある場合は、エラーを投げて、すぐさまインポートが停止されます。この章では、近年最も広く使用されているPostgreSQLの使用事例をいくつかご紹介していきます。

政府の地理空間データ

非常に有用な拡張機能にPostGISがあります。PostGISを使うと、PostgreSQLで地理オブジェクトが利用できるようになり、地理情報システム(GIS)や位置情報サービス用の地理空間データストアとして活用できます。

金融業界

PostgreSQLは、金融業界で重宝されるDBMSです。ACID特性に完全に準拠しているため、OLTP(オンライントランザクション処理)に理想的です。また、データベース分析の実行にも適しており、MatlabやRなど、数学的処理を行うあらゆるソフトウェアと統合できます。

科学的データ

科学的な記録や分析には、何テラバイトものデータが必要になります。そのため、データ処理は最も効率的な方法で行いたいものです。PostgreSQLには、高性能な分析機能と強力なSQLエンジンが備わっているため、大量のデータを管理するのが得意です。

ウェブテクノロジー

ウェブサイトでは、1秒間に数百、数千のリクエストの処理が必要になります。費用対効果が高くスケーラブルなデータベースを探している開発者には、PostgreSQLが優れた選択肢になるはずです。PostgreSQLは、LAMPの堅牢な代替となるLAPPスタック(Linux、Apache、PostgreSQL、PHP、Python、Perl)の一部として、動的なサイトとアプリを実行することが可能です。

製造業

多くのベンチャー企業や大手企業が、製品、サービス、インターネット規模のアプリケーションの主要データストレージソリューションとして、PostgreSQLを利用しています。PostgreSQLをストレージバックエンドとして使用することで、サプライチェーンのパフォーマンスを最適化でき、企業の費用削減につながります。

PostgreSQL運用上の課題

ここまでPostgreSQLを絶賛してきましたが、デメリットにも触れておくのが筋というもの。このセクションでは、PostgreSQLを利用する中で、発生しうる課題をいくつかみてみましょう。

  • データベースエコシステムの発展が不十分─PostgreSQLには、成長を続けるコミュニティがあるものの、従来のデータベースとは異なり、データベースエコシステムがあまり発展していない。
  • 精通する技術者が少ない─PostgreSQLは、MongoDBなどのデータベースと結合されることがよくあり、それぞれのデータベースには専門知識が求められる。現在PostgreSQLに精通した技術者を見つけるのは難しく、データベースエンジニアとDevOpsチームは、PostgreSQLの管理ツールと併せて複数のデータベースを操作しなければならない。既存の工程を切り替えられない場合は管理が困難になる可能性が。
  • 整合性の欠如─オープンソースであるため、組織内のさまざまなIT開発者が有機的に活用できるが、IT環境内のすべてのPostgreSQLのインスタンスに対する共通知識が欠如してしまうという別の問題が生じる可能性がある。複数の開発者が同じ問題を解決しようとすると作業の重複や冗長化が生じる場合も。

PostgreSQLの代替サービス

PostgreSQLをWordPressで使用する場合の代表的な選択肢をいくつかみてみましょう。

MySQL

The MySQL logo, showing the text below a tilted, stylized blue dolphin body.
MySQLのロゴ(出典: Mecdata

データベースといえば、真っ先に思いつくのがMySQL。MySQLは、代替となるデータベースが登場するまでの長い間、開発者の定番として知られており、2019年には開発者の39%以上がMySQLを使用していました。PostgreSQLのような汎用性には欠けるものの、スケーラブルなウェブアプリケーションなど、さまざまなユースケースで重宝されています。

1995年のリリース以来、OracleがMySQLを所有しています。また、プラグイン、追加のサービス、拡張機能、強力なユーザーサポートを備えたMySQLアップグレード版も発表されています。MySQLについて理解を深めるには、まずクライアント/サーバーモデルとリレーショナルデータベースについて知る必要があります。簡単に言えば、リレーショナルデータベースは、1つの大きなストレージユニットにすべてのデータを格納するのではなく、テーブルとして知られるさまざまな個別のストレージ領域に分割して格納します。

リレーショナルデータベースは、信頼性が高いだけでなく、使い勝手の良さも魅力です。MySQLはSQLに精通していなくても使用でき、他のデータベースほど操作の習得は難しくありません。

WordPressを使用している場合、MySQLをできるだけ高速に動作させるためには、WordPressの使用方法に合わせてデータベースを改善するのがベストです。これは、専門用語でMySQLパフォーマンスチューニングと呼ばれ、MySQLを最適化することで、読み込み時間が短縮でき、サイト速度が全体的に上がります。また、データベースを適切にメンテナンスしていれば、確実に性能が向上していくはずです。

MariaDB

The MariaDB logo, showing the text below a stylized brown sea lion outlined in blue.
MariaDBのロゴ(画像出典: Docker Hub

MariaDBは、リレーショナルデータベース管理システムMySQLのフォーク(商用サポート)で、現代の需要に応えるべく、独特のアプローチを取っています。MariaDBの目的の明確に定まったストレージエンジンは、以前には膨大な数の専用データベースを必要としていたワークロードの処理もこなします。クラウド上でも、コモディティハードウェア上でも、組織にとってのワンストップサービスです。

分析、トランザクション、または両方の用途に数分で導入可能。主要なエンタープライズ機能はそのままで、比類のない柔軟性を実現できます(完全なSQLと真のACIDコンプライアンスを含む)。

MariaDBには、以下のサービスがあります。

  • MariaDB Enterprise─分析、トランザクション、またはハイブリッドトランザクション/分析処理のワークロードに見事に対応する、プロダクショングレードのオープンソースデータベース。MariaDB Enterpriseは、カラム型データベースやスタンドアロン型データベースから、1秒間に数百万のトランザクションを処理する完全分散型SQLデータベースまで拡張できる性能も備えています。また、数十億行のインタラクティブな簡易的な分析も実行することができます。
  • MariaDB Community Server─今日、大多数の開発者が利用しているオープンソースのリレーショナルデータベース。Oracle、MySQL、その他様々なデータベースと互換性があるだけでなく、恒久的にオープンソースであることが保証されています。分析用のカラムナストレージ、モダンなSQL、追加可能なストレージエンジン、高可用性などが主な特長です。
  • MariaDB SkySQL─SkySQLは、MariaDB Enterpriseの性能と、分析、トランザクション、およびハイブリッドワークロードのサポートをクラウドに取り込むDBaaS(Database-as-a-Service)として知られています。Kubernetes上に構築され、クラウドサービスおよびインフラストラクチャ用に改良されています。セルフサービス型と使いやすさに加え、一流のサポートと信頼性により、その名を轟かせます。クラウド上で重要なデータベースを安全に運用し、かつエンタープライズガバナンスを実現するために必要なものがすべて揃っています。

MySQLとの互換性があるため、その「代用品」としてMariaDBを利用しても、実質的に何の問題もありません。

データベースの活用

初めてサイトを持つ人にとって、初心者向けのプラットフォームといえば、おそらくWordPressが思い浮かぶはず。WordPressでは、コーディングの知識がなくても様々なことが実現できます。しかし、WordPressの可能性を最大限に引き出すには、基本的な要素をいくつか押さえておくのが賢明です。例えば、WordPressを利用して長年サイトを運営しているのであれば、WordPressのデータベースの仕組みについて学んでみるのも手です。

なぜWordPressにデータベースが必要なのかという疑問が湧くかもしれませんが、WordPressには見た目以上の機能が備わっています。サイトの規模にかかわらず、WordPressが効率的に機能するのは、その背景でさまざま作業が行われているおかげです。

WordPressサイトは、さまざまな種類のデータで構成されています。そして、このデータはすべてWordPressの統合データベースに格納されます。データベースは、WordPressサイトに不可欠な存在であり、管理者や訪問者によって行われる変更をすべて保存し、サイトをシームレスに機能させる役割を担っています。以下が、WordPressのデータベースに集約されるデータの一部です。

  • タグやカテゴリなどの構造を示す情報
  • サイト全体の設定
  • 固定ページ、投稿、関連コンテンツ
  • テーマやプラグイン関連データ
  • ユーザーのコメントと情報

データベースは、WordPressサイトのインストール時に作成されます。基本的に自動的に作成されますが、別途データベースを作成することも、既存のデータベースを新規サイトで利用することも可能です。

次に、WordPressのデータベースに関する推奨事項をみていきましょう。

データベース管理ツールの使用

データベース管理ツールの基本的な機能は、データベースの内容を確認することです。データベースを円滑に機能させるためには、データベース管理ツールの活用が最善の策です。データベース管理ツールには、データベースを扱うプロに必要な機能が備わっています。

  • データベースアナリストには、複数のソースからのデータ抽出作業が欠かせません。その後、データのクリーニング、統合、そして、分析へ向けた準備などが行われます。データベースアナリストにとって、データセットやクエリへのアクセスをIT担当者を通さずに自由に作業できる環境は不可欠です。
  • データベース開発者には、質の高いコードの記述後、それをシームレスに管理するツールが必要です。データベース開発者の間では、リスクの増大を防ぎ、開発サイクルを短縮するため、プログラミング用のコラボレーションツールや自動化ツールが重宝されています。
  • データベース管理者には、データベースのパフォーマンスと健全性の追跡のために設計されたツールが必要です。データベース管理者は、パフォーマンス障害の解明と診断からデータベーススキーマの変更に至るまで、さまざまな作業を行います。

ビジネスの要件を満たすデータベース管理ツールをお探しならば、テスト、データベース開発、およびデプロイメント作業を継続的デリバリーと継続的インテグレーションの工程に組み込むことができるものをおすすめします。そうすることで、アプリケーション開発との連携が容易になります。

データベース管理ツールは、表形式の結果をチャート、ヒストグラム、グラフに変換してデータを可視化し、意思決定者に簡単に提示できるものが理想的です。また、トランザクション量の増加に伴って拡張性が下がるSQL文やアプリケーションを特定し、管理者が本番環境で問題が発生する前にその場所を突き止めることができるかどうかも重要です。

便利な機能を多数備え、洗練されたUIを特徴とする、オープンソースの無料データベース管理ツールとして、例えばAdminer(旧 phpMinAdmin)が挙げられます。この便利なデータベース管理ツールは、サーバーに簡単に導入できるのが強みです。PHPファイルをアップロードして、ブラウザにアクセスし、そこからログインするだけで完了します。

データベースプラグインの使用

サイトの質を確認したければ、データベースの調査を怠ってはなりません。サイトに関連するあらゆるデータは、WordPressのデータベースに格納されます。その中には、重要なものもありますが、そうでないものも。テーブルの不具合、昔の下書き、スパムコメントなど、不要なデータの蓄積を避けるには、WordPressのデータベース系プラグインを利用するのがおすすめです。

データベース系プラグインには、様々な形態があります。月または週単位でジャンクファイルのデータベースをクリーニングするプラグインもあれば、何かしらの変更を加える前(サイトの移行など)にデータベースをバックアップするのに便利なものもあります。データベース系プラグインを使用することで、サイトの速度改善が期待でき、より良いユーザー体験を提供し、検索エンジンで上位表示される確率を上げることができます。

データベースの診断と修復

WordPressユーザーであれば、厄介なエラーメッセージに遭遇したことが一度はあるはず。最も一般的なエラーメッセージの一つが以下の通りです。

This either means that the username and password information in your wp-config.php file is incorrect or we can't contact the database server at localhost.
データベース接続確立エラー

データベースの調整の重要性は、語るまでもありません。WordPressのエラーは、サイトの正常な動作を妨げるだけでなく、訪問者のユーザー体験に悪影響を与える可能性があります。インストールや更新の失敗、サイトのダウン、リソースの欠落は、売上げ創出のチャンスを逃し、ユーザーとの信頼関係に傷をつける恐れがあります。

まとめ

PostgreSQLは、SQLのコンプライアンスと拡張性を重視した、オープンソースの無料リレーショナルデータベース管理システムです。30年以上にわたる積極的な開発により、世界中で広く利用されています。

今回の記事では、PostgreSQLの特徴、アーキテクチャ、使用例、メリット、運用上の課題、および代表的な代替製品についてご紹介しました。最後に取り上げた、WordPressのデータベースの可能性を最大限に引き出しながら、スケーリングを続けるための推奨事項もぜひ参考にしてみてください。