2016年11月9日水曜日

RDBアンチパターン - ロックの功罪

この記事はPHPカンファレンス東京での登壇資料の補足記事です。
当日の話はこちら。

PHPカンファレンス2016でRDBアンチパターンの話してきた #phpcon2016




第三章の強すぎる依存は要約すると


  • ロックは並列処理の際にデータを守るための機能
  • トランザクション分離レベルでの動作の違いは必ず学ぼう
  • ロックを取らない場合に悲劇が生まれるシーンの紹介
  • ロックはパフォーマンス遅延の理由になりやすい
  • ロックはRDBが暗黙的に取る事が多々ある
  • ロックの挙動はRDBによって結構違う


を話をしました。
ロックについては1番話をしたかったところです。
特に重要な項目について少し補足します。

■ロックの功績

実務においてPHPerに限らず多くの人は並列処理が苦手だなと感じています。
マルチスレッドで無くてもスライドで紹介したとおり、並列処理になる部分は多々あります。
それによって大きなバグを埋め込む事があるわけで実際にゲーム内での無限増殖や予約機能でのダブルブッキングなどが話題になります。
特にロック未取得によるバグはクリティカルになることが多いです。
逆にトランザクションが不要であればRDBの必要性が半減すると言っても過言では無いでしょう。
本当にRDBに置いて重要な機能の一つでACIDの根底にある部分なので適切に使ってもらいたいです。

ロックについても業務系ではロック未取得のバグ=即死案件だったりするので業務系では一般的な話だと思います。
しかし結構有名なEC系のフレームワークでも適切にロックを取ってなかったりするのでロックについてはまだまだ知られてないのかも?と感じています。
また動画でも述べましたがこれからは「並列・分散処理時代」だと予想しているのでみんなには是非これを機会に無知を既知にしていただきたいですね。


■ロックの罪

一言で言えばデッドロックとロック待ちによるパフォーマンス遅延です。
しかしこれが複数アクセスの時に発生するもので意外と開発中は目に見えなかったりします。
またシナリオテストでも単体では問題なく負荷を捌けるのに本番ではロック待ちが発生する場合があります。
これは複数のシナリオが影響している場合などで事前に予想が難しかったりします。
そんな背景から私が実際にチューニングをする際でも最適解を出すのが難しいケースの一つがロック待ちです。
スライドにもありますがロックはRDBやトランザクション分離レベルによって暗黙的取るケースが違います。
そのためそれぞれのミドルウェア固有の知識が必要でバージョン違いもあったりするのでしっかりと実際の挙動を知ることが大切です。
デバック方法もそれぞれ違ったり、対処法もそれぞれ違うので難しいところではあります。
特にDB設計に依存しやすく「原因は分かったが対処が難しい」ケースが多々あります。

これらのことから一度ロック待ちでハマると闇が深いので事前に防げるような知識が大切です。
ただ複数のRDBに詳しくなるのは大変です。
なので使っているRDBのロック待ちの調べ方とトランザクション分離レベルによる挙動に違いについては知っておくと良いと思います。
この辺、Webには大小違いはあれど情報は多いのですが書籍には意外となってないなぁと思います。
オススメの書籍があれば是非教えてください。
私も勉強したいと思っています!!

それと最後にご指摘を受けたので合わせて掲載します。
こちらもご確認ください。















みんな@yoku0825さんをフォローしよう!!
ということで補足としては以上です。
他の章の説明はこちらから行けます

PHPカンファレンス2016でRDBアンチパターンの話してきた #phpcon2016


登壇動画



RDBアンチパターン - 隠された状態 -

この記事はPHPカンファレンス東京での登壇資料の補足記事です。
当日の話はこちら。

PHPカンファレンス2016でRDBアンチパターンの話してきた #phpcon2016




第二章の強すぎる依存は要約すると


  • RDBを利用する際はリレーショナルモデルが大切
  • 事実を保存をすることが大切
  • レコードに状態を保存すると危険
  • しかし事実を保存する事に拘り過ぎて状態が隠れるともっと危険
  • 状態を保存したい→事実の歴史を保存する


を話をしました。
特に重要な項目について少し補足します。

■事実と状態

リレーショナルモデルの話は@nippondanjiさんの資料が沢山あってとても為になるので読みましょう。


そして理論的な話は奥野さんの本が超オススメです。
一章を乗り越えれれば(そこが1番難しい話なので…)あとはスーッと読めると思います。
超良書なのでぜひ読んで欲しいです。



ここについては珍しい手法とか新しいアーキテクチャの提案じゃなくて「業務系」と呼ばれる界隈では一般的な話です。
金融系だとINSERTとSELECTだけで表現するのは一般的だし業務系出身の私はそれが当たり前だと思ってました。
しかしWebサービスのDB設計を見ると意外とそうではありませんでした。
理由はパフォーマンス上の制限だったりアプリケーション上の制限だったりするのですが1番は「その手法を知らない」というのが1番多かったです。
そのため、今回は敢えてこの話をアンチパターンとして紹介しました。
多分、JJUG CCCやPostgreSQLカンファレンスだと響かない内容だったと思いますがPHPカンファレンスにはマッチしたと思います。
この辺は受託開発してる人は特に気にして欲しいです。
何故なら作ったシステムを作った人たちがずっとメンテナンスする可能性の高いスタートアップと違って、作ったら終わりの場合が多いからです。
なので3年後、5年後に「ある日突然DBの問題が発生する」時にとても苦労するし、例外対応時に全く対応出来なくて苦労するからです。
だからこそ受託開発を行うWebエンジニアの方々にはDB設計を学んでほしいですね。

またDB設計についてはもう何十年も議論されて経験が積み重なって書籍になっています。
オススメの本は沢山あるのですがまずはSQLアンチパターンを呼んでいないならぜひ読みましょう。



ということで「隠された状態」について説明しました。
実はこの問題は完璧に対応するにはとても難しい話です。
パフォーマンスとトレードオフ、仕様変更への対応などで長い目で見た問題が発生しやすいところです。
だからこそ、出来る人はとても貴重で価値が高いといえるので是非是非興味を持って勉強してみてください。
また詳しい人は設計の話、どんどんアウトプットしてほしいですね。
私も沢山の経験に基づいたDB設計の話が聴きたいです!!

ということで補足としては以上です。
他の章の説明はこちらから行けます

PHPカンファレンス2016でRDBアンチパターンの話してきた #phpcon2016


登壇動画



RDBアンチパターン - 強すぎる依存 -

この記事はPHPカンファレンス東京での登壇資料の補足記事です。
当日の話はこちら。

PHPカンファレンス2016でRDBアンチパターンの話してきた #phpcon2016




第一章の強すぎる依存は要約すると


  • ORMやDBマイグレーションには強い制約と誓約がある
  • ORMやDBマイグレーションによるメリット・デメリットがある
  • ORMやDBマイグレーションを上手く活用するために必要なこと
  • ORMやDBマイグレーションはパフォーマンスによって利用が難しくなることがある
  • 強い依存性があるが依存しすぎると危ない


を話をしました。
特に重要な項目について少し補足します。

■制約と誓約

元ネタはHUNTER X HUNTERです。
一般的にはルールとマナーなどの言葉で置き換えれると思います。
スライドに書かれて居ない大切な事はこの2つを守るメリットです。

制約のメリット

制約は必ず守らなければいけないルールです。
つまり逆説的に制約というレールを轢いてその上を走るということです。
その為、一般的な最適解に辿り着きやすく、よくある事例ならすでに回答が用意されている事もあります。
そのため大きな失敗をする可能性が減り、レールの上を走っているときはとても生産性が上がります。

誓約のメリット

制約に対して誓約は強制力はありません。
例えで出したデザインパターンや命名規則などは強制では無いため、現場では統一されていないこともあります。
また文化として誓約が浸透している部分も多々あります。
例えば命名規則で言えばisで始まればboolを返すでしょうし、getなら戻り値を返すと言った感じです。
これによってコードの記述量が減ることは一般的には少ないと思います。
むしろデザインパターンを採用することで増える事もあるでしょう。
しかしこのような誓約を利用すると人間がコードを読んだり書いたりする際の生産性が上がります。
それは「勘が働く」からです。
メソッドの振る舞いが予測でき、クラス構造が想像出来るコードと出来ないコードで比較すればその差は歴然です。

以上の事からDBの抽象化をするツール群はDB層の本来の姿に対する強い制約と誓約から


  • ORMを意識したスキーマ設計
  • RDBMSを意識したクラス設計


を意識しなければなりません。
しかしその代わりに高い生産性を与えてくれています。
その為、昨今でこれだけ利用されていますし、私も活用しています。

■強すぎる依存の問題

ツール群には強い制約と誓約と引き換えに高い生産性を得ることが出来る事は伝わったかと思います。
しかしこの強い制約と誓約によって問題もあります。

1つ目はスライドにもある通り、RDBの持っているSQLや多くの機能が失う事。
具体的には守る部分では外部キー制約やCHECK制約(MySQLには元々無いけど)などを利用できません。
また型の選択肢も制約されるため、PostgreSQLのJSONB型や範囲型などのより適切な型を選択することも出来ません。
SQLの構文にはプログラムでは表現しにくい内容もあり、それを失うことでパフォーマンスやメンテナンス性を犠牲にすることも多々あります。
このように制約と誓約によってRDBの本来持っている機能を失っている事を忘れてはいけません。

2つ目はDBの抽象化は完全では無いということです。
メリットの部分でも書きましたが設計などで意識しないと効率良く利用できません。
またパフォーマンスによって、利用できなくなることもあります。
そのため、ツール群に依存しているとサービスがスケールアップの壁にぶつかる事があります。
その際に「新しい選択肢を取れるかどうか?」がそのエンジニアの価値につながるというお話も当日はしました。
気になる方は下記の動画をご拝聴いただければと思います。


ということで「強すぎる依存」について説明しました。
アンチパターンというよりは現状のアプリケーションエンジニアとデータベースエンジニアの中にあるギャップを説明した章となっています。
PHPカンファレンスはアプリケーションエンジニアが多く、このような話を聞く機会は少ないと思うので最初の掴みとしては良かったと思います。
またデータベースエンジニアからすると隣の別のレイヤーの話ですからこれを機にもう少し興味を持ってくれると嬉しいですね。

ということで補足としては以上です。
これを見て気になる人はぜひ動画を見てほしいです。
「強すぎる依存」の章だけなら15分程度なのでお時間が有る時に是非。

他の章の説明はこちらから行けます

PHPカンファレンス2016でRDBアンチパターンの話してきた #phpcon2016


登壇動画



2016年9月18日日曜日

PostgreSQLの新しい教科書 ~ Software Design 10月号の特集記事を書きました ~


表題の通り、特集を執筆しました。
第2特集なので表紙で言うと左下のところに書いてあるのが僕の特集記事です。
昨日発売ですのでお近くの店頭で見かけたら是非手にとって貰えたらと思います。

内容ですがPostgreSQLの入門編と謳っていますが普段、なんとなくRDB使っている人には良い記事になったと思います。
あとOracleSE1からの移行を考えてる人へのヒントも書いてます。
ここはかなり血反吐を吐きながら頑張って情報を集めて信頼有る筋のレビューワーを通して居るのでかなり信頼度の高い部分だと思います。
ということで好評、酷評、どちらもお待ちしてますので是非読んでみてください。
2月号とは違い、PostgreSQL一色の記事ですが僕がJPUGで学んで来た道を振り返る良いきっかけでした。
皆様もコレを機にPostgreSQLに興味を持っていただければと思います。


今回の執筆を振り返ると納期直前にオリンピックがあったり(自業自得)、仕事のトラブル対応と被ったりでなかなか大変でした。
でもその分、かなり細かいところまでPostgreSQLを振り返る良いきっかけになりましたし自分自身が一番勉強になったように思います。
その結果、書いてる時はホント苦しかったのですが今は達成感でいっぱいです。
Twitterでも投稿しましたが



本当に執筆活動はこんな感じで産みの苦しみの大変さを感じました。
でもその分、感動も大きかったのでまた機会があれば是非執筆したいですね。
最近は


  • RDBデザインパターン
  • RDBアンチパターン


の本があればいいのになぁって思ったりするのでそんなテーマでどうでしょ技評さん!?
ってこのボリューム感だと書籍になるし、僕死ぬパターンですね。
あんまり墓穴を掘るのも恐ろしいのでこの辺でこの話題は止めておきましょうw


兎にも角にも皆さん是非読んでみてください。
それで興味が分けば是非コミュニティに参加してみてください。
年内だと下記のようなイベントが予定されています。
最寄りのイベントがあれば是非参加してみてください!!



来週がOSC島根、中国地方DB勉強会とに連続ですし来月上旬はOSC長岡で新潟でもJPUGが参加します。
それでは皆様と現地で交流できる事を楽しみにしております!!


2016年8月22日月曜日

第16回 中国地方DB勉強会 in 岡山でPostgreSQLアンチパターンの話をしてきた #ChugokuDB

先月の事ですが(もう一ヶ月が経とうとしてますが)第16回が開催されました。
今回はアンチパターンを題材にRDBの辛いことを語り合いました。
講師の@t_wadaさんがおっさんたちの心を要所でエグッてたのが印象的でした。

■登壇資料など
中国地方DB勉強会のポータルサイトにまとめました。

※今回は動画があります


中国地方DB勉強会


■メーリングリスト
次回の告知についてはDoorKeeperを使います。
興味がある方はチェックしてみてください。

DoorKeeper

■twitterのまとめ
Twitterについては@razonさんがまとめてくれています。

Twitterのまとめ

キャンセル待ちが出るほどの大盛況で当日は立ち見の人も居ました。
@a_suenamiさんが自主的に立ってただけなのですが)
僕もこの回の動画を振り返りとして見たのですが凄くいい内容でディスカッションも含めて良い回だったなと心底思います。
このような回はまた別の場所でも是非やりたいですね。

そして次回ですが次は島根です!!

第17回 中国地方DB勉強会 in 松江

■概要
開催日:2016年09月25日(日) 10:00 - 16:30
開催場所:松江市市民活動センター 島根県松江市白潟本町43番地 松江市市民活動センター 503研修室

申込はこちら
第17回 中国地方DB勉強会 in 松江

今回はOracleのやまさきさんが来てなんと2セッションもしてくれます!!
まだまだ進化しているMySQL5.7の話が聞けるはず。
もっと言えばOracle OpenWorld 2016の直後なので驚きの新情報も開示されるはず。
噂のMySQL 8とか聞けるんじゃないかなぁと期待してます!!!

なお今回は日曜日開催ですが土曜日にはオープンソースカンファレンス島根が開催されます。
こちらも合わせてご参加して勉強会駆動島根旅行を楽しんでいただければと思います。

第15回 中国地方DB勉強会 in 米子でプログラマに知ってほしいRDBな話をしてきた #ChugokuDB

既に第16回が終わってるのに15回の報告書きます。
色々ごめんなさい、ごめんなさいm(_ _)m
当日の資料はこちらです。
PHPカンファレンスの資料を元なので見たことある内容だと思います。
スライドについては失ってしまったのでポータルサイトから動画をお楽しみください^^;

セッションとしては目玉は梶山さんのMySQLの話と竹中さんの今日から使えるセキュリティtipsです。
竹中さんのセッション、マジ最高なので全人類に見てもらいたいですね。

■登壇資料など
中国地方DB勉強会のポータルサイトにまとめました。

※今回は動画はあります


中国地方DB勉強会


■メーリングリスト
次回の告知についてはDoorKeeperを使います。
興味がある方はチェックしてみてください。

DoorKeeper

■twitterのまとめ
Twitterについては@noborusさんがまとめてくれています。

Twitterのまとめ

鳥取の開催だったのですが懇親会の意見交換などが凄く活発で楽しかったです。
あと地方は懇親会の費用対効果が高い。
最近続けて東京のイベントの懇親会出たからか凄く感じました。
中国地方DB勉強会、スタッフが幹事をこなしてきた歴戦のおっさんばっかりなのでチョイスするお店のクオリティが高いのもプラスなところですね。

そして16回は既に終わっていて17回の予定が決まってます。
次は島根です!!

第17回 中国地方DB勉強会 in 松江

■概要
開催日:2016年09月25日(日) 10:00 - 16:30
開催場所:松江市市民活動センター 島根県松江市白潟本町43番地 松江市市民活動センター 503研修室

申込はこちら
第17回 中国地方DB勉強会 in 松江

今回はOracleのやまさきさんが来てなんと2セッションもしてくれます!!
まだまだ進化しているMySQL5.7の話が聞けるはず。
もっと言えばOracle OpenWorld 2016の直後なので驚きの新情報も開示されるはず。
噂のMySQL 8とか聞けるんじゃないかなぁと期待してます!!!

なお今回は日曜日開催ですが土曜日にはオープンソースカンファレンス島根が開催されます。
こちらも合わせてご参加して勉強会駆動島根旅行を楽しんでいただければと思います。

2016年7月19日火曜日

PHPerに知って欲しいRDBの事をPHPカンファレンス関西で話してきた

PHPカンファレンス関西@2016に登壇してきました。
まず登壇資料はこちらです。



PHPerに知ってほしいシリーズとしては最終章になると思います。
結局のところ


  • 正規化
  • INDEXの適切な利用
  • 外部キー制約やcheck制約を利用したデータの保護


この辺を適切にこなせていれば多くのPHPで作る規模のWebアプリケーションは問題にならないと思います。
またこの辺をクリアしていればORMでも便利にRDBを利用できると思います。
ということで伝えたいことは伝わったかわかんないけど僕のDBAとしての仕事が減ってくれるくらいにみんなが興味を持ってくれたら嬉しいなって思ってます!

あとカンファレンスの事だと基調講演がまぁよかった。
動画を是非ともみんなに見てもらいたいですね。
その中で出てくる名言が僕の心に刺さりました。



ほんとみんなにはあの動画見てもらいたいですね。
あと気づいたのですが"PHP"カンファレンスなのにPHPの話してない人が多かったです(お前が言うな
BigQueryやAWSの話は僕が元々好きな領域なので楽しく聞けました。
あとは聞きたい!って思っても満席で聞けなかったセッションもいっぱいありました。
動画公開楽しみにしてます!!


ということで残すPHPカンファレンスは東京のみとなりました。
僕は次は登壇しないかもしれないしそもそも行くかも分からないです。
ただPHPerの人はみんな優しい。
そして楽しい。
そんな出会いの場であるカンファレンスにはまた是非行きたいなぁって思ってます。
ということでPHPerの人向けのRDBエバンジェリスト業は一旦閉幕とさせていただきます。

いやほんと楽しかったなぁ。