[TiDB] DB Tech Showcase に向けたTiDBの入門

この記事は[TiDB Advent Calendar 2023](https://qiita.com/advent-calendar/2023/tidb)の6日目です。

いよいよ本日からデータベースの祭典[DB Tech showcase 2023](https://www.db-tech-showcase.com/2023/)が始まります。TiDB関連セッションは二日目に固まっていますので、今日はまだ大丈夫、予習の時間があります :smile: ここで予習して明日のセッションに臨みましょう。

# TiDBとは？

TiDBは、Googleの[Spanner論文](https://research.google/pubs/pub39966/)に着想を得て作成された、分散型データベースシステムです。
オープンソースであり[ソースコードは公開](https://github.com/pingcap/tidb)されています。また、商用サービス（商用サポート、DBaaSのTiDB Cloud）が[PingCAP](https://www.pingcap.com/)より提供されています。
TiDBのアーキテクチャ的な詳細は[こばさんが書いてくださっている](https://zenn.dev/tzkoba/articles/4e20ad7a514022)のでそちらを参照していただくとして、ここではざっくりとした構成とその特徴について簡単に記載します。

## ざっくりとした構成

TiDBは、下記のコンポーネントからなる分散データベースです。
すごくアバウトに言ってしまうと、キーバリューストアの上にMySQLプロトコルを実装したリレーショナルデータベースを作ったもの、という感じです。

* （サーバとしての） [TiDB](https://github.com/pingcap/tidb): ユーザーからのSQLを受け付けて、それをキーバリューストアのAPIに変換する
* [TiKV](https://github.com/tikv/tikv): キーバリューストア。ここにデータが保存される。
* [TiFlash](https://github.com/pingcap/tiflash): 列指向型ストレージ。TiKVからデータが連携され、分析クエリを高速に処理することができる。
* [PD](https://github.com/tikv/pd): メタデータストア。どの範囲のデータがどのTiKVサーバに保存されているかという情報を保持する

![](https://download.pingcap.com/images/docs/tidb-architecture-v6.png)

## 主な特徴

* 水平スケーラビリティ: TiDBは、トラフィックの増加やデータ量の増加に伴い、ノードを追加してシステムをスケールアウトできます。

* MySQLとの互換性: TiDBはMySQLプロトコルと互換性があり、多くのMySQLの機能をサポートしています。

* 分散トランザクションのサポート: TiDBは分散トランザクションをサポートし、リレーショナルデータベース同様に一貫性を保証します。

* リアルタイム分析: TiFlashを活用してTiDBはリアルタイムでのデータ分析を可能にします。TiFlashは分析クエリに強い列指向型ストレージエンジンで、TiKVと同期しています。ただこの内部の二つのストレージをユーザーは使い分ける必要はありません。ユーザーのクエリはより適したエンジンに適当に振り分けられます。

## TiDBはなぜ使われているのか？

大規模な採用事例の多くはスケーラビリティを要因に挙げます。従来のリレーショナルデータベースは、レプリカノードで書込を処理することができないため書込スケーラビリティに性能限界があります。スケールアウト型の分散データベースはこの制限をスケールアウトで対処するものです。

もう一つは耐障害性、もう少し踏み込むと運用まで含めたレジリエンシーといってもいいかもしれません。ノード障害が起こっても動き続けること、動かしながら運用を行うことを前提としています。運用中のシステムを止めることの難しさは運用に関わるエンジニアなら皆感じていると思いますが、フェイルオーバーやリバランスが自動で、かつ動かしながらアップグレード、DDL、設定変更等が行える点は魅力的です。

## TiDBの提供形態

現在、次の三つの形で提供されています。

### 1. TiDB Serverless (クラウド)
TiDB Serverlessは、オンデマンドでスケーラブルなデータベースソリューションを提供します。使用量に基づいて課金されるため、小規模プロジェクトや不規則なトラフィックパターンを持つアプリケーションに向いています。

### 2. TiDB Dedicated (クラウド)
TiDB Dedicatedは、専用のリソースを提供するマネージドサービスです。パフォーマンスやセキュリティの要件が高い企業向けに最適化されています。AWSでいうとRDS/Auroraのような提供形態です。

### 3. OSS
オープンソースのTiDBです。インフラのセットアップは自分で行う必要がありますが、コンポーネントのインストールは後述のTiUPツールがやってくれます。また、K8Sで動かすバージョンもあります。
AWS上で必要なインスタンスをterraformで動かすサンプルが[こちら](https://github.com/dulao5/tf-aws-tidb)にあります。

## TiDBの魅力とは

そんなTiDBの魅力を独断と偏見で3つ紹介すると

### 1. オープンソース
TiDBはApache License 2のオープンソースです。主要コンポーネントであるTiDBはGo, TiKVはRustで書かれており、それぞれの言語で最も大きなリポジトリのうちの一つでもあります。[SourceGraph](https://sourcegraph.com/)などでもインデックスされているので、実装にすぐ当たることができます。

内部実装を詳しく知りたい人は[TiDB Dev Guide](https://pingcap.github.io/tidb-dev-guide/)を見ると良いでしょう。

### 2. メトリクスやSlow Queryが充実
OSS版でもTiDB cloudでも、どちらでも試していただくとわかりますがDB関連のメトリクスやSlow QueryをWebコンソール/grafanaから確認することができます。OSS版でも標準でそれぞれのコンポーネントの詳細なメトリクスを確認できるのはなかなかないんじゃないでしょうか。

### 3. TiDB Serverless
分散データベースを使うような大規模な用途じゃないな...的な人にもお勧めなのがTiDB Serverless。TiDBのマルチテナント環境でクラスタの上げ下げが10秒程度で出来るという手軽さ。SQLite並にお手軽に使えるクラウド上のデータベースです。

## TiDBを始めるには

最もお手軽なのがTiDB Serverlessで、[TiDBにサインアップ](https://tidbcloud.com/signup)したらすぐ利用できます。[クイックスタート](https://docs.pingcap.com/ja/tidbcloud/tidb-cloud-quickstart)があります。

OSSバージョンは、[TiDB Playground](https://docs.pingcap.com/ja/tidb/stable/tiup-playground)から始めるのが良いと思います。MacOSやWSL、LinuxならTiUPツールにて簡単にセットアップが可能です。
[3日目のTiUP記事](https://zenn.dev/shigeyuki/articles/8663e1598ecfa5)でも詳しく紹介されていますので、こちらを参照ください。

DB tech snowcaseのTiDBセッションもお楽しみください！