PostgreSQL からデータ ウェアハウスへ:ほぼリアルタイムの ETL / データ抽出のための最良のアプローチ

StackOverflow https://stackoverflow.com/questions/2519985

質問

背景:

OLTP 用に高度に最適化された PostgreSQL (v8.3) データベースを使用しています。

そこから半リアルタイムでデータを抽出する必要があります (半リアルタイムとは何を意味するのかを誰かが尋ねるはずです。答えはできるだけ頻繁に答えますが、ベンチマークとして、私は実用的です。 15 分ごとに期待されます)、それをデータ ウェアハウスにフィードします。

データ量はどれくらいですか?ピーク時には OLTP 側に 1 分あたり約 80 ~ 100,000 行のアクセスが発生しますが、オフピーク時にはこれが 15 ~ 20,000 行に大幅に減少します。最も頻繁に更新される行はそれぞれ最大 64 バイトですが、さまざまなテーブルなどがあるため、データは非常に多様で、1 行あたり最大 4000 バイトの範囲に及ぶ可能性があります。OLTP は 24 時間 365 日アクティブです。

最良の解決策?

私がまとめることができる最も実用的な解決策は次のとおりです。

  • TRIGGER を作成して、すべての DML アクティビティを回転 CSV ログ ファイルに書き込みます
  • 必要な変換を実行します
  • ネイティブ DW データ ポンプ ツールを使用して、変換された CSV を DW に効率的にポンプします。

なぜこのアプローチなのか?

  • トリガーを使用すると、システム全体ではなく、選択したテーブルをターゲットにすることができ、出力も構成可能です (つまり、CSV に変換されます)、記述と展開が比較的簡単です。SLONY は同様のアプローチを使用しており、オーバーヘッドは許容可能です
  • CSV は簡単かつ迅速に変換できます
  • CSV を DW に簡単に送り込む

検討された代替案....

  • ネイティブ ロギングの使用 (http://www.postgresql.org/docs/8.3/static/runtime-config-logging.html)。これの問題は、必要なものに比べて非常に冗長に見え、解析と変換が少し難しいことです。ただし、TRIGGER と比較してオーバーヘッドが少ないと思われるため、より高速になる可能性があります。確かに、システム全体にわたるため管理が容易になりますが、繰り返しになりますが、一部のテーブルは必要ありません(一部は、ログに記録したくない JMS メッセージの永続ストレージに使用されます)。
  • Talend などの ETL ツールを介してデータを直接クエリし、それを DW に送り込む...問題は、これをサポートするには OLTP スキーマを調整する必要があり、多くのマイナスの副作用があることです。
  • 微調整/ハッキングされた SLONY の使用 - SLONY は、変更をログに記録してスレーブに移行するという優れた仕事をするため、概念的なフレームワークは存在しますが、提案されたソリューションはより簡単でクリーンに見えます。
  • WALの使用

これまでに誰かがこれをやったことがありますか?あなたの考えを共有したいですか?

役に立ちましたか?

解決

対象のテーブルに一意のインデックス付きシーケンシャルキーがある (または拡張できる) と仮定すると、単純に発行するよりもはるかに優れた価値が得られます。 SELECT ... FROM table ... WHERE key > :last_max_key ファイルに出力します。ここで、 last_max_key 最後の抽出からの最後のキー値です (最初の抽出の場合は 0)。 段階的かつ分離されたアプローチにより、次のような問題を回避できます。 紹介する 挿入データパスのトリガー遅延 (カスタムトリガーか修正された Slony か)、設定によっては CPU の数などに応じてより適切に拡張できる可能性があります。(ただし、必要な場合は、 追跡 UPDATEs, 、シーケンシャルキーがあなたによって追加されたものであり、その後、あなたの UPDATE ステートメントはすべきです SET キー列を NULL したがって、新しい値を取得し、次の抽出で選択されます。するでしょう 追跡できない DELETEs トリガーなし。) Talend について言及したとき、これが念頭にあったものですか?

私は...するだろう 上記の解決策を実装できない場合を除き、ロギング機能を使用しないでください。;ロギングにはおそらく次のことが含まれます ロックオーバーヘッド ログ行が順番に書き込まれ、複数のバックエンドがログに書き込むときに相互に重複/上書きしないようにするためです (Postgres ソースを確認してください)。ロック オーバーヘッドは壊滅的なものではないかもしれませんが、インクリメンタル メソッドを使用できる場合はロック オーバーヘッドがなくても大丈夫です。 SELECT 代替。さらに、 ステートメントのログがかき消されてしまう 有用な警告メッセージまたはエラー メッセージ、および 解析自体は瞬時には行われません.

WAL を解析する意欲がない限り (トランザクション状態の追跡や、Postgres をアップグレードするたびにコードを書き直す準備ができているなど)、必ずしも WAL を使用する必要はありません。 追加のハードウェアを利用できるようにする, 、その場合、次のことができます 抽出のために WAL を別のマシンに送信する (2 番目のマシンでは次のことができます) 恥知らずにトリガーを使用する -- またはステートメントのロギングでさえも -- そこで何が起こっても影響を受けないため INSERT/UPDATE/DELETE (プライマリ マシンでの) パフォーマンスに関しては、ログを SAN に書き込むことができない限り、WAL を出荷することで同等のパフォーマンス ヒット (主にファイル システム キャッシュのスラッシングの点で) が発生することに注意してください。インクリメンタル実行時と同様に、別のマシンに SELECT.

他のヒント

あなたが唯一のIDと「チェックサムを」含む「のチェックサムテーブル」と考えることができるかどうか

あなたは速い新しいレコードを選択することができないだけでなく、変更したレコードを削除します。

チェックサムはあなたのようなCRC32チェックサム機能することができます。

PostgreSQLの新しいON CONFLICT句は、私は多くの更新を行う方法を変更しました。私はON CONFLICT UPDATEとターゲット表に1つのSQL文のINSERTで、その後一時テーブルに(row_update_timestampに基づいて)新しいデータを引き出します。あなたのターゲット表がパーティション化されているなら、あなたは(すなわち、直接パーティションテーブルをヒット)フープのカップルを介してジャンプする必要があります。 (些細な場合)は、一時テーブル(ほとんどの場合)またはON CONFLICT SQLでのロードとしてETLが発生する可能性があります。他の「UPSERT」システムへと比べて(更新、挿入するゼロ行等)は、このショー巨大な速度の改善。当社の特定のDW環境では、削除を受け入れるしたい/必要はありません。オンCONFLICTのドキュメントをチェックしてください! - それはそれのお金のためにOracleのMERGE実行を与える。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top