著者は、コンピューター歴史博物館を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

監視システムやデータ収集システムなどの多くのアプリケーションは、さらに分析するためにデータを蓄積します。 これらの分析では、データやシステムが時間の経過とともにどのように変化するかを調べることがよくあります。 このような場合、データは時系列として表され、すべてのデータポイントにタイムスタンプが付いています。 例は次のようになります。

2019-11-01 09:00:00    server.cpu.1    0.9
2019-11-01 09:00:00    server.cpu.15   0.8
2019-11-01 09:01:00    server.cpu.1    0.9
2019-11-01 09:01:00    server.cpu.15   0.8
...

モノのインターネット(IoT)および産業用モノのインターネットの台頭により、時系列データの管理は不可欠なスキルになりました。 さまざまな時系列情報を収集するデバイスはますます増えています。たとえば、フィットネストラッカー、スマートウォッチ、自宅の気象観測所、さまざまなセンサーなどです。 これらのデバイスは多くの情報を収集するため、このデータはすべてどこかに保存する必要があります。

従来のリレーショナルデータベースは、データの保存に最もよく使用されますが、時系列の膨大なデータ量に関しては、常に適合するとは限りません。 大量の時系列データを処理する必要がある場合、リレーショナルデータベースは遅すぎる可能性があります。 このため、リレーショナルデータベースの問題を回避するために、NoSQLデータベースと呼ばれる特別に最適化されたデータベースが作成されました。

TimescaleDB は、時系列データを保存するために最適化されたオープンソースデータベースです。 PostgreSQL の拡張として実装され、リレーショナルデータベースの使いやすさとNoSQLデータベースの速度を兼ね備えています。 その結果、PostgreSQLを使用してビジネスデータと時系列データの両方を1か所に保存できます。

このチュートリアルに従うことで、Ubuntu 18.04でTimescaleDBをセットアップし、構成し、操作方法を学習します。 時系列データベースを作成し、簡単なクエリを作成します。 最後に、不要なデータを取り除く方法を説明します。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • Ubuntu 18.04の初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu18.04サーバー。これには、sudo権限を持つroot以外のユーザーとファイアウォールが含まれます。
  • サーバーにPostgreSQLがインストールされています。 Ubuntu18.04にPostgreSQLをインストールして使用する方法のステップ1に従ってインストールします。

ステップ1—TimescaleDBをインストールする

TimescaleDBはUbuntuのデフォルトのパッケージリポジトリでは利用できないため、このステップでは、TimescaleDBパーソナルパッケージアーカイブ(PPA)からインストールします。

まず、TimescaleのAPTリポジトリを追加します。

  1. sudo add-apt-repository ppa:timescale/timescaledb-ppa

ENTERキーを押して、このアクションを確認します。

次に、APTキャッシュを更新して、パッケージリストを更新します。

  1. sudo apt update

これで、インストールを続行できます。 このチュートリアルでは、PostgreSQLバージョン10を使用します。 別のバージョンのPostgreSQL(たとえば、11または9.6)を使用している場合は、次のコマンドの値を置き換えて実行します。

  1. sudo apt install timescaledb-postgresql-10

これでTimescaleDBがインストールされ、使用できるようになりました。 次に、それをオンにして、データベースを最適化するためにPostgreSQL構成ファイルでそれに関連付けられている設定のいくつかを調整します。

ステップ2—TimescaleDBの構成

TimescaleDBモジュールは、デフォルトのPostgreSQL構成設定で正常に動作しますが、パフォーマンスを向上させ、プロセッサ、メモリ、およびディスクリソースをより有効に活用するために、TimescaleDBの開発者はいくつかの個別のパラメーターを構成することをお勧めします。 これは、timescaledb-tuneツールを使用して自動的に実行するか、サーバーのpostgresql.confファイルを手動で編集することによって実行できます。

このチュートリアルでは、 timescaledb-tuneツールを使用します。このツールは、postgresql.confファイルを読み取り、インタラクティブに変更を提案します。

次のコマンドを実行して、構成ウィザードを開始します。

  1. sudo timescaledb-tune

まず、PostgreSQL構成ファイルへのパスを確認するように求められます。

Output
Using postgresql.conf at this path: /etc/postgresql/10/main/postgresql.conf Is this correct? [(y)es/(n)o]:

ユーティリティは構成ファイルへのパスを自動的に検出するため、yと入力してこれを確認します。

Output
... Is this correct? [(y)es/(n)o]: y Writing backup to: /tmp/timescaledb_tune.backup201911181111

次に、PostgreSQLサーバーの起動時にshared_preload_libraries変数を変更して、TimescaleDBモジュールをプリロードするように求められます。

Output
shared_preload_libraries needs to be updated Current: #shared_preload_libraries = '' Recommended: shared_preload_libraries = 'timescaledb' Is this okay? [(y)es/(n)o]:

shared_preload_librariesは、モジュールのコンマ区切りリストを値として受け入れ、データベースサーバーを起動する前にPostgreSQLがロードするモジュールを指定します。 この変更を行うと、timescaledbモジュールがそのリストに追加されます。

注: shared_preload_librariesで指定されたライブラリが見つからない場合、データベースサーバーは起動に失敗します。 shared_preload_librariesを使用するアプリケーションをデバッグするときは、このことに注意してください。 詳細については、shared_preload_librariesに関するこのPostgresqlCO.NFの記事を参照してください。

このプロンプトでyと入力し、ENTERを押して、TimescaleDBモジュールを有効にします。

Output
... Is this okay? [(y)es/(n)o]: y success: shared_preload_libraries will be updated

サーバーの特性とPostgreSQLのバージョンに基づいて、スクリプトは設定の調整を提案します。 yを押して、チューニングプロセスを開始します。

Output
Tune memory/parallelism/WAL and other settings? [(y)es/(n)o]: y Recommendations based on 7.79 GB of available memory and 4 CPUs for PostgreSQL 10 Memory settings recommendations Current: shared_buffers = 128MB #effective_cache_size = 4GB #maintenance_work_mem = 64MB #work_mem = 4MB Recommended: shared_buffers = 1994MB effective_cache_size = 5982MB maintenance_work_mem = 1021001kB work_mem = 5105kB Is this okay? [(y)es/(s)kip/(q)uit]:

timescaledb-tuneは、サーバーの使用可能なメモリを自動的に検出し、いくつかの設定の推奨値を計算します。 たとえば、shared_buffersは、データのキャッシュに割り当てられるメモリの量を決定します。 デフォルトでは、この設定はプラットフォームの範囲を広げるために比較的低いため、timescaledb-tuneは、値を128MBから1994MBに増やし、繰り返されるクエリなど、キャッシュされた情報を保存するためのより多くのスペース。 work_mem変数も増加し、より複雑なソートが可能になりました。

PostgreSQLのメモリ設定を調整するプロセスの詳細については、PostgreSQLwikiPostgreSQLサーバーの調整に関する記事を参照してください。

yと入力して、値を受け入れます。

Output
... Is this okay? [(y)es/(s)kip/(q)uit]: y success: memory settings will be updated

この時点で、サーバーに複数のCPUがある場合は、並列処理設定の推奨事項が見つかります。 これらの設定は、複数のCPUがデータベースをスキャンして要求されたデータをより迅速に返すために並行してクエリを実行する方法を決定します。

複数のCPUを使用している場合は、次のような推奨事項があります。

Output
Parallelism settings recommendations Current: missing: timescaledb.max_background_workers #max_worker_processes = 8 #max_parallel_workers_per_gather = 2 #max_parallel_workers = 8 Recommended: timescaledb.max_background_workers = 8 max_worker_processes = 13 max_parallel_workers_per_gather = 1 max_parallel_workers = 2 Is this okay? [(y)es/(s)kip/(q)uit]:

これらの設定は、リクエストとバックグラウンドタスクを処理するワーカーの数を調整します。 これらの設定の詳細については、TimescaleDBおよびPostgreSQLのドキュメントを参照してください。

yENTERの順に入力して、次の設定を受け入れます。

Output
... Is this okay? [(y)es/(s)kip/(q)uit]: y success: parallelism settings will be updated

次に、先行書き込みログ(WAL)の推奨事項を示します。

Output
WAL settings recommendations Current: #wal_buffers = -1 #min_wal_size = 80MB #max_wal_size = 1GB Recommended: wal_buffers = 16MB min_wal_size = 4GB max_wal_size = 8GB Is this okay? [(y)es/(s)kip/(q)uit]:

WALは、データベースに変更が加えられる前にPostgreSQLがデータファイルへの変更をログに記録するログ方法です。 WALは、データ変更の最新の記録に優先順位を付けることにより、クラッシュが発生した場合にデータベースを再構築できるようにします。 このようにして、データの整合性を維持します。 ただし、デフォルト設定では、非効率的な入出力(I / O)操作が発生し、書き込みパフォーマンスが低下する可能性があります。 これを修正するには、yと入力して入力します。

Output
... Is this okay? [(y)es/(s)kip/(q)uit]: y success: WAL settings will be updated

これで、その他の推奨事項がいくつか見つかります。

Output
Miscellaneous settings recommendations Current: #default_statistics_target = 100 #random_page_cost = 4.0 #checkpoint_completion_target = 0.5 #max_locks_per_transaction = 64 #autovacuum_max_workers = 3 #autovacuum_naptime = 1min #effective_io_concurrency = 1 Recommended: default_statistics_target = 500 random_page_cost = 1.1 checkpoint_completion_target = 0.9 max_locks_per_transaction = 64 autovacuum_max_workers = 10 autovacuum_naptime = 10 effective_io_concurrency = 200 Is this okay? [(y)es/(s)kip/(q)uit]:

これらのさまざまなパラメータはすべて、パフォーマンスの向上を目的としています。 たとえば、SSDは多数の同時リクエストを処理できるため、effective_io_concurrencyの最適な値は数百になる可能性があります。 これらのオプションの詳細については、PostgreSQLのドキュメントを参照してください。

yENTERの順に押して続行します。

Output
... Is this okay? [(y)es/(s)kip/(q)uit]: y success: miscellaneous settings will be updated Saving changes to: /etc/postgresql/10/main/postgresql.conf

その結果、/etc/postgresql/10/main/postgresql.confに既製の構成ファイルが作成されます。

注:インストールを自動化する場合は、--quietおよび--yesフラグを指定して初期コマンドを実行することもできます。これにより、すべての推奨事項が自動的に適用され、変更が加えられます。 postgresql.conf構成ファイルへ:

  1. sudo timescaledb-tune --quiet --yes

構成の変更を有効にするには、PostgreSQLサービスを再起動する必要があります。

  1. sudo systemctl restart postgresql.service

これで、データベースは最適なパラメーターで実行され、時系列データを処理する準備が整いました。 次の手順では、このデータの操作を試してみます。新しいデータベースとハイパーテーブルを作成し、操作を実行します。

ステップ3—新しいデータベースとHypertableを作成する

TimescaleDBのセットアップが最適化されると、時系列データを操作する準備が整います。 TimescaleDBはPostgreSQLの拡張として実装されているため、時系列データを使用した操作はリレーショナルデータ操作と大差ありません。 同時に、データベースを使用すると、将来、時系列テーブルとリレーショナルテーブルのデータを自由に組み合わせることができます。

これを示すために、PostgreSQLコマンドを使用してデータベースを作成し、TimescaleDB拡張機能を有効にして hypertable を作成します。これは、多くの個々のテーブルの高レベルの抽象化です。 ハイパーテーブルは、TimescaleDBで使用する主な構造です。

PostgreSQLデータベースにログインします。

  1. sudo -u postgres psql

次に、新しいデータベースを作成して接続します。 このチュートリアルでは、データベースにtimeseriesという名前を付けます。

  1. CREATE DATABASE timeseries;
  2. \c timeseries

PostgreSQLデータベースの操作に関する追加情報は、次の場所にあります。 CloudServerチュートリアルでPostgreSQLでテーブルを作成、削除、管理する方法

最後に、TimescaleDB拡張機能を有効にします。

  1. CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

次の出力が表示されます。

Output
WARNING: WELCOME TO _____ _ _ ____________ |_ _(_) | | | _ \ ___ \ | | _ _ __ ___ ___ ___ ___ __ _| | ___| | | | |_/ / | | | | _ ` _ \ / _ \/ __|/ __/ _` | |/ _ \ | | | ___ \ | | | | | | | | | __/\__ \ (_| (_| | | __/ |/ /| |_/ / |_| |_|_| |_| |_|\___||___/\___\__,_|_|\___|___/ \____/ Running version 1.5.1 For more information on TimescaleDB, please visit the following links: 1. Getting started: https://docs.timescale.com/getting-started 2. API reference documentation: https://docs.timescale.com/api 3. How TimescaleDB is designed: https://docs.timescale.com/introduction/architecture Note: TimescaleDB collects anonymous reports to better understand and assist our users. For more information and how to disable, please see our docs https://docs.timescaledb.com/using-timescaledb/telemetry. CREATE EXTENSION

前述のように、時系列データとの主な相互作用ポイントはハイパーテーブルです。ハイパーテーブルは、チャンクと呼ばれるデータを保持する多数の個別のテーブルで構成されます。

ハイパーテーブルを作成するには、通常のSQLテーブルから始めて、関数create_hypertableを使用してハイパーテーブルに変換します。

デバイスのコレクション全体の温度と湿度を経時的に追跡するためのデータを格納するテーブルを作成します。

  1. CREATE TABLE conditions (
  2. time TIMESTAMP WITH TIME ZONE NOT NULL,
  3. device_id TEXT,
  4. temperature NUMERIC,
  5. humidity NUMERIC
  6. );

このコマンドは、4列のconditionsというテーブルを作成します。 最初の列にはタイムスタンプが格納されます。これにはタイムゾーンが含まれ、空にすることはできません。 次に、時間列を使用して、テーブルを時間で分割されたハイパーテーブルに変換します。

  1. SELECT create_hypertable('conditions', 'time');

このコマンドは、 create_hypertable()関数を呼び出します。この関数は、PostgreSQLテーブルからTimescaleDBハイパーテーブルを作成し、後者を置き換えます。

次の出力が表示されます。

Output
create_hypertable ------------------------- (1,public,conditions,t) (1 row)

このステップでは、時系列データを格納するための新しいハイパーテーブルを作成しました。 これで、ハイパーテーブルに書き込んでデータを入力し、削除するプロセスを実行できます。

ステップ4—データの書き込みと削除

このステップでは、標準のSQLコマンドを使用してデータを挿入し、外部ソースから大量のデータセットをインポートします。 これにより、TimescaleDBのリレーショナルデータベースの側面がわかります。

まず、基本的なコマンドを試してください。 標準のINSERTSQLコマンドを使用して、ハイパーテーブルにデータを挿入できます。 次のコマンドを使用して、理論上のデバイスweather-pro-000000のサンプルtemperatureおよびhumidityデータを挿入します。

  1. INSERT INTO conditions(time, device_id, temperature, humidity)
  2. VALUES (NOW(), 'weather-pro-000000', 84.1, 84.1);

次の出力が表示されます。

Output
INSERT 0 1

一度に複数行のデータを挿入することもできます。 次のことを試してください。

  1. INSERT INTO conditions
  2. VALUES
  3. (NOW(), 'weather-pro-000002', 71.0, 51.0),
  4. (NOW(), 'weather-pro-000003', 70.5, 50.5),
  5. (NOW(), 'weather-pro-000004', 70.0, 50.2);

あなたは以下を受け取ります:

Output
INSERT 0 3

RETURNINGステートメントを使用して、INSERTコマンドが挿入されたデータの一部またはすべてを返すように指定することもできます。

  1. INSERT INTO conditions
  2. VALUES (NOW(), 'weather-pro-000002', 70.1, 50.1) RETURNING *;

次の出力が表示されます。

Output
time | device_id | temperature | humidity -------------------------------+--------------------+-------------+---------- 2019-09-15 14:14:01.576651+00 | weather-pro-000002 | 70.1 | 50.1 (1 row)

ハイパーテーブルからデータを削除する場合は、標準のDELETESQLコマンドを使用します。 次のコマンドを実行して、temperature80よりも高い、またはhumidity50よりも高いデータを削除します。

  1. DELETE FROM conditions WHERE temperature > 80;
  2. DELETE FROM conditions WHERE humidity > 50;

削除操作後、VACUUMコマンドを使用して、削除されたデータがまだ使用しているスペースを再利用します。

  1. VACUUM conditions;

VACUUMコマンドの詳細については、PostgreSQLのドキュメントを参照してください。

これらのコマンドは小規模なデータ入力には適していますが、時系列データは複数のデバイスから同時に巨大なデータセットを生成することが多いため、一度に数百または数千の行を挿入する方法を知ることも不可欠です。 csv 形式など、構造化された形式で外部ソースからデータを準備した場合、このタスクはすばやく実行できます。

これをテストするには、さまざまな場所の温度と湿度のデータを表すサンプルデータセットを使用します。 これは、データベースをテストするために作成された公式のTimescaleDBデータセットです。 サンプルデータセットの詳細については、TimescaleDBのドキュメントをご覧ください。

weather_smallサンプルデータセットからデータベースにデータをインポートする方法を見てみましょう。 まず、Postgresqlを終了します。

  1. \q

次に、データセットをダウンロードして抽出します。

  1. wget https://timescaledata.blob.core.windows.net/datasets/weather_small.tar.gz
  2. tar -xvzf weather_small.tar.gz

次に、温度と湿度のデータをデータベースにインポートします。

  1. sudo -u postgres psql -d timeseries -c "\COPY conditions FROM weather_small_conditions.csv CSV"

これにより、timeseriesデータベースに接続し、\COPYコマンドを実行して、選択したファイルからconditionsハイパーテーブルにデータをコピーします。 数秒間実行されます。

データがテーブルに入力されると、次の出力が表示されます。

Output
COPY 1000000

このステップでは、データをハイパーテーブルに手動およびバッチで追加しました。 次に、クエリの実行に進みます。

ステップ5—データのクエリ

テーブルにデータが含まれているので、さまざまなクエリを実行してデータを分析できます。

開始するには、データベースにログインします。

  1. sudo -u postgres psql -d timeseries

前述のように、ハイパーテーブルを操作するには、標準のSQLコマンドを使用できます。 たとえば、conditionsハイパーテーブルの最後の10エントリを表示するには、次のコマンドを実行します。

  1. SELECT * FROM conditions LIMIT 10;

次の出力が表示されます。

Output
time | device_id | temperature | humidity ------------------------+--------------------+--------------------+---------- 2016-11-15 12:00:00+00 | weather-pro-000000 | 39.9 | 49.9 2016-11-15 12:00:00+00 | weather-pro-000001 | 32.4 | 49.8 2016-11-15 12:00:00+00 | weather-pro-000002 | 39.800000000000004 | 50.2 2016-11-15 12:00:00+00 | weather-pro-000003 | 36.800000000000004 | 49.8 2016-11-15 12:00:00+00 | weather-pro-000004 | 71.8 | 50.1 2016-11-15 12:00:00+00 | weather-pro-000005 | 71.8 | 49.9 2016-11-15 12:00:00+00 | weather-pro-000006 | 37 | 49.8 2016-11-15 12:00:00+00 | weather-pro-000007 | 72 | 50 2016-11-15 12:00:00+00 | weather-pro-000008 | 31.3 | 50 2016-11-15 12:00:00+00 | weather-pro-000009 | 84.4 | 87.8 (10 rows)

このコマンドを使用すると、データベースにあるデータを確認できます。 データベースには100万件のレコードが含まれているため、LIMIT 10を使用して出力を10エントリに制限しました。

最新のエントリを表示するには、データ配列を時間の降順で並べ替えます。

  1. SELECT * FROM conditions ORDER BY time DESC LIMIT 20;

これにより、最新の上位20エントリが出力されます。

フィルタを追加することもできます。 たとえば、weather-pro-000000デバイスからのエントリを表示するには、次のコマンドを実行します。

  1. SELECT * FROM conditions WHERE device_id = 'weather-pro-000000' ORDER BY time DESC LIMIT 10;

この場合、weather-pro-000000デバイスによって記録された最新の10個の温度と湿度のデータポイントが表示されます。

TimescaleDBは、標準のSQLコマンドに加えて、時系列データ分析に役立つ多くの特別な関数も提供します。 たとえば、温度値の中央値を見つけるには、percentile_cont関数で次のクエリを使用できます。

  1. SELECT percentile_cont(0.5)
  2. WITHIN GROUP (ORDER BY temperature)
  3. FROM conditions
  4. WHERE device_id = 'weather-pro-000000';

次の出力が表示されます。

Output
percentile_cont ----------------- 40.5 (1 row)

このようにして、weather-pro-00000センサーが配置されている観測期間全体の温度の中央値が表示されます。

各センサーの最新の値を表示するには、last機能を使用できます。

  1. select device_id, last(temperature, time)
  2. FROM conditions
  3. GROUP BY device_id;

出力には、すべてのセンサーと関連する最新の値のリストが表示されます。

最初の値を取得するには、first関数を使用します。

次の例はもっと複雑です。 過去24時間以内の、選択したセンサーの1時間ごとの平均、最低、および最高気温が表示されます。

  1. SELECT time_bucket('1 hour', time) "hour",
  2. trunc(avg(temperature), 2) avg_temp,
  3. trunc(min(temperature), 2) min_temp,
  4. trunc(max(temperature), 2) max_temp
  5. FROM conditions
  6. WHERE device_id = 'weather-pro-000000'
  7. GROUP BY "hour" ORDER BY "hour" DESC LIMIT 24;

ここでは、PostgreSQL date_trunc関数のより強力なバージョンとして機能するtime_bucket関数を使用しました。 その結果、1日のどの時間帯に気温が上昇または下降するかがわかります。

Output
hour | avg_temp | min_temp | max_temp ------------------------+----------+----------+---------- 2016-11-16 21:00:00+00 | 42.00 | 42.00 | 42.00 2016-11-16 20:00:00+00 | 41.92 | 41.69 | 42.00 2016-11-16 19:00:00+00 | 41.07 | 40.59 | 41.59 2016-11-16 18:00:00+00 | 40.11 | 39.79 | 40.59 2016-11-16 17:00:00+00 | 39.46 | 38.99 | 39.79 2016-11-16 16:00:00+00 | 38.54 | 38.19 | 38.99 2016-11-16 15:00:00+00 | 37.56 | 37.09 | 38.09 2016-11-16 14:00:00+00 | 36.62 | 36.39 | 37.09 2016-11-16 13:00:00+00 | 35.59 | 34.79 | 36.29 2016-11-16 12:00:00+00 | 34.59 | 34.19 | 34.79 2016-11-16 11:00:00+00 | 33.94 | 33.49 | 34.19 2016-11-16 10:00:00+00 | 33.27 | 32.79 | 33.39 2016-11-16 09:00:00+00 | 33.37 | 32.69 | 34.09 2016-11-16 08:00:00+00 | 34.94 | 34.19 | 35.49 2016-11-16 07:00:00+00 | 36.12 | 35.49 | 36.69 2016-11-16 06:00:00+00 | 37.02 | 36.69 | 37.49 2016-11-16 05:00:00+00 | 38.05 | 37.49 | 38.39 2016-11-16 04:00:00+00 | 38.71 | 38.39 | 39.19 2016-11-16 03:00:00+00 | 39.72 | 39.19 | 40.19 2016-11-16 02:00:00+00 | 40.67 | 40.29 | 40.99 2016-11-16 01:00:00+00 | 41.63 | 40.99 | 42.00 2016-11-16 00:00:00+00 | 42.00 | 42.00 | 42.00 2016-11-15 23:00:00+00 | 42.00 | 42.00 | 42.00 2016-11-15 22:00:00+00 | 42.00 | 42.00 | 42.00 (24 rows)

より便利な関数は、TimescaleDBドキュメントにあります。

これで、データの処理方法がわかりました。 次に、不要なデータを削除する方法とデータを圧縮する方法について説明します。

ステップ6—データの圧縮と削除の構成

データが蓄積されると、ハードドライブ上でますます多くのスペースを占有します。 スペースを節約するために、TimescaleDBの最新バージョンはデータ圧縮機能を提供します。 この機能は、ファイルシステム設定を微調整する必要がなく、データベースをより効率的にするために使用できます。 この圧縮がどのように機能するかについての詳細は、TimescaleDBこの圧縮に関する記事を参照してください。

まず、ハイパーテーブルの圧縮を有効にします。

  1. ALTER TABLE conditions SET (
  2. timescaledb.compress,
  3. timescaledb.compress_segmentby = 'device_id'
  4. );

次のデータを受け取ります。

Output
NOTICE: adding index _compressed_hypertable_2_device_id__ts_meta_sequence_num_idx ON _timescaledb_internal._compressed_hypertable_2 USING BTREE(device_id, _ts_meta_sequence_num) ALTER TABLE

注:指定した期間のデータを圧縮するようにTimescaleDBを設定することもできます。 たとえば、次のように実行できます。

  1. SELECT add_compress_chunks_policy('conditions', INTERVAL '7 days');

この例では、データは1週間後に自動的に圧縮されます。

次のコマンドを使用して、圧縮データの統計を確認できます。

  1. SELECT *
  2. FROM timescaledb_information.compressed_chunk_stats;

次に、チャンクとそのステータスのリストが表示されます。圧縮ステータスと、非圧縮データと圧縮データが占めるスペースの量(バイト単位)です。

データを長期間保存する必要がない場合は、古いデータを削除して、さらに多くのスペースを解放できます。 このための特別なdrop_chunks関数があります。 これにより、指定した時間より古いデータを含むチャンクを削除できます。

  1. SELECT drop_chunks(interval '24 hours', 'conditions');

このクエリは、1日前より古いデータのみを含むハイパーテーブルconditionsからすべてのチャンクを削除します。

次の出力が表示されます。

Output
drop_chunks ---------------------------------------- _timescaledb_internal._hyper_1_2_chunk (1 row)

古いデータを自動的に削除するには、cronタスクを構成できます。 cronを使用してさまざまなシステムタスクを自動化する方法の詳細については、チュートリアルを参照してください。

データベースを終了します。

  1. \q

次に、シェルから実行する必要がある次のコマンドを使用して、crontabを編集します。

  1. crontab -e

次に、ファイルの最後に次の行を追加します。

crontab
...

0 1 * * * /usr/bin/psql -h localhost -p 5432 -U postgres -d postgres -c "SELECT drop_chunks(interval '24 hours', 'conditions');" >/dev/null 2>&1

このジョブは、毎日午前1時に1日より古い古いデータを削除します。

結論

これで、Ubuntu18.04サーバーにTimescaleDBがセットアップされました。 また、ハイパーテーブルの作成、データの挿入、データのクエリ、圧縮、不要なレコードの削除も試してみました。 これらの例を使用すると、時系列データを格納するための従来のリレーショナルデータベース管理システムに対するTimescaleDBの主な利点を利用できます。

  • より高いデータ取り込み率
  • クエリパフォーマンスの高速化
  • 時間指向の機能

時系列データの保存方法がわかったので、そのデータを使用してグラフを作成できます。 TimescaleDBは、GrafanaなどのPostgreSQLで動作する視覚化ツールと互換性があります。 Ubuntu 18.04チュートリアルにGrafanaをインストールして保護する方法を使用して、この人気のある視覚化ツールの詳細を学ぶことができます。