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
nakaryo
December 23, 2020
Technology
550
0
Share
増え続けるトランザクションデータと向き合う
RDBで増えていくデータについて、事前にどういうことが考えられるか、増えた時にどういう手段が取れるかについて。
nakaryo
December 23, 2020
More Decks by nakaryo
See All by nakaryo
エラー処理の温故知新 / history of error handling technic
ryotanakaya
7
2k
Ruby で gRPC を使おう / ruby-grpc
ryotanakaya
1
140
ギフティの技術ブログ 再出発とこれから / restart of giftee tech blog 2024
ryotanakaya
0
350
再利用パターン / Pattern of code reuse
ryotanakaya
0
200
エンジニアリングエッセイのススメ
ryotanakaya
0
500
ソフトウェアアーキテクチャについて 語るときに 僕の語ること
ryotanakaya
2
1.7k
エンジニアと要件定義
ryotanakaya
4
1.2k
Go と並行処理
ryotanakaya
0
410
ワクワク!Rubyクイズ!!
ryotanakaya
0
1.6k
Other Decks in Technology
See All in Technology
Cloud Run のアップデート 触ってみる&紹介
gre212
0
310
AIガバナンス実践 - 生成AIコネクタのデータ漏洩リスクと実務対策
knishioka
0
180
PHP と TypeScript の型システム比較:AI 時代の「型」は誰のためにあるのか? #frontend_phpcon_do / frontend_phpcon_do_2026
shogogg
1
250
トークン数だけでは測れない — Claude Code 組織展開の効果検証から学んだこと
makikub
0
130
ITエンジニアを取り巻く環境とキャリアパス / A career path for Japanese IT engineers
takatama
4
1.8k
JEP 522 Deep Dive - G1 GC同期コスト削減によるスループット向上を徹底検証&解説
tabatad
1
810
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
6
3.7k
MIERUNE JCT 発表資料「宇宙から伊能忠敬ごっこ」
syuchimu
0
180
サイバーセキュリティ概論 / Introduction to Cybersecurity
ks91
PRO
0
150
GoとSIMDとWasmの今。
askua
3
500
ブロックチェーン / Blockchain
ks91
PRO
0
110
【Gen-AX】20260530開催_JJUG CCC 2026 Spring
genax
0
420
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.9k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.3k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
180
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
130
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.3k
Believing is Seeing
oripsolob
1
140
Embracing the Ebb and Flow
colly
88
5.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Designing Powerful Visuals for Engaging Learning
tmiket
1
400
Music & Morning Musume
bryan
47
7.2k
For a Future-Friendly Web
brad_frost
183
10k
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~