初心者に向けるTiDBの学習メニュー
[初心者に向けるTiDBの学習 ~ストレージ編 第1回~] (https://qiita.com/it2911/items/a676bb6a63b07e865558) <- 今ここ
初心者に向けるTiDBの学習 ~ストレージ編 第2回~
初心者に向けるTiDBの学習 ~ストレージ編 第3回~
初心者に向けるTiDBの学習 ~コンピューティング編 第1回~
初心者に向けるTiDBの学習 ~コンピューティング編 第2回~
初心者に向けるTiDBの学習 ~スケジューリング編~
はじめ
データベース、オペレーティングシステム、コンパイラは、コンピュータソフトウェアを構築するメインとなる基盤です。データベースはアプリケーション層に近くビジネスをサポートするシステムで、何十年にもわたって開発が続いており、日々進化し続けてます。
多くの人々が様々な種類のデータベースを利用してきたと思いますが、データベース(特に分散データベース)の開発経験がある方はごく少数と思います。データベースの実装から知るとスキル向上につながるだけでなく、他のシステムの構築にも役立ち、データベースを巧みに活用する事ができます。
技術理解を深めるのにベストな方法は、その分野のオープンソースプロジェクトに打ち込むことだと筆者は考えます。データベース分野にも多くの優れたオープンソースプロジェクトが存在します。このプロジェクトを通して、特に有名なMySQLとPostgreSQLのソースコードを読んだことがある人も多いはずです。分散データベース分野の中でTiDBも認められている数少ないプロジェクトで、上記製品と同様にソースコードを読むことも可能です。
ただ、分散データベースは複雑なため、多くの技術者にとってプロジェクト全体を理解するのが困難なようです。その為、筆者はTiDBの技術を分かりやすく解説する記事をまとめることにしました。オープンソースから読み取れるテクニックだけでなく、SQLインタフェースの背後に隠されている実装の際のテクニックなども多数ご紹介致します。
データの格納
データベースの最も基本的な機能であるデータの格納について説明します。データを格納する方法は多数あります。一番簡単なのは、メモリ内にデータ構造を構築し、ユーザーから送信されるデータを格納するという方法です。たとえば、配列を使用してデータを格納し、データを受信したときにその配列に新しいエントリを追加できます。このソリューションはシンプルで、基本的なニーズを満たし、パフォーマンスにも優れています。しかし、これらの利点を上回る欠点が存在します。一番大きな問題は、すべてのデータがメモリに保存されるため、サーバーが停止または再起動するとデータが失われることです。
データの持続性を達成する手段としては、ディスクなどの不揮発性ストレージにデータを格納します。ディスク上にファイルを作成し、データを受信したらそのファイルに新しいデータを追加します。これは、持続性のあるストレージソリューションですが、これだけでは、十分とは言えません。なぜなら、格納しているディスクが壊れた場合、データが失われるからです。その為、ディスクが壊れた場合を想定しRAID (Redundant Array of Independent Disks)で冗長化し使用します。しかし、マシンがダウンしたらどうなるでしょうか?データにはアクセスできなくなります。
RAIDは安全な格納場所にはなりません。他にも、ネットワーク経由でストレージにデータを保存する方法や、冗長ソフトウェアを利用し、ハードウェアレベルで複製する方法などがあります。このような方法の問題は、複製した際の一貫性の維持です。データの完全性(無損傷性)と正確性の保護は基本要件であり、実現するには、下記で示すような難しい問題が存在します。
- 高速な書き込み速度が必要
- 格納時のデータを一貫性をもって読み取ることが必要
- 同時修正に対処する必要
- 複数レコードをアトミックに修正する必要
これらの問題はどれも解決が困難ですが、全てを解決できてこそ、優れたデータベースストレージシステムと言えます。
このような背景を踏まえ、当社は、TiDBのデータストア部分であるTiKVを開発致しました。まずは、SQLの概念は忘れて、高パフォーマンスで高信頼の分散キーバリューストアのTiKVの実装方法をご紹介いたします。
※ TiKVは、KVSとしてご利用いただくことも可能です。
キーバリュー
データストレージシステムにおける最初の最重要ステップは、データの格納モデルの決定、つまり、どのフォーマットでデータを格納すべきかという決定です。TiKVは、オリジナルバイト配列がキーと値から構成された巨大なマップと考えることができます。このマップでは、キーはバイト配列の生のバイナリビットに従って比較順に配置されます。以下の点に留意する必要があります。
- これはキーバリューペアから成る巨大なマップです。
- このマップでは、キーバリューペアはキーのバイナリシーケンスに従って順序付けられます。ユーザーはキーの位置をシークし、他のキーバリューペアに対してNextメソッドを使用できます。これらのキーバリューペアはすべてこれよりも大きくなります。
この記事で語られているストレージモデルとSQLのテーブルの関係はどうなっているの?と疑問を感じている方もいらっしゃることでしょう。はっきり言います。無関係です。
今回はストレージとキーバリューの基本知識を紹介しました。次回、初心者に向けるTiDBの学習 ~ストレージ編 第2回~で分散Key-ValueのTiKVの原理を紹介させていただきます。