はじめに
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つのコンポーネントから構成されています:
- TiDBサーバー: SQLレイヤーとして機能し、SQLクエリを解析、最適化、実行します。MySQLプロトコルと互換性があり、既存のMySQLクライアントやツールを使用できます。
- TiKV: 分散型キー・バリューストアであり、データのストレージを担当します。RocksDB上に構築されており、Raftプロトコルを使用してデータの複製と一貫性を保証します。
- PD(Placement Driver)クラスター: クラスタ管理とメタデータの管理を行い、データの分割と配置を制御します。
TiKVの解説
TiKVの役割
TiKVは、TiDBのデータストレージを担当する分散型キー・バリューストアです。以下が主な役割です:
- データストレージ: データをキー・バリュー形式で保存し、高速なデータアクセスを提供します。
- データ複製: Raftプロトコルを使用してデータの複製と一貫性を保証します。
- フォールトトレランス: ノード障害時に自動フェイルオーバー機能を提供し、高可用性を実現します。
- スケーラビリティ: ノードを追加することで、容易にスケールアウトが可能です。
TiKVのアーキテクチャ
TiKVは、データをリージョンと呼ばれる小さな単位に分割し、各リージョンは複数のTiKVノードに複製されます。PD(Placement Driver)がリージョンの配置と負荷分散を管理します。
PD Clusterの役割
PD(Placement Driver)はTiDBクラスターの「頭脳」として機能し、以下の重要な役割を果たします:
- メタデータの管理: クラスタ内のすべてのメタデータを管理し、データの配置やスプリット情報を保持します。
- スケジューリング: データのバランシングやリソースの最適化を行い、クラスタ全体のパフォーマンスを向上させます。
- リーダー選出: Raftプロトコルに基づいてリーダー選出を行い、データの一貫性と可用性を確保します。
- クラスタの監視と管理: クラスタのヘルスチェックを行い、障害発生時のリカバリを管理します。
TiDBの活用方法
アーキテクチャ例
TiDBをデータベース、S3やGoogle Cloud Storageをデータレイク、SnowflakeやBigQueryをデータウェアハウス(DWH)として使用し、その後にBIツールや機械学習(ML)を組み合わせるアーキテクチャを紹介します。
+--------------------------------------+
| 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.)|
+----------------+ +------------------+
アーキテクチャの利点
- スケーラビリティ: 各コンポーネントが独立してスケールできるため、システム全体のスケーラビリティが高い。
- 柔軟性: 異なるツールやサービスを組み合わせることで、システムの柔軟性が向上。
- 高可用性: TiDB、S3、Snowflake、Google Cloud Storage、BigQueryなどのサービスは、高可用性とデータ冗長性を提供。
- リアルタイム性とバッチ処理の両立: TiDBでリアルタイム処理を行い、S3やGoogle Cloud StorageとSnowflakeやBigQueryでバッチ処理や高度な分析を行うことができる。
TiDBの簡単な環境構築手順について
1. TiUPのインストール
まず、TiUPをダウンロードしてインストールします。
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
を使用します。
source ~/.zshrc
3. TiDBクラスターの起動
現在のセッションでクラスターを起動します。以下のコマンドを実行して、最新バージョンのTiDBクラスターを起動します。
tiup playground
または、特定のバージョンとインスタンス数を指定して起動することもできます。
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
- デフォルトのユーザー名:
root
- パスワード: 空
- デフォルトのユーザー名:
-
Prometheus ダッシュボード: http://127.0.0.1:9090
-
Grafana ダッシュボード: http://127.0.0.1:3000
- デフォルトのユーザー名とパスワード:
admin
- デフォルトのユーザー名とパスワード:
6. TiDBへのアクセス
TiUP Playgroundがバックグラウンドで実行されていることを確認した後、新しいターミナルウィンドウを開き、以下のコマンドを実行してMySQLクライアントからTiDBに接続します。
mysql --host 127.0.0.1 --port 4000 -u root
動作確認とテスト
データベースとテーブルの作成、データの挿入、クエリ
TiDBに接続した後、以下のコマンドを実行してデータベースとテーブルを作成し、データを挿入してクエリを実行します。
-- データベースの作成、テーブルの作成、データの挿入を同時に実行
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');
-- データのクエリ
SELECT * FROM users;
ダッシュボードについて
[TiDB] ダッシュボードでは、クラスターの全体的なステータス、各コンポーネントのヘルスチェック、パフォーマンスメトリクス、トランザクションの詳細、SQLクエリの実行状況などをリアルタイムで監視できます。これにより、クラスターのパフォーマンス最適化やトラブルシューティングが容易になります。
[Prometheus] ダッシュボードでは、クラスターの詳細なメトリクス(例:CPU使用率、メモリ使用量、I/O統計など)を収集・表示します。これにより、リソースの使用状況を監視し、パフォーマンスのボトルネックを特定できます。
[Grafana] ダッシュボードでは、Prometheusから収集したメトリクスを視覚化し、カスタムダッシュボードを作成して、より詳細なデータ分析が可能です。
7. クラスターのクリーンアップ
テストデプロイ後にクラスターをクリーンアップします。サービスを停止するにはControl+C
を押します。サービスが停止したら、次のコマンドを実行します。
tiup clean --all
これにより、クラスターに関連するすべてのデータが削除されます。
まとめ
TiDBは、MySQL互換の分散型SQLデータベースであり、スケーラビリティと高可用性を提供します。NewSQLとして、従来のRDBMSの利便性とNoSQLのスケーラビリティを兼ね備えています。この記事で紹介したアーキテクチャを活用することで、データベース、データレイク、データウェアハウスを効果的に組み合わせたシステムを構築できます。さらに、Dockerを使用した簡単な環境構築手順により、すぐにTiDBを試すことができます。