Redshift設計での個人的知見のまとめ その2

データ連携の3つのタイプ

データの源泉からデータを連携してオリジナルレイヤにマージする際のデータ連携には以下の3つのタイプがある。

・置換データ連携
・差分データ連携
・スナップショットデータ連携

置換データ連携

置換データ連携は、単純にデータを全件転送してオリジナルレイヤのデータをすべて置換してしまう最も単純な連携だ。データの少ないマスタデータや、後述する差分データ連携が利用できない場合に利用する。

差分データ連携

差分データ連携は、前回の連携時点から新しく挿入や更新が行われたデータのみを転送して、オリジナルレイヤのデータにマージを行う連携だ。最も利用頻度の高いデータ連携方法で特別なことがなければこれを利用するのが良い。ただし差分データ連携の利用にはには以下のようないくつかの制限がある。

・主キーが存在すること(存在しない場合には更新マージができない)
・最終更新日時が存在すること(更新されないデータの場合には登録日時が必要)

オリジナルレイヤへのデータのマージは、ステージングレイヤを通して行われる。主キーが必要なのは、ステージングレイヤとオリジナルレイヤのデータの主キーを比較すればそれが新しく挿入されたデータなのか更新されてデータなのかは判断できるからだ。それぞれ新規データの差分を反映するSelect-Insertと、更新データ差分を反映するSelect-Updateを実行することでデータのマージを行うことができる。

差分データ連携で最終更新日時が必要なのは、当然前回からの差分を判定するためであり、これが更新されないと連携が行われずにRedshift内に古いデータが存在することになる。Redshiftに更新が反映されるタイミングで必ず最終更新日時が変更されるのかはデータの源泉となるシステムの保守担当に十分に確認しておく必要がある。
例えば運用保守作業で直接SQLを実行した場合や、システムが補助的にステータスを更新するなどの場合には最終更新日時が更新されないなどのケースが起こりがちだ。もしもデータ源泉側のシステムが新規開発するものであったり改修が可能であれば、ユーザオペレーションによる最終更新日時と、システムが自動的に変更を行ったことによる最終更新日時とは分けて保持することをおすすめしたい。

スナップショットデータ連携

スナップショットデータ連携は、定時で取得したスナップショットのテーブルを累積していく連携だ。例えば、在庫テーブルには現時点の最新の在庫情報しか持っていないが、日次での変遷を分析したいといった場合に役に立つ。スナップショットデータ連携では、タイムシリーズテーブルを利用すると便利が事が多い、これは日次などの定期スナップショットごとに新しいテーブルを作成する。「ベーステーブル名+日付」のようなテーブルが多量に作成されるので、これらのシリーズ化されたテーブルをすべてUNION ALLしたビューも同時に提供する。
タイムシリーズテーブルは、保存期間のはっきりしたテーブルに適用することがRedshift本家のページにも推奨されている。保存期間の切れたテーブルの削除はDeleteよりも高速であり、破損したブロックを作らないのでVacuumも不要だからだ。だが、差分データ連携の方でもにタイムシリーズテーブルを適用することには個人的に疑問を持っている。それは、タイムシリーズ自体がシステムを複雑にするし、Redshiftは更新可能ビューには対応していないので、挿入だけなら問題は少ないが更新する際にはビューの背後にあるテーブルにUpdateをかけなければならない。それにDeleteによる破損ブロックの問題は後述する保存期間内のデータのみに限定したディープコピーをすればよい問題だからだ。
対象データにもよるがスナップショットデータのテーブルはデータ量が多くなりがちなので使用には検討が必要なことがある。例えば、データの保持期間は日次で残す期間をどのくらいにするか、あるいは月次として保持する期間はどのくらいにするか、またそれらをどう組み合わせるかを設計する必要がある。また、単純な実装ではデータ源泉から全件を転送する方法が実現は簡単だが、前回からの更新分を転送することで保持するデータを削減する方法もある。
差分のみを転送する場合、基準となるスナップショットとそこからの差分データを利用して各時点のデータを導出することになるが、この歯抜けになった各時点のデータをBIツールから参照できるようにするためにクエリによって補完しなければならないことがある。また、基準となるスナップショット自体がデータの保持期限を過ぎた場合には。新しく基準となるスナップショットを作成することになる。差分による転送の実現は可能だが機構の複雑さはだいぶ増してしまう。
システムを運用していると、時には障害が発生する。置換データ連携や、差分データ連携ではデータ転送再開まで、しばらく古いままのデータがRedshiftにあるだけだが、スナップショットデータ連携では、それが必要とするその時にスナップショットを取れなければ情報は完全に失われてしまい、目的を達成できなくなってしまう。だからこの方式でのデータ連携では、Redshift自体はもちろんだが、データの源泉となるシステムに対しても信頼性の対策が求められることがある。また障害復旧時にはこれらのデータ連携から真っ先にデータ転送開始する必要がある。

この続きを読む その3へ

人気の投稿