RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

PostgreSQL + TimescaleDBでログ管理検討 - TimescaleDBについて

こんにちはヤマウチです。

ラクスではいろいろなサービスでPostgreSQLを使っていますが、ログのような時系列データをPostgreSQLで効率的に管理する方法について調査しました。

ログのような時系列データには以下のような特徴があります。

  • 追記と削除のみで更新は必要ない
  • 時間が経過するにつれデータ量が増える

一方、リレーショナルデータベースには以下の特徴があります。

  • トランザクションなどデータを確実に更新する機能がある
  • 一つのテーブルに大量のデータを保存するとデータの追加や検索が遅くなる

上記のことから時系列データをリレーショナルデータベースで管理すると機能過多かつ処理が遅くなることがあり、代わりにNoSQLが使われることが多くあります。

このような時系列データをPostgreSQLで効率的に扱うための拡張であるTimescaleDBを調査しました。

TimescaleDBの特徴

TimescaleDBはPostgreSQLで時系列データを扱うための拡張機能アメリカのTimescale社が開発しています。
データ量の多い時系列データを扱うために以下の機能を持っています。

また、PostgreSQL拡張機能として開発されているため以下の特徴があります。

TimescaleDBの機能とライセンス

TimescaleDBはオープンソース機能とコミュニティ機能に分かれており、それぞれApache License 2.0 と Timescale ライセンスの元で使えるようになっています。

それぞれのライセンスとできることをまとめると、以下のようになっています。

機能 ライセンス できること
オープンソース機能 Apache License 2.0 ・日時カラムでのパーティショニング
コミュニティ機能 Timescale License ・圧縮機能
パーティションの並び替え、移動

Timescale License の元で使えるコミュニティ機能は TimescaleDBの機能を使った Database-as-a-Service を提供する場合を除き自由に使えるようになっています。
実際にTimescaleDBを使用する場合はライセンスの原文を確認するようお願いいたします。

TimescaleDB License Agreement | Timescale

TimescaleDBの開発状況

OSSを利用する際には開発が活発に行われており、継続して利用できるかが重要となります。
このブログを書いている 2022-04-28 時点のリリース状況は以下のようになっており、活発に開発されていることが分かります。

バージョン リリース日
2.6.1 2022-04-11
2.6.0 2022-02-16
2.5.2 2022-02-09
2.5.1 2021-12-01
2.5.0 2021-10-28

また、v2.5.0ではPostgreSQL14にも対応しており、開発が止まって使えなくなるという心配は当面なさそうです。

Release notes | Timescale Docs

TimescaleDBのデータ管理

TimescaleDBでは以下のようにハイパーテーブルとチャンクで時系列データを管理します。

TimescaleDBのアーキテクチャ

実際のデータはチャンクに格納されますが、データの追加や検索をハイパーテーブルに行うことでTimescaleDBが自動的に適切なチャンクに振り分けてくれます。

TimescaleDBでは上記の機能をPostgreSQLの継承によるパーティショニングを使って実現しており、継承によるパーティショニングとの関係は以下のようになっています。

TimescaleDBでの呼び方 継承によるパーティショニングでの呼び方
ハイパーテーブル 親テーブル
チャンク 子テーブル

また、一定期間を過ぎたチャンクを自動的に圧縮する設定が可能となっています。
圧縮しているかどうかでチャンクに対して実施できる更新操作が変わります。

チャンク 実施できるデータ更新操作
圧縮していないチャンク ・INSERT
・UPDATE
・DELETE
圧縮したチャンク ・INSERT
※UPDATE、DELETEは不可

圧縮したチャンクにはUPDATEはできませんが、ログのような時系列データを格納する場合は更新処理は実施しないため問題となりません。
また、DELETEもできませんが代わりに drop_chunks() という関数が用意されており古くなって不要になったデータはチャンクごと削除する仕組みとなっています。

drop_chunks | Timescale Docs

drop_chunks() は内部的に DROP TABLE を実行するのと同じであるため、古いログをDELETEで削除したときのような不要領域が発生せず、かつ高速に処理が行われます。
今後TimescaleDBを使ったログ管理を検証していく予定です。


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.