目次
こんにちは、新井です。
直近の案件で TiDB を使用する可能性があり、どんな特徴の DB なのかざっくり調べてみました。
また mac 上でも簡単に動かしてみました。
TiDB とは
TiDB は NewSQL に対応した MySQL 互換なハイブリットトランザクション / 分析処理(HTAP)ワークロードをサポートする分散 SQL データベースです。
NewSQL とは
リレーショナルデータベースのように SQL やトランザクションなどの機能を持ち、スケールアウト性も持ち合わせたデータベースを指します。
特徴として Reader だけではなく、Writer もスケールさせることができ、書き込みのスループットをあげることができます。
Google Spanner や CockroachDB などが有名です。
ハイブリットトランザクション / 分析処理(HTAP)とは
OLTP(オンライントランザクション処理)と OLAP(オンライン分析処理)の両方のワークロードを同時に処理できるハイブリッドデータベースのことです。
一般的に MySQL、PostgreSQL、SQL Server のようなリレーショナルデータベースは OLTP に優れたデータベースに分類されます。トランザクションを使用し、行単位での更新や削除処理を得意とする一方で、集計やソートなどは不得意です。
このような集計やソートなど OLAP に向いているのは BigQuery や Apache Cassandra などの列指向データベースです。
TiDB では RDB のような OLTP によるデータ更新や削除と、OLAP による集計やソートなどのデータ分析の両方を行えるデータベースになっています。
また TiDB は NewSQL と呼ばれるデータベースに分類されます。
TiDB のアーキテクチャ
コンポーネント
- TiDB server
TiDB server は SQL パースや最適化、接続エンドポイントの公開を行っているサーバです。 - Placement Driver(PD) server
クラスタ全体のメタデータを管理するサーバです。クラスタ内の TiKV ノード数やストレージの空き容量などクラスタ管理上重要なデータを保持しており、ダッシュボードもこのサーバ上で動作しています。 - Storage servers
- TiKV server
データを保存する分散キーバリューストアです。 - TiFlash server
データを列指向で保存し、主に分析処理に利用されるサーバです。
これがあることで OLAP も高速に実行できるようになっています。
- TiKV server
実際に Mac 上で動かしてみる
スペック
❯ sw_vers
ProductName: macOS
ProductVersion: 14.7
❯ sysctl machdep.cpu.brand_string
machdep.cpu.brand_string: Apple M2
1. セットアップ
TiUP をインストールする
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
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/{ユーザ名}/.tiup/bin/tiup
===============================================
Have a try: tiup playground
===============================================
shell を読み込む
source ~/.zshrc
2. クラスタを起動してみる
起動させる
tiup playground
❯ tiup playground
A new version of playground is available: -> v1.16.0
To update this component: tiup update playground
To update all components: tiup update --all
The component `playground` version is not installed; downloading from repository.
download https://tiup-mirrors.pingcap.com/playground-v1.16.0-darwin-arm64.tar.gz 8.11 MiB / 8.11 MiB 100.00% ? MiB/s
Note: Version constraint is resolved to v8.3.0. If you'd like to use other versions:
Use exact version: tiup playground v7.1.0
Use version range: tiup playground ^5
Use nightly: tiup playground nightly
Start pd instance:v8.3.0
The component `pd` version v8.3.0 is not installed; downloading from repository.
download https://tiup-mirrors.pingcap.com/pd-v8.3.0-darwin-arm64.tar.gz 47.90 MiB / 47.90 MiB 100.00% 122.61 MiB/s
Start tikv instance:v8.3.0
The component `tikv` version v8.3.0 is not installed; downloading from repository.
download https://tiup-mirrors.pingcap.com/tikv-v8.3.0-darwin-arm64.tar.gz 41.75 MiB / 41.75 MiB 100.00% 136.10 MiB/s
Start tidb instance:v8.3.0
The component `tidb` version v8.3.0 is not installed; downloading from repository.
download https://tiup-mirrors.pingcap.com/tidb-v8.3.0-darwin-arm64.tar.gz 76.68 MiB / 76.68 MiB 100.00% 107.21 MiB/s
Waiting for tidb instances ready
127.0.0.1:4000 ... Done
The component `prometheus` version v8.3.0 is not installed; downloading from repository.
download https://tiup-mirrors.pingcap.com/prometheus-v8.3.0-darwin-arm64.tar.gz 118.75 MiB / 118.75 MiB 100.00% 99.08 MiB/s
download https://tiup-mirrors.pingcap.com/grafana-v8.3.0-darwin-arm64.tar.gz 59.93 MiB / 59.93 MiB 100.00% 118.32 MiB/s
Start tiflash instance:v8.3.0
The component `tiflash` version v8.3.0 is not installed; downloading from repository.
download https://tiup-mirrors.pingcap.com/tiflash-v8.3.0-darwin-arm64.tar.gz 76.56 MiB / 76.56 MiB 100.00% 104.53 MiB/s
Waiting for tiflash instances ready
127.0.0.1:3930 ... Done
🎉 TiDB Playground Cluster is started, enjoy!
Connect TiDB: mysql --comments --host 127.0.0.1 --port 4000 -u root
TiDB Dashboard: http://127.0.0.1:2379/dashboard
Grafana: http://127.0.0.1:3000
pd, tikv, tidb, prometheus, grafana, tiflash のバイナリが download されました。
専用の dashboard や grafana も起動してすぐ閲覧できます。
TiDB Dashboard 画面
grafana 画面
3. mysql client でアクセスしてクエリを叩いてみる
mysql client を install する
brew install mysql-client
TiDB へアクセスする
mysql --comments --host 127.0.0.1 --port 4000 -u root
DB 作成する
CREATE DATABASE test_db;
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| INFORMATION_SCHEMA |
| METRICS_SCHEMA |
| PERFORMANCE_SCHEMA |
| mysql |
| sys |
| test |
| test_db |
+--------------------+
7 rows in set (0.00 sec)
Table 作成する
USE test_db;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100)
);
mysql> SHOW TABLES;
+-------------------+
| Tables_in_test_db |
+-------------------+
| users |
+-------------------+
1 row in set (0.00 sec)
データ 追加する
INSERT INTO users (first_name, last_name, email)
VALUES
('john', 'Doe', 'john.Doe@example.com'),
('Jane', 'Johnson', 'jane.Johnson@example.com'),
('Robert', 'Smith', 'robert.smith@example.com');
データ 取得
SELECT * FROM users;
+----+------------+-----------+--------------------------+
| id | first_name | last_name | email |
+----+------------+-----------+--------------------------+
| 1 | john | Doe | john.Doe@example.com |
| 2 | Jane | Johnson | jane.Johnson@example.com |
| 3 | Robert | Smith | robert.smith@example.com |
+----+------------+-----------+--------------------------+
3 rows in set (0.00 sec)
EXPLAIN 実行する
mysql> EXPLAIN SELECT * FROM users;
+-----------------------+---------+-----------+---------------+--------------------------------+
| id | estRows | task | access object | operator info |
+-----------------------+---------+-----------+---------------+--------------------------------+
| TableReader_5 | 3.00 | root | | data:TableFullScan_4 |
| └─TableFullScan_4 | 3.00 | cop[tikv] | table:users | keep order:false, stats:pseudo |
+-----------------------+---------+-----------+---------------+--------------------------------+
2 rows in set (0.00 sec)
4. クラスタをスケールアウトしてみる
現状、それぞれのコンポーネントが1台ずつ起動している
TiDB server をスケールアウトして2台追加してみる
❯ tiup playground scale-out --db 2
To connect new added TiDB: mysql --comments --host 127.0.0.1 --port 58588 -u root -p (no password)
To connect new added TiDB: mysql --comments --host 127.0.0.1 --port 58611 -u root -p (no password)
bashboard で確認すると2台追加されている
次は TiKV も2台追加してみる
❯ tiup playground scale-out --kv 2
TiKV もスケールアウトし2台追加されました
5. クラスタをスケールインしてみる
まずはスケールインするインスタンスのプロセス ID を確認する
❯ tiup playground display
Pid Role Uptime
--- ---- ------
79048 pd 1h9m58.2484515s
79049 tikv 1h9m58.233007791s
81427 tikv 31m28.505631958s
81428 tikv 31m28.493725s
79050 tidb 1h9m58.21935775s
80680 tidb 42m47.360035292s
80681 tidb 42m44.33974025s
79058 tiflash 1h9m49.716907125s
80680の TiDB server をスケールインする
❯ tiup playground scale-in --pid 80680
scale in tidb success
減りましたね
81428の TiKV もスケールインしてみます
❯ tiup playground scale-in --pid 81428
tikv will be stop when tombstone
TiKV はデータを持っているため、すぐ削除はしてくれないようですね
このあたりは別のオペレーションが必要そうです
まとめ
ざっくり Mac 上で TiUP コマンドを使って TiDB を動かしてみました。tiup playground 自体はローカルでの開発やテスト用のクラスタを作成するのに便利なコマンドです。TiDB server や TiKV 以外にも Placement Server や TiFlash もスケールさせることができます。
TiDB Cloud もありますが、まずはローカル環境で実行させてみて最低限の TiDB の仕組みから理解するのが良さそうですね。
今後も TiDB の機能について調べてみたいと思います。