2012年3月6日火曜日

新著「Webエンジニアのための データベース技術[実践]入門」

データベース技術に関する新著を執筆しました。「Webエンジニアのための データベース技術[実践]入門」という本です。



第1章:データベースがないと何が困るのか
第2章:インデックスで高速アクセスを実現する
第3章:テーブル設計とリレーション
第4章:SQL文の特徴とその使いこなし方
第5章:可用性とデータの複製
第6章:トランザクションと整合性・耐障害性
第7章:ストレージ技術の変遷とデータベースへの影響
第8章:データベース運用技術の勘どころ
第9章:MySQLに学ぶデータベース管理
第10章:MySQLのソースコードを追ってみよう
第11章:データベース技術の現在と未来
第12章:ビッグデータ時代のDB設計

---「はじめに」より
 私たちが日々活用しているオンラインサービスでは、ほぼ例外なくデータベースが背後で重要な役割を果たしています。ブログサービスのような無料のものだけでなく、ショッピングサイトのようにお金が動くもの、オンラインバンキングのように高額のお金が動くクリティカルなものに至るまで、あらゆる環境でデータベースは使われています。これらのサービスは例外なくデータを保存しておく必要があり、そのデータの保存場所がデータベースです。
 私たちは、背後のデータベースがどうなっているかなどと意識することなく、こうしたサービスを使うことができます。ただ、そのサービスの「質」を意識させられる場面は少なからずあります。頻繁にアクセス不能に陥ったり、応答時間が遅かったりするサービスは少なくありません。こうした質の問題は、背後にあるシステムの品質に大きく依存します。データベースもその中で非常に重要な役割を果たしています。
 データベース自体の歴史は長く、インデックスやデータモデリング、トランザクションといった基幹の技術は大きくは変わっていません。それにも関わらずデータベースに起因する問題がよく発生するのは、データベースに対する理解が十分ではないからというのが大きな要因でしょう。本質を理解すれば、流行に振り回されることなく適切な設計ができるようになるはずです。
 本書は、データベース技術のトレンドを整理して体系的に解説することで、こうした本質面での理解ができるようにすることを目指した書籍です。元々は技術評論社のSoftware Design誌に連載したものをベースにしています。Software Designや姉妹誌のWeb+DB Pressでは筆者が専門としているMySQL関連の特集記事の執筆などを行なったことがあり、これらのトピックも取り入れています。本質面での話と、MySQLの具体的な話を織り交ぜることで、より理解を深められるような構成を心がけたつもりです。
---

 小手先のツールが使えようが何だろうが、基本を知らん奴はトラブルの現場では何もできやしない、ということで、データベース技術の歴史を振り返り基礎をおさえたい方におすすめです。

2011年9月26日月曜日

MHA for MySQLとオープンソースとDeNAの話

 実に久しぶりの投稿ですが、最近リクルートのセミナーで、私が少し前に公開した「Master High Availability Manager and tools for MySQL (MHA)」と、オープンソース界隈の技術者として、DeNAでどのような活躍の可能性があるかといった話をしてきました。



 ust配信とかはしていなかったので残念ながらデモ動画は残ってませんが。。

 何点か今の時点での私の考えをまとめると、以下のような感じです。

・どのように作るかよりも何を作るかの方が大事だと思っている
・そのプロダクトの技術力が最も高いのはベンダーだが、何を作るかという発想はサービス会社での経験から生まれることも多いと思っている
・DBスペシャリストのような特殊技能を生かした仕事をサービス事業者で行なうには、大規模サービス事業者でないと現実的には困難
・今の為替レートは海外で働くには不利すぎる。今のご時世、海外でないとできないことはそれほど多くない
・とはいえ、スペシャリストとしてキャリアを築くのであれば、海外のカンファレンスなりである程度発信し続けることは必要。そうした活動に対する理解のある会社で働くことは重要(こうした理解が本当にある日本企業はとても限られているので注意)。

 DeNAに入ってから1年強が経ったのですが、これまではおおむね自分の想定通りに働けている感じで満足しています。

2010年9月2日木曜日

Leaving Oracle, Joining DeNA

 9月1日付けでオラクルを退職し、9月2日付けでディー・エヌ・エーに転職しました。新会社への入社の報告よりも(だいぶ)前に退職の報告をする方が多いようですが、私が外向けにオラクル退職の報告をするのはこれが初めてです。退職と転職の報告と同時に行なうのは、多くの方がナーバスになっているオラクルとMySQLの行く末について、できるだけ悪い印象を与えたくないと考えたためです。ディー・エヌ・エーは世界でも指折りのMySQLの超ヘビーユーザとして知られています。オープンソースの世界では、ベンダーからヘビーユーザの事業会社に転職し、その専門性を生かした仕事を続けることは珍しくありません(オープンソースのメリットの1つです)。というわけで、引き続きMySQLの仕事を続けます。MySQLコミュニティの方はどうか安心してくださればと思います。今後ともどうぞよろしくお願い致します。

 私は2006年9月にMySQLに入社して以来、2度の買収(サン、オラクル)を経て、のべ4年間を「MySQL本家のMySQLコンサルタント」として過ごしてきました。サービスに対して対価を受け取るコンサルタントとして勤務するのも社会人として初めてのことだったのですが、それ以外にも以下のような得難い経験をさせて頂いて、自分にとって忘れられない4年間となりました。

・米国やインドなど海外の顧客に対する難度の高いコンサルティング業務の遂行
・MySQLの開発者会議への参加や、コードのコントリビュートを通じてのOSS活動
・多いときは月数回の海外出張
・上司がアメリカ人。人事考課や交渉事なども米国流で当然すべて英語
・同僚や顧客の多くが外国人で、時差を調節しながらの在宅勤務をベースとした仕事
・メール、会議、カンファレンス等はすべて英語。質疑応答なども当然英語

 英語圏の企業で働くということは、言葉が変わるだけでなく文化も当然のことながら大きく異なるわけで、この点については「会議で言葉を英語にしただけの日本企業」では決して得られない経験ができたと思います。特に、彼らの本当の意味でバランスの取れた「ワーク・ライフ・バランス」には驚きました。年間25日の有給を取ったり、1ヶ月の長期休暇を取るようなワークスタイルは、ただ時間をかけて働くことが全てでは無いと改めて感じるものでした。1ヶ月ホテル暮らしでその月の経費精算が100万円を超えたことや、オフィスへの定期代の支給をしてもらうためにSkypeで上司と(米国では定期代支給の文化が無い)激論を交わしたことも今となっては良い思い出です。また英語漬けの環境で、私自身もずいぶんと国際化した感じがしました。趣味の面では、マンU vs チェルシーを現地観戦したり、米国でマリナーズ戦を観たりと普段できないことができて良かったと思います。

 ソニーで5年半働いた後に、2006年9月にMySQLに入社した時は、会社が存続する限り働きたい、できれば5年は持って欲しいと思っていました。まさか1年半弱で(サンに買われたことで)会社が無くなってしまうとは想像もしていませんでした。また、サン自体もソニー時代からよく知っていた会社で、多少なりとも愛着があったのですが、最終的にBEAとかマカフィーすらも下回る企業価値となって消滅したことは残念でなりません(Javaの本家なのにWebLogicより価値無いのかよ!)。ですが、オラクルは安い買い物をしたと確信しています。MySQL、サン、オラクルと、のべ4年間をMySQL本家で働けたことに後悔は全くありません。特に2007-2008年は良い同僚にも恵まれ、幸せでした。

 2度の買収というのは精神的にも事務手続き面(経費精算とか勤務管理とかの諸制度も変わる)でもタフなイベントだったのですが、最後にオラクルで働く中で「MySQLデータベースの行く末はまだまだ安泰」ということを強く感じました。性能面、拡張性、ユーザーベース、品質担保、使い勝手などどれを取ってもMySQLはきわめて優れており、だからこそ世界中で支持されてきたのだと思います。多くの方はすでに忘れているようですが、MySQLの中核のInnoDB(の開発元のInnobase)は、2005年にオラクルに買収されました。当時は誰もがMySQLは終わった、InnoDBはもう進化しない、と考えましたが、その後の進化ぶりは見ての通りです。InnoDB作者のHeikkiをはじめ、MySQL/InnoDB開発者の大半は今もオラクルに在籍しています。簡単にMySQLをオープンソースRDBMS2番手以下の地位に甘んじさせるとは考えられません。また製品評価の指標から見落とされることが多いのですが「品質」は極めて重要なポイントで、この品質は最終的には多くのユーザから使われることによってのみ担保されます。現在ユーザーベースでぶっちぎりの一番手にいるMySQLよりも品質の良いオープンソースの代替製品が果たして出てくるのかどうか。MySQLの行く末に不安を持つ方も多いと思いますが、片手間ではなく本気でMySQLを使っている人こそ、この点について共感してもらえるのではないでしょうか。


 新しい職場のディー・エヌ・エーのことについても話をしたいと思います。ディー・エヌ・エーと私の関わりは今に始まったことではなく、実は3年以上前からお誘いの話を頂いていました。私自身がMySQL本家を辞めることを考え始めたのはごく最近のことだったのですが、ちょうどその時期にディー・エヌ・エーがMySQLのスペシャリストを探していたのでラッキーでした。同じ時期に米国と欧州のMySQL系企業からもお誘いの話を頂いたのですが、海外の企業からそういった話が自分のところに来るというのはMySQLに行く前はありえなかった話で、自分自身も成長した気がします。日本で面白い職を見つけられたことは良かったし、私に対して価値を見出してくれたディー・エヌ・エーの方にはとても感謝しています。チームメンバーのこれまでの成果(オープンソース製品やDBマガジン等の記事など)を見るに、技術レベルが相当に高いという印象を持っています。その環境はプレッシャーにもなりますが、真のグローバル企業であったMySQL社の中で積んできた経験と知識・感性を真正面からぶつけていくことで、早期に貢献していければいいなと思っています。どうぞよろしくお願い致します。

2009年12月22日火曜日

デブサミ2010でLinux/DBに関する話をします

デブサミ2010で「高性能・安定運用のためのLinux-DBシステム構築/運用技術」というタイトルで講師をすることになりました。2010年2月18日の13:10から14:00のセッションです。
DB サーバには、RDBMSはもちろんのこと、OSやハードウェアも当然必要ですし、運用管理ツールやクラスタリングソフトウェアなどの支援ツール併用することも多いです。現実の運用では、支援ツールを使うことによって引き起こされるトラブルもあります。DBサーバを取り巻く全体像を把握した上で適切な対処を取れることが大切です。本セッションではこうした話をします。またRDBMSを安定稼働させ、かつ性能を発揮させるにあたって、ハードウェア、スワップ、ファイルシステム、I/Oスケジューラ、Linuxカーネルなど、どういった要素や現実問題としてトラブルになりやすく、どうすれば効果があるか、といった実戦的な話もします。
書籍「Linux-DBシステム構築/運用入門」とタイトルが大きくかぶっていますが、この本をすでに読まれている方にも、読んだことの無い方にとっても役立つ話をしたいと考えています。ご期待下さい。

2009年10月27日火曜日

MyISAMとInnoDBのどちらを使うべきか

Twitterで話題になってたので簡単にまとめました。

●MyISAMにしか無い機能を使いたい場合はMyISAMを使うしかない
・全文検索 (TritonnやSphinx)
・GIS

●InnoDBの利点(MyISAMの欠点)
▲障害対応系
・クラッシュしても再起動するだけでリカバリができる
・クラッシュリカバリにかかる時間はテーブルサイズに比例するようなことはなく、コミット済みのデータは修復できる (巨大なMyISAMテーブルのREPAIRには数日単位で時間がかかることがある)
・オンラインバックアップができる
・INSERTやLOAD DATAなどを実行している途中でCtrl+Cでその更新系SQL文を止めても、テーブルは壊れないし、中途半端な状態で更新されることも無いし、スレーブが止まることも無い

▲性能系
・行レベルロックなので並列性が高い(MyISAMはテーブルロック)。またSELECTと更新系SQL文が競合しない。
・主キー検索が高速 (クラスタ索引のため)
・ダイレクトI/O(innodb_flush_method=O_DIRECT)を使えるためキャッシュ効率が高い
・インデックスの追加/削除をするにあたってテーブルを再編成する必要がなく、そのインデックスだけを再構築するので効率が良い(InnoDB Plugin)
・Insert Bufferという仕組みにより、セカンダリインデックスへのINSERT処理の効率がMyISAMよりも良い

▲従来は欠点だったが、InnoDB Pluginによって改善されたもの
・グループコミットが無効化されるため同時更新性能が著しく低下していた
・I/Oスレッドが事実上読み書き1本ずつしか無かったため並列性が低く、RAIDやSSDを有効活用できなかった
・CPUスケーラビリティが悪く、4CPUコアくらいまでしかスケールしなかった
・同じ量のデータを投入してもテーブルサイズがMyISAMよりも倍以上大きくなることがある(InnoDB Pluginの圧縮機能を使うことで緩和する手がある)

▲ほか
・InnoDBでは外部キーが使える


●MyISAMの利点
・WHERE条件無しのSELECT COUNT(*)が一瞬で返る
(InnoDBの場合はテーブルをなめる必要がある)
・メモリにおさまらないほど巨大なテーブルのフルテーブルスキャン系の処理効率が良い
(InnoDBではこうしたバッチ処理でバッファプールの中身が追い出されてしまうし、バッファプールの管理オーバーヘッドもあるが、MyISAMは専用のバッファプールを持たないので効率が良い)
・OSコピーによってテーブルの移動が極めて簡単にできる
・MERGEテーブルを使うことができる (InnoDBでも5.1のレンジパーティショニングを使えば十分なことは多い)
・リードオンリーのテーブルであれば圧縮できる
・ALTER TABLE ENABLE/DISABLE KEYSを使える。例えばインデックスなしの状態で高速にロードして、後からインデックスを有効化とかができる (InnoDB Pluginではインデックス単位の再構築ができるのでかなり緩和できる)
・InnoDBはテーブルのオープン処理がシリアライズされるため、大量の数のテーブルを初回オープンするような処理がきつい

▲ソリューションによって緩和できるもの
・クラッシュ時に壊れる問題やリカバリ(REPAIR TABLE)の遅さは、生きているスレーブを使って復旧すれば解決できる
・テーブルが巨大になることで引き起こされる性能問題は、小さなテーブルに分割することで解決できる


 自分は、特別な事情が無い限り、5.1最新版に含まれるInnoDB Pluginを勧めています(*注)。ログ蓄積系のテーブルではMyISAMが良いと考えている方が結構多いのですが、MyISAMでは複数のクライアントから同じテーブルに対してINSERTをすれば競合してしまいますし、InnoDBのInsert BufferのようなI/O最適化の仕組みが無い(詳しくは「Linux-DBシステム構築/運用入門」の9章あたりを参考にしてください)ので、InnoDBに比べても処理効率が悪いです。MyISAMを活用する場合は、上に挙げたようなテクニックを使って問題を緩和するのが効果的です。
 ちなみに、マスターをInnoDBにして、スレーブをMyISAMにするのは以前Postしたように特別な注意が必要です。

(*注追加) InnoDB Pluginの現時点での位置づけはベータです。ただし、Dynamic/Compressedという特別なテーブルフォーマットを使わない限り、既存のInnoDBテーブルと互換性があるので、InnoDB Pluginを使いつつ、不安定な現象に遭遇したらパラメータを変えて通常のInnoDBに戻すことが可能です。追加インストールやインストールし直し等が必要ないという手軽さが魅力です。

2009年10月26日月曜日

Okyuu.comからインタビューを受けました

 先日カカクコムさんが運営しているサイト「Okyuu.com」からインタビューを受け、その記事が公開されました。
 私は幼少の頃から技術者魂全開、というキャラとは程遠く、気づいたらこの業界でDB技術系の仕事をしていた、という程度なのですが、趣味と仕事が完全に一致したという恵まれた方はむしろ少数派で、多くの方は生活のために(それと多少の興味と一致して)この業界で仕事をしているのだと思います。この業界はコードを書くのが趣味でなければ生きていけない、というプレッシャーをひしひしと感じさせますが、そうでない人にとっても活躍の場はあるのだ、という安心感を持っていただけると幸いです。
 インタビュー記事について、少しだけ補足をしたいと思います。

・お金を払うユーザーを大切にするのは当然ですが、無償で使うユーザーを無視しているわけではありません。そもそも無償で使うユーザーを無視するようではOSSビジネスは成立しません。多くの利用者が試し、時に地雷を踏みそれを修復するサイクルを繰り返すことで、ようやくお金を払っても良いかなという品質に達すると考えています。誰も使っていないプロダクト(地雷を踏むリスクが高い)にお金を払うユーザーは、昨今では非常に少ないのではないでしょうか。

・第3者企業がOSS製品をさんざん利用した挙句、ちょっと機能を追加してクローズドソースにして「自社製品です」と言い張って販売するのは、私は「邪道」のビジネスだと考えています。もちろん程度問題で、ユーティリティライブラリ程度なら全然いいと思いますが、コアの機能がもろにOSSを使っているのなら、それを拡張してクローズドソースにして販売するくらいなら本家にフィードバックしろよ、と思うわけです。

・OSSに貢献する道は、パッチを書くだけではありません。たとえば新バージョンのバグを見つけてバグレポート上で再現手順を報告するというのも立派な貢献です。こうしたバグ報告によって製品の品質は徐々に上がっていきます。その意味では、会社としてはお金を出せないしパッチを書くほどのスキルは無いけどOSSに貢献したい、というような方は、できるだけ新しいバージョンを積極的に使って、バグを見つけて報告するのが良いのではないかと思います。ただし、セキュリティ上の脆弱性に関しては、バグフィックスよりも先にBlog等で発信して一般に認知されたりすると、攻撃の対象になりかねないので気をつけて頂きたいと思います(MySQLのバグレポートでは、脆弱性の問題については、報告を受けた後に一般ユーザーが閲覧できないように権限設定されます)。

2009年10月15日木曜日

スワップサイズをゼロにしてはいけない

 先月発売された書籍「Linux-DBシステム構築/運用入門」は、なかなか上々の売れ行きとなっているようです。Amazonではしばらく「1-2ヶ月待ち」の状態が続いてしまっていたのですが、最近になってようやく解消され、容易に入手できるようになっているようです。Amazonの在庫切れ問題がひと段落したところで、これからは書籍のサポート的な情報を書いていくことにします。
 まず、本書を購入された皆さまありがとうございました。結構な数の方がBlogやTwitter等で、この本をほめてくださっていることに大変感謝しています。まだ本自体の認知度が低い(存在自体を知らない顧客も多い)ので、普及活動をしつつ、これからも読者の期待に応えられる記事を書いていきたいと思っています。

 最初は、よく見かけることの多い「メモリ管理」の話題を取り上げようと思います。第12章では、メモリ管理とスワップ領域に関する解説をしています。64ビット機と数十GBクラスの大容量メモリを搭載するのが現在のトレンドになりました。ディスクI/Oの速度はメモリアクセスに比べて極端に落ちますから(第10章参照)、できるだけ多くのデータをメモリ上に置いて高速化をはかるというのがDBチューニングの定石です。多くの場合、メモリを増設することで参照性能だけでなくINSERTなどの更新性能も上がるというのは第9章などで触れている通りです。またダイレクトI/Oを使ってキャッシュ効率を上げることも効果的です。InnoDBならinnodb_flush_method=O_DIRECTを指定すれば良いです。

 メモリ管理の設定でよく見るのが、スワップサイズをゼロにしているケースです。スワップサイズをゼロにすれば、スワップが発生しませんが、これは問題があります。本章で書いているように、プロセスが実メモリを使い切ってしまった場合に、スワップできないのでOOM Killerによって殺されてしまいます。また、このときにハングアップ状態がしばらく続き、挙句の果てに異常終了してしまうためです。単に再起動したとしても、ダイレクトI/Oであればプロセス空間のキャッシュだけでなく、ファイルシステムキャッシュ上に何も載っていない状態からスタートするため、ディスクI/Oが多発して性能が一気に低下します。もちろんDRBD等によるアクティブ/スタンバイ構成でフェイルオーバーするような場合も、フェイルオーバー先にはキャッシュに何も乗っていないため、同じように性能が落ちます。スワップサイズが小さい場合も、それを使い切れば同様にOOM Killerに殺されてしまいます。このため、「スワップサイズをきちんと(物理メモリの半分くらい)取り、ダイレクトI/Oを使い、プロセスよりもファイルシステムキャッシュが優先的にスワップされるようにvm.swappinessをゼロにする」という方法を紹介したというわけです。もちろん、スワップが発生するというのはディスクI/Oが頻発するという意味なので、それを避けるように実メモリの範囲内におさまるようにチューニングするのが大切です。

 なお、MyISAMテーブルなど、ダイレクトI/Oをサポートしていないストレージエンジンでは、RDBMSのプロセスサイズが小さくなり、ファイルシステムキャッシュのサイズが大きくなる傾向にあります。この場合、プロセスだけでメモリ空間を使い切る(OOM Killerによって殺される)ことはまず無いでしょう。