Transactional Database を作りたい
セキュリティキャンプ2018のデータベースの講義に関するツイートがTLに流れてきたのを見て、自分もデータベース作ってみたいなぁと思ったので作り始めることにした。 データベースを作るのは初めてなので、まずは「トランザクションのあるデータベース」と言い張れる最小限のものを作りたい。
ということで「ぼくのかんがえたさいじゃくのデータベース」の仕様を作った。明日から頑張る。
概要
- 表形式ではなく、key-value store にする
- key も value も String 型
- トランザクションをサポート
- トランザクション上で任意個のコマンドを実行できる
- ACID を満たす
- クライアントは逐次的に処理する
- データの総量がメモリに収まると仮定する
コマンド
以下の4つのコマンドをサポートする。
read KEY write KEY VALUE commit rollback
クライアントは TCP でデータベースサーバーに接続してコマンドを送りつける。
ACID
Atomicity
トランザクションの結果が、コマンドが全て実行された結果か、全く実行されなかった結果のどちらかになる性質。
Consistency
……このデータベースの場合、満たすべき制約は存在しない?
Isolation
トランザクションの過程が他のトランザクションから観測されない性質。 このデータベースではそもそも複数のトランザクションを同時に実行しないので自動的に満たされる。
Durability
成功したトランザクションの結果が(たとえデータベースやコンピュータがクラッシュしても)失われない性質。
設計
- Rust で作る。
- メモリ上に HashMap として key-value store を持つ。
- ディスクに WAL を書く。
- 起動時に WAL を先頭から全部読んで HashMap を再生する。
- このとき、WAL の末尾の未コミットのレコード列は truncate する。
- 中途半端に書かれた WAL のレコードは truncate する。このために WAL のレコードには CRC64 をつけておく。