Amazon Web Services ブログ
時系列データを Amazon RDS for PostgreSQL から Amazon Timestream にバッチロード機能を利用して移行する方法
Amazon Timestream は、高速でスケーラブルなフルマネージドの時系列専用データベースであり、1 日に何兆もの時系列データを簡単に保存および分析できます。Timestream は、直近のデータをメモリに保持しつつ、定義したポリシーに基づいてコストが最適化されたストレージ層に履歴データを移動することで、時系列データのライフサイクル管理にかかる時間とコストを節約します。
本投稿では、バッチロード機能を使用して、Amazon Relational Database Service (Amazon RDS) for PostgreSQL から Timestream に時系列データを移行する方法を説明します。尚、時系列データが Amazon Aurora PostgreSQL 互換エディションに存在する場合にも、同じソリューションが機能します。
Timestream の概念
始める前に Timestream の主要な概念をいくつか確認してみましょう。
- 時系列 – 一定の時間間隔にわたって記録された 1 つ以上のデータポイント (またはレコード) のシーケンス。
- レコード – 時系列内の単一のデータ ポイント。
- ディメンション – 時系列のメタデータを説明する属性。ディメンションはディメンション名とディメンション値で構成されます。
- メジャー – レコードによって測定されている実際の値。例として、株価、CPU またはメモリの使用率、温度または湿度の測定値などが挙げられます。メジャーはメジャー名とメジャー値で構成されます。
Timestream のバッチロード機能を使用すると、Amazon Simple Storage Service (Amazon S3) に保存されている CSV ファイルからデータを取り込むことが可能となり、他のツールを使ったり、カスタムコードを記述する必要はありません。
ソリューションの概要
本ソリューションでは、マルチメジャーレコードを使用してデータをモデル化し、RDS for PostgreSQL データベースからサンプルデータセットを Timestream にロードします。マルチメジャーレコードを使用すると以下の利点があります。
- 時系列データをよりコンパクトな形式で保存できるため、ストレージのコスト削減につながります。
- コンパクトなストレージは、より単純なクエリ作成に役立ち、クエリパフォーマンスの向上が期待できます。
- 多くの場合でデータベーススキーマ変更がほぼ必要無くなる為、リレーショナルデータベースから Timestream へのデータ移行を簡素化する事ができます。
本アーキテクチャでは、まずAmazon RDS for PostgreSQL の aws_s3 エクスポート拡張機能を使用して、時系列データを S3 バケットに CSV ファイルとしてエクスポートし、同時にエポック形式へのタイムスタンプ変換も実行します (これはバッチロードの前提条件です)。データが S3 バケットに保存された後、バッチロード機能を利用して、Timestream データベースへの時系列データの 1 回限りの移行を実行します。
以下の図は、本アーキテクチャを示しています。
前提条件
このソリューションを実装するには、次のリソースを作成します。
- 時系列データを保存する RDS for PostgreSQL インスタンス。セットアップ手順については、こちらを参照してください。
- Amazon S3 からダウンロードされたサンプルデータセット。ダウンロードしたファイルを確認し、\copy コマンドを使用して RDS for PostgreSQL データベースにインポートします。
- Amazon RDS for PostgreSQL からのデータを格納する S3 バケット。手順については、Create your first S3 bucket および Setting up access to an Amazon S3 bucket を参照してください。
- AWS Identity and Access Management (IAM) のポリシーとロール。
- 時系列データを保存し、バッチロードのターゲットとなる Timestream テーブル。手順については、こちらを参照してください。クエリ実行を最適化するには、顧客定義のパーティション化キーを使用して、ディメンションの
hostname
に基づいて Timestream テーブルをパーティション化します。次のスクリーンショットは、Timestream コンソールでのこの構成を示しています。パーティション化キーについては、本投稿の後半で詳しく説明します。
さらに、バッチロードの前提条件、クォータ、ベストプラクティスを確認することをお勧めします。
データセット
Timestream のテーブルは、measure_name
と呼ばれる特別な属性 (または列) をサポートしています。Timestream は、measure_name
の値を使用してデータを分割し、インデックスを作成します。今回は、次のスクリーンショットに示すように、region
の分類を含んだ形で measure_name
属性をデータセットに追加しました。
サンプルデータセットは、AWS の複数のリージョンとアベイラビリティゾーンで実行されているコンピューティングインスタンス群からの CPU とメモリのメトリクスで構成されています。
Amazon S3 への PostgreSQL エクスポート用の Amazon RDS を準備する
エクスポートを準備するには、次の手順を実行します。
- Amazon RDS for PostgreSQL エンジンのバージョンが Amazon S3 にエクスポートする機能をサポートしていることを確認します。
- Amazon RDS for PostgreSQL に aws_s3 拡張機能をインストールします。
- Amazon RDS for PostgreSQL のアクセス許可を S3 バケットに付与します。
Amazon RDS for PostgreSQL から時系列データをエクスポートする
このステップでは、aws_s3.query_export_to_s3 関数を使用して、時系列データを Amazon RDS for PostgreSQL から S3 バケットにヘッダー付きの CSV 形式でエクスポートします。
SELECT * FROM aws_s3.query_export_to_s3(
'SELECT cast(EXTRACT(epoch from time) * 1000000 as BIGINT) as time, measure_name, region, location, hostname, mem_usage, cpu_usage from perf_metrics',
aws_commons.create_s3_uri('test-aws-dms-target-bucket/batchload', 'perf_metrics.csv', 'us-west-2'), options :='format csv, HEADER true');
Timestream バッチロードの前提条件を満たすために、EXTRACT 関数を使用してタイムスタンプ列をエポック (マイクロ秒) 形式に変換することに注意してください。
パフォーマンス指標データのモデリング
バッチロードを使用して Timestream テーブルにロードするデータセットの属性と、それがパフォーマンスにどのように影響を与えるのか見てみましょう。
- time – パフォーマンスメトリクスが収集された正確な時間
- measure_name – パフォーマンス メトリックを分類するための集約属性
- region – ホストが存在するリージョン
- location – ホストが配置されているアベイラビリティーゾーン
- hostname – メトリクスが収集されるホスト名
- mem_usage – ホストのメモリ使用率
- cpu_usage – ホストの CPU 使用率
適切なディメンジョンとメジャーを選択する
従来のリレーショナルデータベースから Timestream に移行する場合、テーブルと列を既存のデータベースから Timestream にそのままダンプすればうまくいくと考えるかもしれません。ですが、本当の課題は、クエリパターンを理解し、適切なディメンション、メジャー、およびオプションでパーティションキーを選択することにあります。
レコードのタイムスタンプを含むディメンションは、レコードを誰が、何を、いつ、どこで記録したかを特定するのに役立ちます。また、ディメンションは、データを整理および分類し、クエリの一部としてデータをフィルタリングするために使用されます。したがって、本投稿で使用するテーブルの region
、location
、および hostname
は、サーバーパフォーマンスのメトリックデータを整理および分類するための理想的な選択肢です。
メジャーは定量的なデータ (時間の経過とともに変化する値) であり、データの数学的計算 (合計、平均、変化率の差などの計算) と定量的分析を実行するための値を提供します。したがって、本投稿で使用する列 (測定値) mem_usage
と cpu_usage
は、ホストのパフォーマンスに関連する重要なメトリックを取得します。
ディメンションの数、メジャー (レコードごとの最大メジャー、テーブル全体の一意のメジャー)、およびレコードの最大サイズには制限がある為、データモデルを設計する際には、これらの要素を考慮する必要があります。多くの場合、Timestream に取り込まれるデータは、時系列分析に必要な属性以外の追加の属性を含むイベントまたはメトリクスを通じて発生します。制限に達しないようにするには、必要な属性のみをターゲットにします。データに関連性がなく、一緒にクエリを実行しない場合は、1 つの統合テーブルよりも個別のテーブルを使用する方が適しています。
データモデリングのベストプラクティスの詳細については、こちらのブログを参照してください。
顧客定義のパーティションキーの選択
顧客定義のパーティションキーは、クエリを高速化し、特定の時系列データ関連のニーズに基づいてより効率的に洞察を得るために必要な柔軟性を提供する新機能です。パーティショニングは、複数の物理ストレージユニットにデータを分散するために使用される技術で、より高速かつ効率的なデータの取得を可能にします。顧客定義のパーティションキーを使用すると、クエリパターンやユースケースに合わせたパーティションスキーマを作成できます。
Timestream でパーティション化する場合、パーティションキーを自身で選択するか、measure_name
列に基づくデフォルトのパーティションを使用するかを選択できます。
カーディナリティの高い列を持ち、クエリの述語として頻繁に使用されるディメンションに基づいてパーティション キーを選択することを推奨します。これにより、パーティション間でデータが均等に分散され、パフォーマンスの問題が回避されます。
このパフォーマンスメトリクスの使用例では、measure_name
(デフォルト) や hostname
などのカーディナリティの高い列がパーティションキーとして適している可能性がありますが、どの列がクエリ作成時のフィルタリングに頻繁に使用され、カーディナリティの高い列であるかによって選択する必要があります。この使用例では、クエリアクセスパターンは述語として hostname
を頻繁に使用しており、カーディナリティの高い列でもある為、hostname
を顧客定義のパーティションキーとして構成しました。
デフォルトのパーティション分割ではなく、顧客定義のパーティションキーを使用することを強くお勧めします。
顧客定義のパーティションキーを使用したクエリパフォーマンスの最適化の詳細については、こちらのブログを参照してください。
Timestream のバッチロードを実行する
バッチロードタスクを作成するには、次の手順を実行します。
- Timestream コンソールのナビゲーションペインで、管理ツール、バッチロードタスクの順に選択します。
- バッチロードを作成を選択します。
- ターゲットデータベースでは、前提条件として作成したデータベースを選択します。
- ターゲットテーブルで、前提条件として作成したテーブルを選択します。必要に応じて、新しいテーブルを作成を選択して、このペインからテーブルを追加できます。
- データソースの S3 の場所 で、ソースデータが保存されている S3 バケットを選択します。S3 を参照 ボタンを使用して、アクティブな AWS アカウントがアクセスできる S3 リソースを表示するか、S3 の場所の URL を入力します。データ ソースは同じリージョンに存在する必要があります。
- ファイル形式の設定では、デフォルト設定を使用して入力データを解析できます。高度な設定を選択し、CSV 形式のパラメーターを選択し、入力データを解析するパラメーターを選択することもできます。これらのパラメータの詳細については、こちらを参照してください。
- 次に、Visual Builder を使用してデータモデルマッピングを構成します。
- エラーログリポートのエラーログの S3 の場所で、エラーの報告に使用される S3 の場所を選択します。このレポートの使用方法については、こちらを参照してください。
- 暗号化キータイプ で、次のいずれかを選択します。
- Amazon S3 マネージドキー (SSE-S3) – Amazon S3 が作成、管理、および使用する暗号化キー
- AWS KMS キー (SSE-KMS) – AWS Key Management Service (AWS KMS) によって保護された暗号化キー
- 次へを選択します
- レビューして作成ページで設定を確認し、必要に応じて編集します。
- バッチロードタスクを作成を選択します。
- バッチロードのステータスを確認します。
問題が発生した場合は、一般的なエラーのトラブルシューティングを参照してください。
バッチ ロードタスクが正常に完了したら、Timestream クエリエディターに移動して結果をクエリできます。
クリーンアップ
継続的な料金が発生しないように次のリソースを削除しましょう。
結論
本投稿では、バッチロード機能を使用して時系列データをリレーショナルデータベースから Timestream に移行する方法を説明しました。ビジネスニーズに合わせて Amazon QuickSight または Grafana ダッシュボードを使用してデータを視覚化する方法についても利用して頂く事をお勧めします。
翻訳はテクニカルアカウントマネージャーの西原が担当しました。原文はこちらをご覧下さい。