顧客データウェアハウスはすべてPostgresで構築しました。

Building a Customer Data Warehouse with Postgres: A Simplified Approach

Tags: Postgres, Data Warehouse, Foreign Data Wrappers, pg_cron, pg_partman

当サービスプロバイダーのTemboでは、顧客の使用状況や行動を追跡し理解するために、顧客データウェアハウスを構築することを望んでいました。私たちは、「私たちはどれだけのPostgresインスタンスを展開しているのか?」「最もアクティブな顧客は誰か?」、「時間ごとのサインアップはどれくらいあるか?」といった質問に迅速に答えるために、複数のソースからデータを一元化し、最新の状態に保つ必要がありました。

通常、このプロセスにはいくつかのオーケストレーションツールとテクノロジーが必要であり、その結果として非常に複雑なデータエコシステムが生まれます。しかし、私たちはPostgresを使用して顧客データウェアハウスを完全に構築し、外部データラッパーや他のPostgresの拡張機能を使用して効率を向上させ、プロセスを簡素化しました。私たちが構築したすべてのツールはオープンソースプロジェクトとして公開されており、Kubernetes Operatorを使用して独自にホストすることもできます。また、Tembo Cloud上でTembo Data Warehouseスタックを使用してこのようなデータウェアハウスを構築することも簡単になっています。

Temboでデータウェアハウスを構築するために、まずは外部ソースからPostgresに運用データを取り込む必要がありました。具体的には以下のソースからデータを取り込む必要がありました。

  • Postgresのインスタンス情報
  • Prometheusのメトリクスデータ
  • Clerk.devのデータ

これらのデータを1つの場所にまとめてデータを結合し、分析し、ダッシュボードで表示するためには、多くのツールが必要です。多くの組織は、この複雑さを扱うために外部のツールやベンダーを導入します。Airflow、dbt、Fivetran、Dagsterなどのツールは非常に人気があり、優れたプロジェクトですが、それらを使用すると莫大なコストがかかります。

新しいテクノロジーをエコシステムに導入するたびに、それは学習、習得、およびメンテナンスが必要なソフトウェアの一部になります。これは、チームにとって認知的な負荷の形で大きなコストとなります。また、設定、管理、およびメンテナンスにかかる時間とリソースも増えるため、システムはツールの数が多すぎて人間が頭に入れるのが困難になります。Uberのエンジニアたちも最近、これについて簡単に語っていました。

ですので、私たちは新しいツールを導入するのではなく、Postgresの拡張機能を使用することにしました。開発者としては、拡張機能は自然な感じがあります。お気に入りのリポジトリからモジュールやパッケージをインストールしてインポートする感覚です。これは完全に新しいツールよりも軽量で管理しやすくなります。

それでは、これらのソースからデータをPostgresに取り込むにはどうすればいいでしょうか?既に私たちは、postgres_fdwを使用してデータウェアハウスとコントロールプレーンのPostgresインスタンスを接続できることを知っていました。しかし、PrometheusとClerkのデータについてはどのようにして同じことを行えるのかはわかりませんでした。Prometheusにはすでにいくつかのプロジェクトが存在していましたが、私たちのユースケースには適しているものはありませんでした。Clerk.devにはPostgres用の既存の拡張機能がありませんでしたので、私たちは独自に作成することにしました。

外部データラッパー(FDW)は、Postgresを他のデータソースに接続するシンプルなインターフェースを提供するPostgresの拡張機能の一種です。Kafkaで作業したことがある場合、これは「コネクタ」と似ています。さまざまな外部データラッパーが利用可能であり、独自に作成することもできます。さらに、Wrappersフレームワークを使用すると、RustでFDWを開発することが非常に簡単になります。

そこで、私たちはWrappersフレームワークを使用して、これらのソースに接続するための2つの新しいFDW、clerk_fdwとprometheus_fdwを作成しました。

FDWを使用することは、非常に一貫した経験です。ここではclerk_fdwの設定プロセスを説明しますが、prometheus_fdwとpostgres_fdwでも同様です。

まず、拡張機能の作成コマンドを実行します。開発者にとっては、これはモジュールのインポートと似た感覚であり、それは良いアナロジーだと思います。また、外部データラッパーオブジェクト自体も作成する必要があります。

次に、サーバーオブジェクトを作成します。これは、ソースデータシステムへの接続を設定する場所です。Clerk.devの場合、APIキーを提供する必要があります。サーバーオブジェクトはどのFDWを使用するかも知る必要がありますので、上記で作成したclerk_wrapperに指示します。

最後に、外部テーブルを作成します。これは、PostgresにClerkのデータをどのようにマッピングするかをPostgresに伝える場所です。

PrometheusのメトリクスデータとPostgresのインスタンス情報についても同様のプロセスを行いました。

データウェアハウス内のデータは常に最新の状態に保たなければなりません。Temboでは、人気のあるジョブスケジューリング拡張機能であるpg_cronを使用してこれを実現しています。Unixのユーティリティ「cron」に精通している場合、pg_cronはまさにそれと同じですが、すべてPostgres内で実行されます。

データソースを更新するための関数を作成し、その関数をスケジュールに従って呼び出すようにpg_cronに指示します。pg_cronは非常に直感的に使用できます。ジョブの名前、スケジュール、実行するコマンドを指定するだけです。これは、Apache AirflowやDagsterを使用して書いたコードを実行するジョブを作成するのと非常に似ています。

たとえば、コントロールプレーンからクラスターメタ

注意

  • この記事はAI(gpt-3.5-turbo)によって自動生成されたものです。
  • この記事はHackerNewsに掲載された下記の記事を元に作成されています。
    We built our customer data warehouse all on Postgres
  • 自動生成された記事の内容に問題があると思われる場合にはコメント欄にてご連絡ください。

コメントする