SecurityCamp2019
本ページは,セキュリティキャンプ2019全国大会の,集中コースにおけるデータベースゼミ募集要項の補足ページです.
興味がある方は是非ご欄になって,データベースゼミへの応募をご検討ください.
セキュリティキャンプ2018全国大会でも同じゼミを同じ講師が担当しています.
データベースシステムとは
データベースは,データの集まりで,特に整理整頓されているデータを指すことが多いです.
データベースを扱うときは,その中に含まれるデータを検索したり,追加,編集,削除したり,まとめて集計加工をします.
ひとりで使うデータベースであれば,Excel などの表計算ソフトでも足りることが多いと思います.
複数人で,組織で,Web サービスで,ひとつのデータベースを管理したい場合は,もっと良い方法があります.それがデータベースシステムを使うことです.
データベースシステムといったとき,皆さんは具体的にどんなソフトウェアを思い浮べるでしょうか?オープンソースのデータベースシステムだけとっても,MySQL,PostgreSQL など,商用だと Oracle,DB2,SQL Server,Google Spannar など,たくさんあります.これらは SQL という操作インターフェースを供えており,トランザクション処理が可能です.また,大量のデータを加工,集計する処理も,規模や状況によりますが可能です.
もう少し広い範囲でも見てみることにします.
Hadoop や Spark などは,細かい単位でのデータ操作,とりわけトランザクション処理には対応していない代わりに,SQL SELECT 文の実行,つまり,データを大量に加工,集計する用途に特化しています.また,ひとつのホストでは保持できない程の大量のデータを扱えるように,複数のホストをまたがって動作する分散システムです.
etcd などは,設定情報を分散システムで安全に共有する目的で使われることが多いデータベースシステムですが,Key-value store に分類されます.Key-value store は細かい違いはありますが,主に key を指定して,value を検索,操作する,SQL よりも単純なインターフェースを持っています.
同様の key-value store として,memcached や Redis などは,データの永続化をある程度犠牲にしてでも,高速に処理したいデータを扱う目的で使われることが多いようです.
以上のように,目的,用途に応じて様々なデータベースシステムがあります.
トランザクション処理
本ゼミは,上記で紹介した様々なデータベースシステムが持っている機能の中で,トランザクション処理を対象とします.トランザクション処理は,世の中になくてはならない処理のひとつです.皆さんが銀行 ATM でお金を入出金したり,送金したりする度に,裏でトランザクションが実行されます.ATM での操作が「きちんと」実行されないと困りますよね.また,皆さんがインターネット上の販売サイトで何かを購入するときに,決済(支払い)の画面で,決済ボタンを押す度に,裏でトランザクションが実行されます.これらの操作も「きちんと」処理してくれないと困りますよね.お金のやりとりにはほぼ必須ですが,それに限らず様々なやりとりでトランザクション処理は必要とされています.世の中には「きちんと」処理してくれないと困る処理が多いからです.「きちんと」がどういう意味を持つかについて理解するには,ACID の理解が必要となります.応募時の設問にもなっていますので,分からない方,興味を持った方は自分で調べてみてください.
トランザクション処理の重要性について書きましたが,本ゼミが開講されている一番の理由は、講師である私が,トランザクション処理をおもしろい,と思っているからです.
トランザクション処理を学ぶべき人
アルゴリズムとデータ構造を学ぶのがおもしろいと思う方は,トランザクション処理もおもしろいと感じる適性が間違いなくあると思います.何故ならトランザクション処理は,メモリ上,ディスク上で,様々なデータ構造を必要とし,その操作に伴うアルゴリズムを必要とするからです.
並列プログラミングが大好きな人も,トランザクション処理の性能を高めるために,それを駆使する必要があるので,楽しいと思います.
データベースゼミの目的
本ゼミを通じて,データベースシステムの仕組みを理解し,作る側の人間になれる人を増やしたいと思っています.
セキュリティという観点では,SQL インジェクションはトピックのひとつかと思いますが,本ゼミでは SQL を扱いません.SQL はデータベースシステムを操作するインターフェースのひとつであって,本ゼミで注力したいトランザクション処理には直接関係ないからです.もちろん,SQL はインターフェースとしてデファクトスタンダードです.
SQL についての情報はたくさんあります.本もたくさん出ています.それはデータベースシステムを使う人のための知識で,データベースシステムを使う人はたくさんいるからです.
また,アプリケーションを設計実装する人達は,一般に,単に良い性質を持つ一連のデータベース操作としてトランザクションを設計するだけで済むことが多いと思います.
それほどトランザクションという概念のもたらす抽象化は良く出来ていると思います.トランザクションは万能であるけれども,その皺寄せはトランザクション処理を実行するデータベースシステムに来ているのです.
データベースシステムを作れるであろう人は,私が思うに少ないです.もちろん,使う人ほど多くなくていいですが,作る人がもっといて欲しいなと思います.さらに,データベースシステムの作り方を教える人も少ないと思います.というわけで,微力ではありますが多少の心得がある私が本ゼミを担当することになり,応募を検討されている皆さんに向けてこの文章を書いているというわけです.
データベースゼミで学んでもらうこと
本ゼミでは,トランザクションを処理する仕組みについて実際にプログラムを作ることを通して学んでもらいます.
トランザクションを実行するのに必要な主な仕組みは,メモリ上およびディスク上のデータ構造に加えて,ログ先行書き込み (Write-ahead logging, WAL) と並行実行制御(Concurrency Control) です.
私がおもしろく,そして難しいと思うところは,トランザクションを並列に実行するための,様々な仕組みです.Concurrency Control がまずそれにあたります.Concurrency Control とひとくちに言っても様々な手法がありますが,S2PL という手法が基本中の基本だと思ってもらって良いと思います.ただ,Concurrency Control をデータベースシステム上で実現するにあたって,本当に複数の CPU コアを使って複数のスレッド/プロセスでトランザクションを並列に実行する場合,複数スレッド/プロセスからひとつのデータ構造にアクセスするので,並列プログラミングと言われている技術が必要になります.具体的には lock や latch などデータの適切な排他を行う仕組みが,場合によっては,lock-free だとか mutex-free と呼ばれているような技術もです.
皆さん次第ではありますが,本ゼミに与えられた時間でそこまで到達するのは容易ではないと思っています.そこで,並列処理にチャレンジする前に到達して欲しいマイルストーンとして,シングルスレッドで,基本的なトランザクション処理ができるデータベースシステムの開発を目指して欲しいと思います.シングルスレッドプログラムに対象を絞ったときは,初めに,ディスク,つまり永続ストレージの特性と操作について,次にデータ構造(主にアクセスメソッドとしてのインデクス),そして WAL について学んでもらいます.ここまでを実装すると,クラッシュリカバリができるようになり,最低限のトランザクション処理ができるデータベースシステムですよと主張できるようになります.
次なるステップとして,逐次プログラミングでもできる Concurrency Control について学んでもらおうと思っています.これにより,ディスク IO の間に,別のトランザクションを実行できるようになります.その先に,楽しい並列プログラミングの世界が待っています.
前提となる知識と経験
プログラミングをまったくやったことがない方はご遠慮願います.本ゼミでは,いちからコードを書いて動かしてもらいますので,プログラムを書いたことがない人には荷が重いからです.事前学習ではトランザクション処理の理解や必要な部品の開発に時間を使ってもらいたいので,プログラミングそのものを学ぶ時間はあまりありません.
開発に用いるプログラミング言語について.
データベースシステムは,C/C++ などのよりメモリや CPU を直接扱いやすい言語で書いてあることが多いですし,最近ですと,Go や Java で書かれているものもあるようです.本ゼミでは,上記の言語を使わないとダメというわけではありません.コードが書きやすい言語として,昨年は,Python を指定するのが良いかなと思っていましたが,途中で方針変更し,好きな言語を使っていいよ,ただし私が読めない言語はサポートが受けづらくなるよ,としたところ,結果的に受講したふたりはそれぞれ C++ と Java を選び,コードを書きました.私は C,C++,Python,Java,あたりは一応読めますが,Go や Rust はあまり自信がありません.本ゼミで設計やコードのレビューをするときは,主に受講者の方に説明してもらいながらのレビュー形式になると思いますので,私が文法が分からなくても適宜説明して頂ければ問題はないでしょうが,効率は落ちるのはご容赦ください.
知識について,基本的なアルゴリズムとデータ構造について理解していれば,足りないということはありません.Tree 構造と hash 構造の特性の違いだとか,search と sort アルゴリズムだとか.分からなければ,必要に応じて学べば良いです.
応募を考えている人達へ
皆さんには,本ゼミで学んだことを生かして,いずれ,是非オリジナルの特徴を持ったデータベースシステムの開発にチャレンジしていただきたいですし,実用的なデータベースシステムを作る側の人になって活躍して欲しいです.もちろん,データベースシステムを使う側の人になったとしても,ここで得た知識は多いに役立つでしょう.どのような仕組みになっているかを知らないで使うのと,知っていて使うのでは,大きな差が出ます.データベースシステムの気持ちを知らない人は,データベースシステムをうまく使うことが出来ません.また,研究の分野でもまだまだ課題はたくさんあり,それらを解決に向かわせる新しい手法を探求していって欲しいとも思います.
データベースシステムは,秘密にしなければならないデータを格納することも多いので,データの漏洩や改竄をされないように厳重に守らなければなりません.その第一歩は,バグを出来るだけ少なくするような設計実装であることはいうまでもありませんが,データベースシステムそのものだけでなく,周辺環境,使う人達のことも含めて,セキュリティを十分意識して頂きたいと思います.
Changelog
2019-04-03 最初のバージョン