PHP Conference Japan 2022
採択
2022/09/25 16:35〜
Track3
Regular Session (25mins)
Database 🔰はじめての登壇

PostgreSQL + TimeScaleDBでログ管理検討

Satoru Yamauchi

PHPでWebアプリケーションを作る場合はデータをPostgreSQLやMySQLのようなデータベースで管理することが多いと思いますが、
その中で取引記録、センサーから取得したデータ、システムに対する操作といった時系列データを扱いたい場合があります。

しかし時系列データには以下の特徴があり、データベースで扱うことが難しい場合があります。

・時間とともに保存するデータ量が増える
・一日のデータ量が多いかつ保存期間が長い場合はデータ量が膨大になる
・データに対する操作は追記と削除のみで更新は必要ない

リレーショナルデータベースはトランザクション機能や違う種類の入ったテーブルを結合するなど複雑なデータ処理が得意ですが、
トランザクションや結合の必要ないログのようなデータを扱うには機能過多かつデータ量が増えるたびに処理が遅くなると
いった問題があります。

私が開発に参加しているサービスはPHP + PostgreSQLで開発していますが、システムに対する操作をPostgreSQLに保存しています。
通常のユーザの操作では記録されるログの量は多くありませんが、バッチ処理やデータインポートが多い環境では一日あたり数百件
のログが記録される場合があります。

このような環境ではデータベースのサイズの半分以上がログになる場合があり、処理やメンテナンス作業の遅延が発生します。

そのため、このログが増える問題に対してPostgreSQLの拡張機能であるTimeScaleDBで対応できないか検討しました。
TimeScaleDBには時系列データを管理するための以下の機能があります。

・テーブルパーティショニングによる処理の高速化
・一定期間を過ぎたデータの圧縮

また、PostgreSQLの拡張機能であり、既存のSQLをそのまま使えるため、アプリの改修無しで適用することができます。

このセッションではTimeScaleDBの仕組みや適用した場合の効果について検証した結果を紹介します。
時系列データをすでにデータベースで扱っている方や、今後扱う予定がある方の参考になれば幸いです。