1. London Tech Talk
  2. DDIA Ch7: Transactions
2023-11-04 43:13

DDIA Ch7: Transactions

spotify apple_podcasts
00:14
スピーカー 2
はい、じゃあ、浅井さん、今日もよろしくお願いします。
スピーカー 1
よろしくお願いします。
スピーカー 2
はい、ということで、引き続き、DDIA Book Clubの、
まあ、週、Book Club後の収録になりますね。
今日は、Chapter 7、Transactionsの章を読んできましたね。
スピーカー 1
はい。この本、全部で12章なんで、ちょうど折り返せず第7章だと。
スピーカー 2
あー、そっかそっか。
スピーカー 1
多分。
スピーカー 2
まあ、なかなか、ボリューミーな、濃い内容でしたね、今回もね。
スピーカー 1
はい、面白い内容でしたね、なんか。
スピーカー 2
ね。
スピーカー 1
やっぱり、この本読むだけだと、あんまり理解できないんですけど、
そっから、この臨読会を通して、かなり理解が深まった感じがあるので、
今日も良かったなというふうに思います。
スピーカー 2
ね。いや、もうね、この臨読会のおかげで、結構頑張って読んでるみたいなところ、僕はあるので、
今はね、2週間に2回ぐらいのペースでやってますもんね。
スピーカー 1
はい。
なんかその、臨読会で皆さんが結構、かなり発言もしてくださるし、
まあ、コメントも事前に書いてくださるじゃないですか。
まあ、それが皆さん結構、日に日に、ていうか、2週間ごとにレベルが上がってくるので、
もっと頑張んなきゃなみたいので、どんどん自分も調べる量が増えていったみたいなところがあって、いいですね。
スピーカー 2
なんかね、いい感じのポジティブループになってる気がするね。
うん。
僕も最初、なんか。
スピーカー 1
1センテンスぐらい書いてて、終わってたんだけど、戻ってきたらすっごい書いてたから、ああ、もうちょっと書こうかなみたいな。
確かに。
スピーカー 2
ねえ。
スピーカー 1
Google Docsのページ数にすると、5ページ、4ページ分くらいコメントになってて、すごいな。
スピーカー 2
まじか。
スピーカー 1
はい。
スピーカー 2
これ、公開したいぐらいだね。
確かに。
スピーカー 1
公開してもいいかもしれないです、なんか。
スピーカー 2
ねえ。まあ、参加者のね、あの、同意があればですけど。
スピーカー 1
そうですね。
スピーカー 2
全部公開しなくても。
はい。
スピーカー 1
1センテンスやってるよみたいなスクショぐらいね、どっかで共有したいけど。
ブログとかに書いたりとかしてもいいかもですね。
スピーカー 2
ああ、いいかもね。
やっぱなんか、交流が発生してるのがいいね。
ちょっと今回からやってみたけど、Google Docsでコメントしてみたりとか。
はい。
ブッククラブのね、最中も、なんか、絵文字くれたり、スタンプくれたり、コメントくれたりみたいな感じで。
一方向じゃん、基本。本って。
読んで終わりみたいな。
そうですね。
スピーカー 1
確かに。
スピーカー 2
せいぜい、字号を読んだ後にブログ書いて、発信してはするかもしんないけどさ。
スピーカー 1
うん。
スピーカー 2
うん。
スピーカー 1
僕もその、けんさんにコメントしていただいて、なんか、あ、確かにこの、自分が言ってること微妙に、なんか、間違ってるかもなっていうの気づいたりして、
それでさらに調べ直してみたいなのがあったんで。
03:02
スピーカー 2
うん。
スピーカー 1
さらにフィードバックグループを何度か回せるみたいなのが、いいですね、交流があると。
スピーカー 2
ねえ、うん。
他人がわか、他人に質問されて自分が答えられないってことは多分。
多分、自分もわかってなかったってことだしね。
うん。
どうすか、こう、林独会ファシリテーションするみたいな意味で、もう3回かな?
スピーカー 1
そうですね。
いや、まあ、徐々に慣れてきて、最初は結構、知らない方も来たんで緊張したんですけど、
まあ、同じメンバーで3回やらせていただいて、だいぶ慣れてきて、まあ、すごいやりやすいですね、今は。
スピーカー 2
ね。
スピーカー 1
かつ、あの、参加者のともしさんも今日褒めてくださったんですけども、
フォーマットがいいっておっしゃってくださって、まあ、けんさんと僕で作ったフォーマットにはなると思うんですけど、
あの、これを他の自分の会社でも使ってくださってるってことは、林独会のフォーマット、なんか。
スピーカー 2
ねえ、あれめっちゃ嬉しいんじゃないですか、浅井さんとしては。
スピーカー 1
嬉しいですね。
スピーカー 2
うん。
スピーカー 1
交流が広がっていくっていうのが。
スピーカー 2
ねえ。
なんかこう、ブッククラブノウハウじゃないですけど、ブッククラブやってどうだったみたいなのを最後にやりたいですよね。
なんかこう、DDIAボーンのデータベースと言い寄せたりとか。
確かに。
データベースという要素を抜きにして。
スピーカー 1
確かに。そうですね。ブッククラブの進め方みたいな話みたいなのができるかもしれないですね。
スピーカー 2
ね。まあ、データベース要素を抜かないと、ずっと無限にしゃべっちゃう人が一人いるので。
そうなんですか。
ブッククラブということで。
スピーカー 1
はい。
スピーカー 2
いや、でもブッククラブめっちゃいいね。浅井さんもこうやってここでやっとくとさ、例えば今後会社で、
はい。
なんか同じフォーマットでやってみたりとかさ、できるかもしれないしね。
そうですね。
スピーカー 1
いろいろ試せるので楽しそうですね。
スピーカー 2
うんうん。
スピーカー 1
読みたい本もいっぱいあるんで。
スピーカー 2
うんうん。
どんどんいろんなところやってみたいですね。
なんとなくこうブッククラブに向く本と向かない本ってある気はする。
スピーカー 1
ああ、なるほど。
スピーカー 2
どうですか?
なんか読んでみたい本、例えば何かありますか?
スピーカー 1
まあ、読んでみたい本というよりは、
うんうん。
けっこうセキュリティの勉強とかしたいなみたいな思うこともあるので。
うん。
そういうテーマごとにいろいろ本を読んで
いい本があればそれをやるみたいなイメージでしたね
スピーカー 2
確かにセキュリティは興味ある
スピーカー 1
何かありますかイメージ
スピーカー 2
何かそういうのやったみたいな
僕が挙げるとついね
例えば紹介データベースデータベースインターナルとか
ちょっとそこら辺の領域になっちゃうので
逆に今参加してくれてる
ブッククラブの他のメンバーから
全然違う領域のアイデアを聞いてみたい
じゃあそろそろ内容やってきますかね
トランザクション
ということで
今回のキーワードとしては
まずあれだよね
06:00
スピーカー 2
トランザクションとは何かみたいなのに始まり
大まかにはアノマリーですね
リードスキューとかライトスキューとか
あとリピータブルミード
あとはファントムリードみたいな感じで
トランザクションを使っているときに起こるというか
気にしなきゃいけない失敗パターンというか
アノマリーというのが出てきて
それらを対応するためには
どういったアイソレーションレベルを使うといいですよということで
リードコミッティット リードアンコミッティットとか
あとはスナップアイソレーションとか
シリアライザブルみたいなのが出てきたりしましたね
この2つの概念を理解するっていうのが
多分1つ分かりやすいゴールの1つになるんじゃないかなと思いましたね
それらのあとは実装パターンとしては
コンカレーシーコントロールの方法として
マルチバージョン コンカレーシングコントロール MVCCっていうのがあり
最近でいうとオプティミスティックCC
あとはよくあるペシミスティックCCで
ロックベース ロックベースじゃないのがありますよねみたいな感じで
アノマリーを理解し
アイソレーションレベルを理解する
興味がある人は実装方法として
発展としてコンカレーシングコントロールについても
ちょっと話を広げるみたいな感じになるのが
よくある読み方なのかなと思ったんですけど
小字体に対してざっくり感想としては
アサイさんの方からはどうですか
スピーカー 1
そうですね
まず最初にアシット特性の説明もちょっとあって
トランザクションっていうのは
アシット特性を満たすもの
アトミシティ コンシステンシー アイソレーション リアビリティですね
っていうのが話があったんですけど
ここで特に自分が
自分がっていうかこの本で重要になったのは
そのAとIですかね
アトミシティとアイソレーション
Cはアプリケーション側で対応すべきもので
Dが僕はあんまり
トランザクションとそんなに関わるものでないのかなと
思ったんですけれども
この
はい なかなかこの
言葉の何ですかね
アシットっていうのはちょっと分かりにくいなって思ったのと
一方でこのAとIが
主な特性なのかなっていうのをちょっと理解して
自分はちょっとすっきりしたような気持ちになりました
スピーカー 2
確かに
アシットをちゃんと説明したのが
DDIこのショーが初めてか
確かにそうですね
ですかね はい そうかもしれない
なんかね
アシットのコメントも誰かしてたよね
スピーカー 1
知ってますか
Dさんか
スピーカー 2
アシットのうちコンシスタンシーの説明で
アプリケーションエンジニアだからね
彼は
そのコンシスタンシーのところというか
09:00
スピーカー 2
一貫性を保つようにトランザクション適切に
定義することはアプリケーションの責任になります
という言葉を胸に刻みましたとおっしゃってましたね
いやでも僕自分がアプリケーションエンジニアだった時
胸にあんまり刻んでなかった気がするからね
スピーカー 1
すごいですね
コンシスタンシーもどうすればOKなのかっていうのが
やっぱり難しいところだと思うんで
そのディスカッションの中でも
平行処理で一貫性を保つっていうのが
難しいみたいな話もあったと思うんですけど
そうですね
ここでまた一つの深いトピックになるのかなと思いました
スピーカー 2
コンシスタンシー
SREという観点とかだと
やっぱりアプリケーションソースコードとか
ビジネス要件が分かんないと口出せないところなので
この前もそういう障害あったんですよね
Read Your Lightみたいな話が出てきた時に
大きめのデータベースがあって
それもうちょっとパフォーマンス上げられないの
みたいな話がなった時に
こういうコンシスタンシーを
担保しなきゃいけないからね
みたいに言われたんですよね
言ってることは分かるんだけど
それが具体的に
アプリケーションのソースコードという観点
データモデルという観点では
どのテーブルの話をしているの
それがどういうビジネス要件と関わってくるの
っていうのはやっぱり
SREがやってる領域から
ビジネス要件とかアプリケーションとか
ドメインロジックの方に
降りていかなくちゃいけないので
そこはこう
個人的には楽しいけど
領域審判になりがちなポイントでもあったので
難しいなというか
そこでそのコンシスタンシーを担保してるのは
アプリケーション開発者なので
実際にそこはどうやって関わっていくんですか
いやもうまだ障害があって
そういう問題があるよねって
明らかになっただけなので
まだ対応策も解決策も何もやってないんですし
いやまだ障害があってそういう問題があるよねって明らかになっただけなのでまだ対応策も解決策も何もやってないんですし
やるとしたら結構大きい話になるのでね
スピーカー 1
トランザクション周りのロジックを変えるとかっていうのは
確かにすごい大きい話になるのかなって読んでちょっと思って
例えばトランザクションレベルを変更しますというだけでも
クエリの仕方とかを変えなきゃいけなかったりすると思うんで
それがいろんなところに影響してると大変そうだなっていうのは思いました
スピーカー 2
そうなんですよね
アプリケーションで必要なクリティカルパスみたいなのを
全部明らかにしなきゃいけないんですよね
どこのクエリとか
どこのデータフローは
どのコンシスタンシーを
12:00
スピーカー 2
担保しなきゃいけなくて
みたいなのを
ミイシーに明らかにしなきゃいけない
と思うんですよ
一個でも漏れてると
特にコンシスタンシーを担保しなきゃいけないのに
それが担保しなくていいよねみたいな
リストに加わってて
破壊的な変更を加え
ちゃうとそれは後から大変なことになる
データ非整合の問題になって
結構後から直すの大変になるのでね
直せないこととかもあるからね
例えば
イベントソーシングとか
みたいな感じで
起こったイベントすべて
ライトアヘッドログ的な感じに
溜めといて
最初から読めば
現在の状態を
再現できるみたいな風に
ちゃんとデータ取ってればいいんだけど
そういう工夫とかも
しないと
破壊的な変更を加えると
データ壊れちゃってもうおしまいです
さよならみたいな
スピーカー 1
さすがに今の会社はそんなのはないけど
本の中でもマルチオブジェクトとか
シングルオブジェクトの話がちょっとあって
シングルオブジェクト
一つのテーブルに対しての
トランザクションであればシンプルだけど
大体複数にまたがって
例えば残高テーブルと
在庫テーブルとみたいな話があったので
確かにそれの全部を巻き戻すことができるようになったので
大変そうですよね
スピーカー 2
そうですね
あとアシットのDは
デュラビリティのDだよね
スピーカー 1
そうですね
スピーカー 2
多分Dは
リカバリーと結構関係してくると思いますね
例えば
トランザクションのリデューとかアンドゥをしたい
みたいなとき
結局
アプリケーション観点じゃなくて
例えばデータベースがダウンする
シチュエーションって
いろいろあると思うんですよね
例えばハードウェア障害とか
ネットワークの寸断とか
あとはリージョン障害とか
データセンターの障害みたいな
ありますと
データベースがデータ
たくさんのクエリを処理してました
どこでポツンとネットワークでも
ハードウェア障害でもいいと思うんですけど
特定のデータベースが
インスタンスがダウンしました
で復帰しました
復帰したときのデータベースの状態
どこに戻しますかって話ですよね
ここでトランザクションというか
どこまでリデューするか
どのクエリをアンドゥするか
っていうのが結構大事になってくると思うんですよ
だから
DDIAには
そのドゥラビリティの観点とか
リカベリーの話は確かに
この章はそんな書いてなかったんだけど
ドゥラビリティの話をちょっとすると
まず
ここら辺のトランザクション周りの
実装とかって
軽く
よく読んだりしたりしたことあります?
ここら辺でよく出てくるのって
4つぐらいサブコンポーネントみたいなのがあって
スピーカー 1
一つがトランザクションマネジャー
スピーカー 2
これはトランザクションをすべてを
15:00
スピーカー 2
いい感じに管理してくれる
クラスみたいなイメージしてくれればいいんですけど
あとはロックマネジャーですね
ロックマネジャーっていうのは
実際のロック自体を担当する
サブコンポーネントみたいな感じ
3つ目がバッファープール
もしくはページキャッシュって呼ばれるもので
聞いたことありますかね
これは先に4つ目説明するか
4つ目がログマネジャーって言うんですけど
ライトアヘッドログってあるじゃないですか
ワル
ワルはどういう風に使われるかっていうと
データベースに起こった
例えばクリエイトとかインサートアップデートみたいな
イベントログをどんどんどんどん貯めていくんですよ
イミュータブルな感じで
ライトアヘッドな感じでアペンドしていくんですね
例えばデリートっていう操作が入るじゃないですか
デリートって操作が入った時に
ワル的には何も削除しないんですよ
デリートしましたっていうイベントがワルに入るんですよ
わかります?
アップデートした時も
ワルの
ワルっていうのも本当にこう
どんどんどんどんこう
長くなってく
短方向のリストみたいな感じなんですけど
ワルの最初の方のログを見て
そのデータを更新するみたいなのじゃなくて
アップデートしましたっていうのが
後からポンって入るだけなんですよね
だから現在の
じゃあデータって何?って
みたいになった時には
ワルの最初のデータからぐわーっと舐めていって
例えば更新があったら
更新をイベント反映させて
デリートがあったらデリート反映させて
最後までワルの一番後ろの
ログまで
イベントまで見た時に初めて
現在の状態っていうのが
わかるんですよね
このワルを
ディスクに書き込んでおくことによって
途中で
データベースのインスタンスが
落ちてもそのワルから
ある程度再現できるんですよ
なるほど
でも
ワルをディスクに書き込むって
要するに
めちゃくちゃ
遅いし
現在のデータの状態は
ワルから毎回クエリがあるたびに
反映させられないので
ページキャッシュって言って
メモリに
置いとくんですよね
ある程度このページという単位で
そこのページから
実際のデータ
本体は
別のディスク領域に
フラッシュ的にさせながら
やっていくんですよね
というのが
あった前提で
アシットのDのデュラビリティの話をしてるんですけど
このワルがどんどん長くなっていっちゃうので
よくある形
例えば僕もNeo4jに入ってたときに
18:01
スピーカー 2
ワルがどんどん
伸びていっちゃうじゃないですか
永遠にデータベースのインスタンスが
走ってれば走ってるほど
途中でコンパクション的なことを
しなきゃいけないんですよね
それをチェックポイントみたいなことで
ここからここまでは
ここのチェックポイントまでは
ある程度
いい感じに圧縮するというか
圧縮という用語は
ちょっと適切じゃないかもしれないけど
ここら辺までは
スナップショットみたいな感じで
ここのチェックポイントまでは
ここから後ろはもう見なくていいよみたいな感じで
差分更新みたいな感じにして
というのがあると
ワルが長ければ長いほど
データベースが再起動したときに
再起動の時間がかかっちゃうと
ネットワークの寸断とかで
ダウンしました
再起動しました
そのときになめなきゃいけない
ワルのログの数が多いと
それだけ時間かかっちゃうから
再起動の時間が
1分2分とかなってくると
リライアビリティにも関係してくるじゃないですか
確かに
スピーカー 1
処理を全部やらせるんですよね
ワルのログ分の
それは時間かかりますね
スピーカー 2
新しいインスタンスを立ち上げるのに
もう5分10分もかかってきますってなると
リージョン障害が起こったときの
移行とか
あとラフトとかで
コンセンサス組んでるときに
リーダーの障害
リーダーの昇格をするときとかに
他のインスタンス立ち上がるのに
5分も10分待ってられないので
っていうことで
結構アシッドの4特性っていうのは
データベースの実装レベルで見ると
結構関わってくるというか
スピーカー 1
なるほど
ちょっとDのところが
全然理解できてなかったので
今の説明ですごい
しっくりきました
スピーカー 2
DDIAではこの章ではあんまりD触れてないですけど
スピーカー 1
ちなみにそのチェックポイントのところで
スナップショットみたいなのを
チェックポイントで撮って
そこからの差分をワルでやるみたいな感じなんですか
スピーカー 2
4Gのときは
差分チェックポインティングみたいなのを
当時は実装していて
最新の実装がどうかは追ってないんですけど
スピーカー 1
でも確かmysqlとかでも
チェックポイントみたいなの聞いたことがあるんで
同じようなアーティストなのかな
スピーカー 2
そうですね
基本的にワルにログのイベントが
どんどんどんどん溜まっていって
長いリストがあったときに
そのポインターみたいな感じで
ここまでは処理しましたよ
ラストタイムスタンプ
ここから処理しますよ
begin timestamp
begin timestamp
begin timestamp
あと何だったっけな
ここまで今処理中ですよ
end timestampみたいな感じが
なんか3つぐらい
どこまで処理したよみたいな
ポインターを一個一個前に移動させながら
ここまではもうOKです
21:02
スピーカー 2
ここはチェックポイントですみたいな感じで
バサッと切るみたいな
でそこのチェックポイントから
前のデータもいらないので
そのデータをコミットしちゃえば
あとはワルの消しちゃうみたいな
ディスクからとかやってたら
まあ多分データベースによって
結構実装は違うと思いますけど
はい
スピーカー 1
このassitのdの部分だけでも
なんかすごいいろんな仕組みがあって
スピーカー 2
データベースって本当すごいですねっていう
スピーカー 1
当たり前の感想なんですけど
データベースすごいっていうのを
スピーカー 2
毎章読みながらね
スピーカー 1
思いますね
スピーカー 2
他に何か気になったキーワードとかありますか
スピーカー 1
そうですね僕は
アイソレーションの段階がいくつかある中で出てきた
スナップショットアイソレーションの
MVCCっていうのが気になりまして
これ結構いい仕組みだなというか
スナップショットアイソレーションを解決するのは
確かLightSkewとか
Phantomとかだったかな
そっちだったかな
あと
今すぐに申し訳ないですけど
いつかリードコミットでは解決できない問題を解決していて
そのトランザクションごとのバージョンを保持する
MVCCっていうのを使って
各トランザクション
新しいトランザクションが
違うトランザクションIDのものを読み込まないように
処理するみたいな仕組みがあると思うんですけども
そのMVCCを使った場合に
トランザクションが一気に
10個くらい入ってきて
その10個のトランザクションのバージョンを
例えば全部保持した場合に
ストレージの負荷とか
どのくらいかかるのかなみたいな
ちょっと気になっていて
すごい良い仕組みだなと思いつつも
逆にデータベースにどのくらい負荷があるんだろうっていうのが
気になって
スピーカー 2
この辺ケンさんもコメントくださったんですけども
結構調べてくれましたよね
軽くMVCCについて最初に説明すると
お願いします
まずアイソレーションレベルっていうのがありますよね
リードアンコミッティットとか
スピーカー 1
リードコミッティットとか
スピーカー 2
すいません
ちょっとブッククラブで喋りすぎて
喉がちょっとやられて
そうそうで
あとはリピータブルリードっていうのがあって
それの実装としてよく使われるMVCC
これはマルチバージョンコンカレッシー
コントロールレベルで
それの実装としてよく使われるMVCCこれはマルチバージョンコンカレッシーコントロールレベルで
それの実装としてよく使われるMVCCこれはマルチバージョンコンカレッシーコントロールの略ですよね
このコンカレッシーコントロールっていうのは
24:00
スピーカー 2
データベースのパフォーマンスを上げるために
クエリを複数実行したいんですよね
基本的には
とあるタイミングで実行できるクエリが
一つしかないっていうのは
シティアライザビリティの観点からすっごい楽ですけど
めちゃくちゃ遅いので
実現ほぼ不可能
実用段階で
理解ということを考えると
そんなデータベース誰も使ってくれないから
ある程度コンカレントに実装する必要はあるんだけど
コンカレントに実装すると
じゃあこの
整合性どう担保するのよっていう話が出てくるので
そのコンカレントに
実行されるクエリ同士の
制御する仕組みっていうのが必要なんですよね
平行に処理されるクエリの
それには
MVCCっていう
古典的な有名的なのとか
それに対して
あとはペシミスティック
コンカレーシングコントロール
これはいわゆるロックを取る形と
ロックを取らない形あるんですけど
ロックを取ると例えばデッドロックになったりする
やつですね
ペシミスティック
悲観的っていうことなので
要するにこれは
なんだろうね
競合するかどうかわからないと
わかんないからとりあえず
ロックを取っておきましょうみたいな
ロックベースとペシミスティックコンカレーシングコントロールの
アイデアなんですけど
要するに
生前説と小悪説で言うと
小悪説
みたいな感じで
先に悲観的に
ロックを取っていく
3つ目に出てくるのが
オプティミスティックコンカレーシングコントロールで
これは楽観的な話で
問題が出たら考えようよ
みたいな
イージーなやつですね
基本的には
悲観ロックみたいな感じでロックを取らずに
問題が出たときに考える
っていう風に3つ大まかな
コンカレーシングコントロールの実装があるんですけど
そのうちの1つが
MVCC
これがスナップショットアイソレーションの
実現にあたって使われていると
マルチバージョン
って書いてある通り
複数の
バージョンを持つんですよね
とあるリードの
ワークロードが入ってきたときに
ライトと競合してのように
どのバージョンを
オールドバージョンを見れば
他の
ライトと競合しないようにってことで
複数なんだろ
マルチバージョンを持たせることによって
整合性を壊さずに
かつある程度のパターンでは
パフォーマンスを殺さずにできる
みたいな感じで
これが割と結構
デフォルトで使われてるデータベースとかも
ストレージエンジンも多かったりするので
多分このSHOWでも
スピーカー 1
大々的に取り扱ってるんだと思いますね
スピーカー 2
メリデメも結構あるんですけどね
アサイさんがね
調べてくれた通り
スピーカー 1
さっきちょっと間違ったこと言ったんですけど
27:02
スピーカー 1
このSnapShot Isolationとかを使った場合は
リードロックを取らなくていいっていうのが
メリットなんですかね
読み込みの時にロックをしなくていいから
他の読み込みを邪魔したりしない
みたいなメリットがあって
一方でライトのロックは取るので
えっと
その分
ちょっとより
混乱したんですけど
問題としては
ライトスキルとかファントムみたいなの出てくるみたいな
ちょっとありますね
スピーカー 2
これちょっとクランブでもコメントしたんですけど
MVCCと
オプティミスティックコンカレーションコントロール
OCCの
違いっていうのを
すっごい
一言で
雑に言うと
MVCCはリードのワークロードに対して強くて
OCCはライトのワークロードに対して強いんですよね
OCCはなんでライトに強いかっていうと
結局その
危険な時にだけ
バリテーションすればいいので
基本的には普段は問題なく
どんどんどんどん書き込みしてるんですよね
なのでMVCCは
そのライトでかつ
コンフリクトが起こりやすいみたいな時に
光る
コンカレーションの実装ではないんですよね
多分コメントもあったけど
バージョンをたくさん保持しなきゃいけないので
ある程度
ストレージにどれくらい負荷がかかるのか
みたいなのを事前にアサイさんがね
コメントしてくれて
これは僕も知らなかったので
ちょっと調べたら教えてください
みたいな感じで
コメントしてたんですが
スピーカー 1
なんかこれは
そうですね
まず
ロックを取る
のが
バージョンを複数
複製するのが
業ベースとかだったりするので
その場合はそんなに負荷がかかんないんじゃないかな
っていうのをまず
推測でちょっと思ったのと
あと調べていく中で
MySQLの
処理の仕方が書いてあって
例えば
巨大なカラム
ラージオブジェクトですね
ロブみたいなやつが
カラムがある時に
そのカラムのバージョンを全部保持してると
たぶんすごい量になるので
例えばそのロブの変更が部分的な場合は
その部分だけのバージョンを複製して
他の変わってない部分は保持して
そのまま複製せずに
同じとこ参照するみたいな
やり方があって
そういう風にちょっと
ストレージの負荷かからないような
工夫がされているのかな
みたいなのを調べて分かりましたね
あとはそうですね
この
どんどん溜まってる
溜まっていったバージョンみたいのは
30:01
スピーカー 1
バキュームをうまくしていくことで
ストレージを解放することができるみたいな
できると思うんですけど
そのバキューム処理も
たぶんCPUとかに負荷がかかったりするんで
またデメリットの一つになるのかな
スピーカー 2
っていうのはありそうですね
そうなんですよね
PosgreのMVCCとかは
バキュームが必要
要するにガベッジコレクションですよね
運用の観点からすると
なかなか嬉しい話で
言うことはないですよね
たぶんデータベースによると思いますけど
ストップターワールド的な
プロセスをフリーズさせなきゃいけない
バキュームとかになると
普通にデータベースのパフォーマンスにも
影響してきたりするし
スピーカー 1
レプリケーションとかにも
バキューム中にレプリケーションが
うまくできないみたいな問題が
自分の昔あった気がしてて
そういう設定によりますけど
そういう影響は色々出そうですね
スピーカー 2
古典的な感じで
普通にクローンジョブで
毎日特定の時間にバキュームさせてとかね
昔もそんなの見た気もするけど
レプリケーションとかパーティションを考えると
組み合わせて考えると
なかなか難しいところですよね
ボトルネックになっちゃうからね
スピーカー 1
ケンさん他に何か気になったトピックありますか
スピーカー 2
気になったトピック
気になったトピックはですね
トピックじゃないけども
今日のアナロジーやりましょうよ
スピーカー 1
今日のアナロジーやりましょう
スピーカー 2
一応今回から聞いてくださってる方のために
2回くらい前かな
インデックスって何みたいなのを
アサイさんが奥様に聞かれて
それをアナロジーで説明したら
すごい良かったっていう話があって
アナロジーって結構難しい概念を説明するのに
いいよねってことで
それから今回
それ以降
そのショーで一つアナロジーをお互い考えてくるっていう
謎の宿題を自分に化して
やってみたら面白いんじゃないかなということで
やったんですけど
僕はね一つ
結構今回のショーで大事なのって
シリアライザビリティが何回も出てくると思うんですよね
シリアライザビリティっていうのは
なんで大事かっていうところで
データベースにとってはね
シリアライザビリティを維持しつつ
ここにトランザクションを実行することで
パフォーマンスを上げることができますっていうのがあって
じゃあこれを自分もね
パートナーとかに聞かれたら
なんて説明しようかなと思ってたんですけど
これは僕が考えた例としては
電車の例で考えると分かりやすいのかなと思ってて
例えば線路が一つしかない路線を考えてほしいんですよね
なんかこう東北の田舎に行った時の
なんかすごい田舎の
33:01
スピーカー 2
なんか一路線しかないような
なんだろうね
ローカル
三陸層
全然東北の人を批判してるわけじゃん
僕が東北出身だから東北を選んだだけなんです
ごめんなさいって感じなんですけど
僕の出身です
そういったね
線路が一つしかない路線って
どんな時刻表
スケジュールを使ってもシリアルなんですよね
だからどの順番で電車が来るっていうのは分かるんですよ
なんだけど
しかし向こうから電車が来た時っていうのは
どちらかの電車は基本的には待たなくちゃいけないので
非常にパフォーマンスは悪い
ここでいうパフォーマンスはデータベースのパフォーマンス
例えば電車で言うなら
時間あたりに運べる人数とでも言いましょうか
これが線路が複数あると
シリアルじゃなくて
普通にコンカレントに実行できるとなると
複数の車両が並行して進むことができるので
全体のパフォーマンスは高いですよね
例えば東京駅を考えてもらうと
メトロの丸の内線から中央線総務線から
いろんな交線が入ってくるので
新幹線も入るので
ただ時刻表がシリアルではないので
どの順番で乗り越えたら
最終目的にどのように行けるかっていうのが
事前に分からないと
なので乗り換えアプリを使いながら
リアルタイムで
今この中央線のこの車両に
乗ると早く新宿に着けそうだよ
みたいのをやっていかないと
なかなか最終目的地に
最短で身につくことができない
っていうのはあるかなと
スピーカー 1
考えてきたんですけど
スピーカー 2
どうでしょう
スピーカー 1
めちゃくちゃわかりやすいですね
これいつも説明したら
理解してもらえますね
データベースってこうやって
スピーカー 2
制御してるんだって
もうこれ聞いて全然
お前のってこと分かんねえよみたいな
リスナーの意見とかも
いたらぜひ意見欲しいですね
スピーカー 1
例えるのは本当に難しいですよね
なんていうか
現実世界で
電車の例は想像しやすい例で
ありがたいですね
スピーカー 2
なんかこのデータベースを実践するときに
一連のデータベース更新である
トランザクションのリスナーのことを
スケジュールって読むんですよ
スケジュールなんかあるかな
電車のスケジュールみたいな感じで
スピーカー 1
あーはい
時刻表
スピーカー 2
ただこれをね
昨日の夜ね
MVCCを説明するときにも
使えるかなと思って
この電車の例を発展させて
MVCC使えないかなと思って
考えてたんだけど全然思いつかなくて
スピーカー 1
いやー難しいっすね
スピーカー 2
電車のアナロジーに
おけるマルチバージョンとは
みたいな感じになっちゃって
スピーカー 1
それはどうやって説明せないんだろうか
スピーカー 2
36:00
スピーカー 1
電車に乗って
スピーカー 2
サラリーマンが東京駅で降りて
丸の内で降りて
なんか会社に入ってみたいな
なんか
なんか説明が袋小路になってる
全然出れなくて
スピーカー 1
それで眠れなくなるっていう
スピーカー 2
そうそうそう
スピーカー 1
ややこしいからやっぱ確かに
なんか別のアナロジー考えてたら
スピーカー 2
アナロジーのデメリットですね
スピーカー 1
うん
スピーカー 2
そう
スピーカー 1
一つで説明するのが
いいっすね
スピーカー 2
間違ったアナロジー使っちゃうと
逆に
ねなんだろう
誤った
価値観じゃなくて
誤った理解を与えてしまうのでね
スピーカー 1
確かに
そうですね
スピーカー 2
これ誰か言ってたけど
例えばそのプログラミングを
中学生とか小学生も教えるときに
あの
インスタンスバリアブル
変数ってあるじゃないですか
はい
どの言語でも
スピーカー 1
うん
スピーカー 2
なんか
例えばJavaScriptだったら
const
who
イコール
3ってすると
whoという変数に3が入りますよみたいな
これをあの
アナロジーで
ボックス
って教えると
スピーカー 1
はい
スピーカー 2
これ結構危険だよねって誰かが言ってて
すごい僕なるほどって思ったんですけど
あの箱で教え
結局その教えちゃうと
まあこれはねJavaScriptとかRubyとかPythonみたいな
高級言語使ってるからなんですけど
メモリの概念が入ってこないんですよね
メモリとかポインターの概念が
はい
スピーカー 1
確かに
スピーカー 2
うん
でここでもう箱っていう感じで
メンタルモデルをフィックスさせちゃうと
あとで
例えばC
Cプラプラとかラストとかを始めた時に
ポインターという概念が出てきて
結構こう
箱の概念をこう乗り越えるのが難しいんですよね
スピーカー 1
いやそれめっちゃ分かりますでも
スピーカー 2
うん
スピーカー 1
これはまさにその被害者ですね
スピーカー 2
うん分かる
僕もその被害者
うん
そうか
だからそのね
分かんない人に教えないと
そういう人がアナロジーを使うって結構諸刃の剣で
結構責任が問われるんですよ
スピーカー 1
要領を守りくださいって感じですね
スピーカー 2
そうそうそうそう
うん
スピーカー 1
そうか
無理してやんない方がいいですねこれはきっと
うん
スピーカー 2
まあね
まあでも無理してやんないとできないので
失敗覚悟で僕はちょっとやっていこうかな
仲間の子かなあ
はい
あと何か触れたいところありますか
まあ何かじゃあ
スピーカー 1
ディスカッショントピックで
1個あったのが
やっぱり自分はその平行処理とかをやってるときのテスト方法が気になりまして
まあそれをトピックとして1個出したんですけれども
平行処理で発生するデータベース上の問題をどうテストするかっていう
まあところをちょっと聞いたときに
前回出ていたともしさんが結構その経験があることですごい勉強だったんですけども
39:05
スピーカー 1
まあそのどうするかっていうのはまあ数を打つっていうところが結論としては出てきて
まあ明らかに傾向になるように処理を流して
まあそれで起きる問題を無理やり起こさせて
まあそれに対処していくみたいなことがやるべきことだというふうに
教えていたのでまあそれはすごい勉強になりましたね
まあ例えば1つのテーブルの行に一気に100回連続で更新かけてどうなるか見るみたいな
まあそういうことだと思うんですけども
まあそういうふうにテストできるっていう話だったんでそれは面白かったですね
スピーカー 2
うん
いやここら辺は僕さっぱり分かんなかったので
はい
なんかいろいろ知見とかもありそうですよね
スピーカー 1
そうですね
スピーカー 2
他の会社どうやってるんだろう
スピーカー 1
うん
なんかそういうライブラリとかももしかしたらあるのかもしれないですね
平行処理のテストをするためのちょっと分からないですけど
スピーカー 2
うんうん
まあ多分世の中にこうテストがあるんですよね
テストにめちゃくちゃ思いがあるエンジニアの方って結構いるから
僕がデータベースならテストにすごい情熱かけて
まあそういう人がもしリスナーの方にいたらぜひ教えてください
確かに
うん
ディスカッション今回からねあの
ブッククラブ今までのフォーマットあと最初に浅いサマリーが入って
各人がテイクアウェイを話してディスカッショントピックだったんだけど
うん
サマリーをやめたんですよね今回から
スピーカー 1
そうですね
スピーカー 2
うん
スピーカー 1
もういらないですよね皆さんのノートが濃すぎて
スピーカー 2
みんなちゃんと読んでるもんねあれ
スピーカー 1
そうですね
スピーカー 2
はい
僕が前のブッククラブでサマリーやってたから最初に浅井さんにサマリーやってたよって言ったのは
あの時読んでない人結構いたんですよだからサマリーね足並み揃えてみたいな
はい
スピーカー 1
このブッククラブ濃すぎてみんなの情熱がすごいからなんか
スピーカー 2
はい
こういう風にしてる間に多分上の空って感じになっちゃうから
スピーカー 1
うん
スピーカー 2
そうですね知ってるよね
読んでる前提で
スピーカー 1
うん
スピーカー 2
はい
でもなんかそうですよねバーを下げずにできるっていうのすごいいいなんだろう
いいメンバーですよね
スピーカー 1
そうですね
スピーカー 2
うん
スピーカー 1
ちょっと自分のために下げてもらっていいかもなちょっと思う時あるんですけど
まあでもはいめちゃくちゃ密度濃いなと思いますはい
スピーカー 2
本当それは感じなかったですけど
スピーカー 1
本当ですかじゃあよかったです
スピーカー 2
うんまあねバーを上げていけるって人はどこでも重宝されるので楽しいですね
スピーカー 1
はい
スピーカー 2
こんな感じかな今回は
スピーカー 1
そうですね
スピーカー 2
まあ結構何人かも触れてたけどじゃあこれが分散環境でディスビューティッド環境でどうなるのかっていうのは結構気になってる人がいて
42:06
スピーカー 2
これは多分今後の章にも出てくるのかな旧章って言ってたかな誰だっけな
旧章ですね
旧章でディスビューティッドトランザクションコンセンサスがちょっと入ってたりするので今回は単体データベースインスタンスの話でしたけどこれは分散環境でどうなるかっていうのは今後また出てくるんでこれも楽しみですね
楽しみです
2フェーズコミット3フェーズコミットとかスパナーとかいろいろ出てくるんで
スピーカー 1
はい
うん徐々に勉強していきたいですね
スピーカー 2
ですねうんまあこのペースはいいかもねじゃあ今日はこれぐらいにしましょうか
はい
はいということでDDI本第7章トランザクション章の振り返り会でした次回は第8章トラブルウィズディスビューティッドシステムということで次回も楽しみにしててくださいじゃあお疲れ様
スピーカー 1
ありがとうございました
43:13

コメント

スクロール