TiDBとは？解説と活用方法について

## はじめに

TiDBは、分散型SQLデータベースであり、従来のリレーショナルデータベース（RDBMS）の使いやすさとNoSQLのスケーラビリティを兼ね備えています。この記事では、TiDBの基本概念、NewSQLとしての位置づけ、TiKVの役割、PD Clusterの説明、そしてTiDBの環境構築について詳しく説明します。

## NewSQLとは？
NewSQLは、従来のRDBMSのACID特性とNoSQLのスケーラビリティを兼ね備えた新しいタイプのデータベースでTiDBもその一つです。NewSQLデータベースは、高スループットのトランザクション処理を分散環境で実現し、大規模なデータセットに対しても一貫したパフォーマンスを提供します。

## NewSQLの特徴
- **ACID特性のトランザクション**: NewSQLは、分散環境においても強い一貫性を保つトランザクションをサポートします。
- **水平スケーラビリティ**: データをシャーディングし、複数のノードに分散して保存することで、大規模なデータセットでも効率的に処理できます。
- **高可用性**: Raftプロトコルを使用したデータ複製と自動フェイルオーバーにより、高い可用性を実現しています。
- **強い一貫性**: 分散トランザクションをサポートし、一貫性のあるデータ処理を提供します。
## TiDBの基本概念
TiDBはGoogle Cloud Spannerから多くのインスピレーションを受けており、特に分散トランザクションと水平スケーラビリティの実現方法において影響を受けています。

### TiDBのアーキテクチャ

TiDBは主に以下の3つのコンポーネントから構成されています：

1. **TiDBサーバー**: SQLレイヤーとして機能し、SQLクエリを解析、最適化、実行します。MySQLプロトコルと互換性があり、既存のMySQLクライアントやツールを使用できます。
2. **TiKV**: 分散型キー・バリューストアであり、データのストレージを担当します。RocksDB上に構築されており、Raftプロトコルを使用してデータの複製と一貫性を保証します。
3. **PD（Placement Driver）クラスター**: クラスタ管理とメタデータの管理を行い、データの分割と配置を制御します。

## TiKVの解説

### TiKVの役割

TiKVは、TiDBのデータストレージを担当する分散型キー・バリューストアです。以下が主な役割です：

1. **データストレージ**: データをキー・バリュー形式で保存し、高速なデータアクセスを提供します。
2. **データ複製**: Raftプロトコルを使用してデータの複製と一貫性を保証します。
3. **フォールトトレランス**: ノード障害時に自動フェイルオーバー機能を提供し、高可用性を実現します。
4. **スケーラビリティ**: ノードを追加することで、容易にスケールアウトが可能です。

### TiKVのアーキテクチャ

TiKVは、データをリージョンと呼ばれる小さな単位に分割し、各リージョンは複数のTiKVノードに複製されます。PD（Placement Driver）がリージョンの配置と負荷分散を管理します。

## PD Clusterの役割

PD（Placement Driver）はTiDBクラスターの「頭脳」として機能し、以下の重要な役割を果たします：

1. **メタデータの管理**: クラスタ内のすべてのメタデータを管理し、データの配置やスプリット情報を保持します。
2. **スケジューリング**: データのバランシングやリソースの最適化を行い、クラスタ全体のパフォーマンスを向上させます。
3. **リーダー選出**: Raftプロトコルに基づいてリーダー選出を行い、データの一貫性と可用性を確保します。
4. **クラスタの監視と管理**: クラスタのヘルスチェックを行い、障害発生時のリカバリを管理します。


## TiDBの活用方法

### アーキテクチャ例

TiDBをデータベース、S3やGoogle Cloud Storageをデータレイク、SnowflakeやBigQueryをデータウェアハウス（DWH）として使用し、その後にBIツールや機械学習（ML）を組み合わせるアーキテクチャを紹介します。

```plaintext
+--------------------------------------+
|              Clients                 |
+--------------------------------------+
              |       
              v       
+--------------------------------------+
|           TiDB Servers               |
+--------------------------------------+
              |       
              v       
+--------------------------------------+
|           PD Cluster                 |
+--------------------------------------+
              |       
              v       
+----------------------------+ +----------------------------+
|          TiKV Nodes        | |          TiKV Nodes        |
+----------------------------+ +----------------------------+
              |       
              v       
+--------------------------------------+
|         Data Transfer Tool           |
|         (e.g., Apache NiFi)          |
+--------------------------------------+
              |       
              v       
+--------------------------------------+
| Data Lake (Amazon S3, GCS, etc.)     |
+--------------------------------------+
              |       
              v       
+--------------------------------------+
|           ELT Tool (e.g., DBT)       |
+--------------------------------------+
              |       
              v       
+--------------------------------------+
|    Data Warehouse (Snowflake, BQ)    |
+--------------------------------------+
              |       
              v       
+----------------+ +------------------+
|  BI Tools      | |  ML Systems      |
| (Tableau, etc.)| | (TensorFlow,etc.)|
+----------------+ +------------------+
```

### アーキテクチャの利点

1. **スケーラビリティ**: 各コンポーネントが独立してスケールできるため、システム全体のスケーラビリティが高い。
2. **柔軟性**: 異なるツールやサービスを組み合わせることで、システムの柔軟性が向上。
3. **高可用性**: TiDB、S3、Snowflake、Google Cloud Storage、BigQueryなどのサービスは、高可用性とデータ冗長性を提供。
4. **リアルタイム性とバッチ処理の両立**: TiDBでリアルタイム処理を行い、S3やGoogle Cloud StorageとSnowflakeやBigQueryでバッチ処理や高度な分析を行うことができる。

## TiDBの簡単な環境構築手順について

### 1. TiUPのインストール

まず、TiUPをダウンロードしてインストールします。

```sh
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
```

次のメッセージが表示されたら、TiUPは正常にインストールされています。

```
Successfully set mirror to https://tiup-mirrors.pingcap.com
Detected shell: zsh
Shell profile:  /Users/user/.zshrc
/Users/user/.zshrc has been modified to add tiup to PATH
open a new terminal or source /Users/user/.zshrc to use it
Installed path: /Users/user/.tiup/bin/tiup
===============================================
Have a try:     tiup playground
===============================================
```

### 2. グローバル環境変数の設定

上記の出力に従い、シェルプロファイルを更新してTiUPを利用可能にします。この場合、`~/.zshrc`を使用します。

```sh
source ~/.zshrc
```

### 3. TiDBクラスターの起動

現在のセッションでクラスターを起動します。以下のコマンドを実行して、最新バージョンのTiDBクラスターを起動します。

```sh
tiup playground
```

または、特定のバージョンとインスタンス数を指定して起動することもできます。

```sh
tiup playground v8.1.0 --db 2 --pd 3 --kv 3
```

このコマンドは、指定されたバージョンのクラスターをローカルマシンにダウンロードして起動します。

### 4. クラスターのアクセス情報

クラスターが正常に起動すると、以下のようなアクセス情報が表示されます。

```
CLUSTER START SUCCESSFULLY, Enjoy it ^-^
To connect TiDB: mysql --comments --host 127.0.0.1 --port 4001 -u root -p (no password)
To connect TiDB: mysql --comments --host 127.0.0.1 --port 4000 -u root -p (no password)
To view the dashboard: http://127.0.0.1:2379/dashboard
PD client endpoints: [127.0.0.1:2379 127.0.0.1:2382 127.0.0.1:2384]
To view Prometheus: http://127.0.0.1:9090
To view Grafana: http://127.0.0.1:3000
```

### 5. TiDBのダッシュボードへのアクセス

TiDBが正常に起動していることを確認するために、以下のURLにアクセスします。

- **TiDB ダッシュボード**: [http://127.0.0.1:2379/dashboard](http://127.0.0.1:2379/dashboard)
  - デフォルトのユーザー名: `root`
  - パスワード: 空

- **Prometheus ダッシュボード**: [http://127.0.0.1:9090](http://127.0.0.1:9090)

- **Grafana ダッシュボード**: [http://127.0.0.1:3000](http://127.0.0.1:3000)
  - デフォルトのユーザー名とパスワード: `admin`

### 6. TiDBへのアクセス

TiUP Playgroundがバックグラウンドで実行されていることを確認した後、新しいターミナルウィンドウを開き、以下のコマンドを実行してMySQLクライアントからTiDBに接続します。

```sh
mysql --host 127.0.0.1 --port 4000 -u root
```

## 動作確認とテスト

### データベースとテーブルの作成、データの挿入、クエリ

TiDBに接続した後、以下のコマンドを実行してデータベースとテーブルを作成し、データを挿入してクエリを実行します。

```sql
-- データベースの作成、テーブルの作成、データの挿入を同時に実行
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com'), ('Bob', 'bob@example.com');
```
![スクリーンショット 2024-06-16 17.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/411a977e-334a-5224-47aa-56fd94c36ecf.png)
```
-- データのクエリ
SELECT * FROM users;
```
![スクリーンショット 2024-06-16 17.12.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/97eeb998-9db4-7182-7edd-5446403ae098.png)

## ダッシュボードについて
[**TiDB**] ダッシュボードでは、クラスターの全体的なステータス、各コンポーネントのヘルスチェック、パフォーマンスメトリクス、トランザクションの詳細、SQLクエリの実行状況などをリアルタイムで監視できます。これにより、クラスターのパフォーマンス最適化やトラブルシューティングが容易になります。

[**Prometheus**] ダッシュボードでは、クラスターの詳細なメトリクス（例：CPU使用率、メモリ使用量、I/O統計など）を収集・表示します。これにより、リソースの使用状況を監視し、パフォーマンスのボトルネックを特定できます。

[**Grafana**] ダッシュボードでは、Prometheusから収集したメトリクスを視覚化し、カスタムダッシュボードを作成して、より詳細なデータ分析が可能です。

※以下はTiDBダッシュボードから見えるUIの例です。
![スクリーンショット 2024-06-16 17.13.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/4477c653-653e-9574-7d35-e0a1b7c2e3fe.png)
### 7. クラスターのクリーンアップ

テストデプロイ後にクラスターをクリーンアップします。サービスを停止するには`Control+C`を押します。サービスが停止したら、次のコマンドを実行します。

```sh
tiup clean --all
```

これにより、クラスターに関連するすべてのデータが削除されます。

## まとめ

TiDBは、MySQL互換の分散型SQLデータベースであり、スケーラビリティと高可用性を提供します。NewSQLとして、従来のRDBMSの利便性とNoSQLのスケーラビリティを兼ね備えています。この記事で紹介したアーキテクチャを活用することで、データベース、データレイク、データウェアハウスを効果的に組み合わせたシステムを構築できます。さらに、Dockerを使用した簡単な環境構築手順により、すぐにTiDBを試すことができます。