Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
増え続けるトランザクションデータと向き合う
Search
nakaryooo
December 23, 2020
Technology
0
390
増え続けるトランザクションデータと向き合う
RDBで増えていくデータについて、事前にどういうことが考えられるか、増えた時にどういう手段が取れるかについて。
nakaryooo
December 23, 2020
Tweet
Share
More Decks by nakaryooo
See All by nakaryooo
再利用パターン / Pattern of code reuse
ryotanakaya
0
99
エンジニアリングエッセイのススメ
ryotanakaya
0
260
ソフトウェアアーキテクチャについて 語るときに 僕の語ること
ryotanakaya
1
1.1k
エンジニアと要件定義
ryotanakaya
2
780
Go と並行処理
ryotanakaya
0
330
ワクワク!Rubyクイズ!!
ryotanakaya
0
1.3k
シャッフルランチシステムを刷新してみた話
ryotanakaya
0
160
Other Decks in Technology
See All in Technology
祝!Iceberg祭開幕!re:Invent 2024データレイク関連アップデート10分総ざらい
kniino
3
260
NilAway による静的解析で「10 億ドル」を節約する #kyotogo / Kyoto Go 56th
ytaka23
3
380
10分で学ぶKubernetesコンテナセキュリティ/10min-k8s-container-sec
mochizuki875
3
330
LINEスキマニにおけるフロントエンド開発
lycorptech_jp
PRO
0
330
UI State設計とテスト方針
rmakiyama
2
580
NW-JAWS #14 re:Invent 2024(予選落ち含)で 発表された推しアップデートについて
nagisa53
0
260
社外コミュニティで学び社内に活かす共に学ぶプロジェクトの実践/backlogworld2024
nishiuma
0
260
podman_update_2024-12
orimanabu
1
270
KubeCon NA 2024 Recap / Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads
z63d
1
250
Qiita埋め込み用スライド
naoki_0531
0
5.1k
宇宙ベンチャーにおける最近の情シス取り組みについて
axelmizu
0
110
MLOps の現場から
asei
6
640
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
Mobile First: as difficult as doing things right
swwweet
222
9k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
98
YesSQL, Process and Tooling at Scale
rocio
169
14k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
The Cult of Friendly URLs
andyhume
78
6.1k
Documentation Writing (for coders)
carmenintech
66
4.5k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Navigating Team Friction
lara
183
15k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
GitHub's CSS Performance
jonrohan
1030
460k
Transcript
増え続ける トランザクションデータと向き 合う By Nakaya Ryota 2020/12/23
自己紹介 ギフティ入社:2019年1月 所属:CC Div. ProductUnit2 前職:バックオフィス系のパッケージベンダー(上流工程メイン) 好きなスタバメニュー:スターバックスラテ 最近は Go より
Ruby 書いてる インフラも頑張りたい
みなさん RDBで増えすぎたレコードの管理って どうしてますか?
(スキーマ変更したいけど、データ多すぎて安全に alter table かけら れないな...) 僕「古いデータ消してもいいですか」 顧客「物理削除は困っちゃうよねえ、監査とかあればデータ出さな いといけないし。論理削除ならいいんじゃない?」 僕「そうっすよねえ、はは」
None
そもそもデータの削除って 何を元に意思決定すればいいんだっけ...?
トランザクションデータとは トランザクションデータとは、企業の情報システムなど が扱うデータの種類の一つで、業務に伴って発生した 出来事の詳細を記録したデータのこと。 (IT用語辞典)
データは過去から未来に向かって 増え続ける(自明の理)
データが増えすぎると RDBMS では一般的に以下のような問題が起こる • パフォーマンス劣化 • チューニング性劣化する • スキーマ変更にかか るコストの増大
RDBMS 以外でも問題は起こる • 記憶媒体(ハードディスク)の限界 • アプリケーションサーバーでの意図せぬメモリ圧迫 • select all したら100万行釣れちゃったてへぺろ
データが増えすぎると データベースのスケーラビリティをあらかじめ検討して おかないと、気づいた時にはメンテ不可能になってい るかもしれない きちんと正規化して index を張ってあっても、大規模 テーブルのスキーマ変更をダウンタイムなしで行うの はハードルが高い
じゃあどうすれば...?
データが増えすぎる前に できることを考える
データが増えすぎる前に このデータがいつ作られるのかだけでなく いつ消されるのか(消してもいいのか)も 検討した方が良い ※ 「消す」というのは無効化のことではなくその名の通り削除を表しています
データが増えすぎる前に この世の中には大きく二種類のデータがある • 法定保存文書を電子化したもの • それ以外
データが増えすぎる前に この世の中には大きく二種類のデータがある • 法定保存文書を電子化したもの →法律で保存期間が決められている • それ以外 →保存期間に関する公的な制約がない
法定保存文書とは、 法律で文書の保存が義務付けられており、その保存 期間も決められた文書のこと データが増えすぎる前に
データが増えすぎる前に 法定保存文書の例 • 株主名簿(永年) • 取締役会議事録(10年以上) • 取引に関する帳簿(7年以上) • 仕訳帳、現金出納帳、売掛帳、買掛帳など
• 決算に関して作成された書類(7年以上) etc refs: https://www.storage-channel.jp/blog/legal-document-retention-period.html
以前は必ず紙での保管、提出が義務付けられていた が、近年は法定文書を電子化する動きが活発 データが増えすぎる前に
普段はアクセスされることはないが、 監査の際に開示することが法律的に求められる データが増えすぎる前に (注:画像はイメージです)
開示ができなかったりすると最悪捕まります データが増えすぎる前に (注:画像はイメージです)
どのデータが法定文書に当たるのかは、ケースバイ ケースなので、事前に法務担当者としっかりチェックし ましょう ※ 会計システムに連携済みであったとしても、 raw データを証跡として求められることは全然ある(らしい) データが増えすぎる前に
法定文書以外のデータは どうすればいいの...??
法定文書以外のデータは保護期間を自由に決められ る (法律的にはなんの制約もないので、別に保護しなくてもいい) データが増えすぎる前に
とは言え フリーダムだと判断基準がなくて困るので
SaaS サービスを提供する場合、 SLA(Service Level Agreement)、利用規約によって データの管理方法を定めるのが一般的 データが増えすぎる前に
データが増えすぎる前に 経産省が公開している SaaS 向け SLA ガイドライン https://www.meti.go.jp/policy/netsecurity/secdoc/contents/downloadfils/080121saasgl.pdf
データが増えすぎる前に 経産省が公開している SaaS 向け SLA ガイドライン https://www.meti.go.jp/policy/netsecurity/secdoc/contents/downloadfils/080121saasgl.pdf
データが増えすぎる前に データ消去の要件として、 ゴミデータ(古いトランザクション)の取り扱いを定義しておく
要件定義をする際に、非機能要件として • 性能要件 • セキュリティ要件 みたいなものを定義すると思うんですけど、 その一項目として議論するイメージ データが増えすぎる前に
アプリケーションとして必要なデータの定義、不要だと みなせるデータの定義ができていれば、 例えばバッチ処理などで定期的に古いデータを削除/ 退避するなどして、データベースがハイパフォーマンス な状態を維持できる(かもしれない) データが増えすぎる前に
(スキーマ変更したいな、マイグレーション実行や...!!) 僕「古いデータ消してもいいですか」 顧客「物理削除は困っちゃうよねえ、監査とかあればデータ出さな いといけないし。論理削除ならいいんじゃない?」 僕「そうっすよねえ、はは」 そもそもこんな議論が必要ない (かもしれない)
データが増え過ぎちゃった時に できることを考える
データは過去から未来に向かって 増え続ける(2回目)
広がってもせいぜい アイビーリーグまでだ ろ... この設計でヨシッ! (注:筆者はマークのことが大好きです)
2019年時点での facebook のユーザー数
27億
設計時点で未来のトランザクションの ことなんてわからん (っていうか明日何が起こるかもわからんこの御時世 )
未来はわからないけど データが増えすぎちゃった時に 取れる行動を考えておくことはできる
何も考えずに物理的にデータを削除する • DELETE クエリを発行して、記憶媒体からデータを削除する • 削除する量にもよるが、物理削除してデフラグ、インデックスツ リーの更新まで完了すればパフォーマンス的にポジティブな改善 が見られる可能性が高い • 復元不可能なので、選択肢としては現実的ではない
データが増えすぎちゃった時に
古いデータをアーカイブする • ある基準でデータを退避して、アプリケーションからは必要な データのみを扱えるようにする • 古いかどうかはアプリケーションの要件によって決まる • もう参照も更新もしないよ、とか • アーカイブのやり方は色々あって、アーカイブテーブルを作って
退避したり、データベースダンプファイルを作ったり • いづれにせよ大元のテーブルからは物理削除する データが増えすぎちゃった時に
物理設計を見直す • secondary index の設計 • DBのテーブルを水平分割する(horizontal partitioning) • DBのテーブルを垂直分割する(vertical
partitioning) データが増えすぎちゃった時に(というか設計時に)
水平分割(シャーディング) 1つのテーブルの各行を別々のテーブルに分散させること データが増えすぎちゃった時に(というか設計時に) user data
水平分割(シャーディング) 1つのテーブルの各行を別々のテーブルに分散させること データが増えすぎちゃった時に(というか設計時に) 北海道 user 東日本 user 西日本 user user
data
水平分割(シャーディング) 1つのテーブルの各行を別々のテーブルに分散させること • 各テーブルの容量は減って取り 扱いしやすくなる • パーティションキーの設計が難し い • データの偏り(ホットスポット)がで
きる • 一貫性の管理やテーブルをまた がるビューが欲しい時に union し なければいけないなどの面倒さは ある • Cassandara や MongoDb など、 保存先のノードを意識しなくてもい いテクノロジーもある データが増えすぎちゃった時に(というか設計時に) 北海道 user 東日本 user 西日本 user user data
垂直分割 テーブルの一部の列だけを抜き出す形で分割を行う データが増えすぎちゃった時に(というか設計時に) serial_number available_until message balance 111…. 2020/XX/YY happy
birthday 500 999... 2020/XX/YY happy new year 200
垂直分割 テーブルの一部の列だけを抜き出す形で分割を行う データが増えすぎちゃった時に(というか設計時に) serial_number available_until message balance 111…. 2020/XX/YY happy
birthday 500 999... 2020/XX/YY happy new year 200 serial_number available_until message 111…. 2020/XX/YY happy birthday 999... 2020/XX/YY happy new year serial_number balance 111…. 500 999... 200
垂直分割 テーブルの一部の列だけを抜き出す形で分割を行う データが増えすぎちゃった時に(というか設計時に) serial_number available_until message balance 111…. 2020/XX/YY happy
birthday 500 999... 2020/XX/YY happy new year 200 serial_number available_until message 111…. 2020/XX/YY happy birthday 999... 2020/XX/YY happy new year serial_number balance 111…. 500 999... 200 • よくあるのは列の内容の利用頻度によって分割するもの • この例だと、balance の更新でテーブルをロックしても、message などの表示のための select が待たされることはなくなる • 巨大な可変長カラム(BLOB、VARCHAR、および TEXT )は、脳死し て select * すると不要にメモリを圧迫しかねないので、切り出して おくというのもあり
NoSQLなどスケーラビリティの高いテクノロジーを採用 する • スキーマ変更も容易 • スキーマレス、列志向 • データ量が増えても select のパフォーマンスが劣化しづらい
• KVS なら 1億件あっても釣るのはほぼ一瞬(らしい) データが増えすぎちゃった時に(というか設計時に)
安全で楽しいデータライフを
~Fin~