こんにちはヤマウチです。
ラクスではいろいろなサービスでPostgreSQLを使っていますが、ログのような時系列データをPostgreSQLで効率的に管理する方法について調査しました。
ログのような時系列データには以下のような特徴があります。
- 追記と削除のみで更新は必要ない
- 時間が経過するにつれデータ量が増える
一方、リレーショナルデータベースには以下の特徴があります。
- トランザクションなどデータを確実に更新する機能がある
- 一つのテーブルに大量のデータを保存するとデータの追加や検索が遅くなる
上記のことから時系列データをリレーショナルデータベースで管理すると機能過多かつ処理が遅くなることがあり、代わりにNoSQLが使われることが多くあります。
このような時系列データをPostgreSQLで効率的に扱うための拡張であるTimescaleDBを調査しました。
TimescaleDBの特徴
TimescaleDBはPostgreSQLで時系列データを扱うための拡張機能でアメリカのTimescale社が開発しています。
データ量の多い時系列データを扱うために以下の機能を持っています。
- 日時カラムでのパーティショニング
- 古いパーティションの圧縮
また、PostgreSQLの拡張機能として開発されているため以下の特徴があります。
- SQLをそのまま使える
- 圧縮したデータも含めてダンプ・リストアが可能
- 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では上記の機能をPostgreSQLの継承によるパーティショニングを使って実現しており、継承によるパーティショニングとの関係は以下のようになっています。
TimescaleDBでの呼び方 | 継承によるパーティショニングでの呼び方 |
---|---|
ハイパーテーブル | 親テーブル |
チャンク | 子テーブル |
また、一定期間を過ぎたチャンクを自動的に圧縮する設定が可能となっています。
圧縮しているかどうかでチャンクに対して実施できる更新操作が変わります。
チャンク | 実施できるデータ更新操作 |
---|---|
圧縮していないチャンク | ・INSERT ・UPDATE ・DELETE |
圧縮したチャンク | ・INSERT ※UPDATE、DELETEは不可 |
圧縮したチャンクにはUPDATEはできませんが、ログのような時系列データを格納する場合は更新処理は実施しないため問題となりません。
また、DELETEもできませんが代わりに drop_chunks() という関数が用意されており古くなって不要になったデータはチャンクごと削除する仕組みとなっています。
drop_chunks() は内部的に DROP TABLE を実行するのと同じであるため、古いログをDELETEで削除したときのような不要領域が発生せず、かつ高速に処理が行われます。
今後TimescaleDBを使ったログ管理を検証していく予定です。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com