TiDB をお手軽に立ち上げてみる

この記事は TiDB の docker-compose 実装が自宅マシンで動くかどうかお試ししてみたものです。

# TiDB とは何ぞや

TiDB は、MySQL 互換の分散SQLデータベースです。
所謂 NewSQL というやつ。
いくつか条件はあるけれど、MySQL互換として使えるのはいいですよね。

以前から気にはなっていたけど、なかなか触る機会がなくて、ようやっと触った感じです。

実行環境：Windows10 WSL2 Ubuntu 18.04 上の Docker 20.10.17

```
# docker version
Client: Docker Engine - Community
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:02:57 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.11
  Git commit:       a89b842
  Built:            Mon Jun  6 23:01:03 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.7
  GitCommit:        0197261a30bf81f1ee8e6a4dd2dea0ef95d67ccb
 runc:
  Version:          1.1.3
  GitCommit:        v1.1.3-0-g6724737
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```

## 何はともあれ、立ち上げてみます（前半戦）

github に docker-compose で立ち上げられるやつがあるので、拾ってきてさっそくやってみましょう。

### とりあえず git clone

github から docker-compose のソースを落としてきます。

```
# git clone https://github.com/pingcap/tidb-docker-compose.git
```

### イメージを落としてみましょう

git clone したら、 `tidb-docker-compose` というディレクトリが作成されてるので、cd します。

```
# cd tidb-docker-compose
```

そして、イメージをダウンロードしてきます。

```
# docker-compose pull
Pulling pd0            ... done
Pulling pd1            ... done
Pulling pd2            ... done
Pulling tikv0          ... done
Pulling tikv1          ... done
Pulling tikv2          ... done
Pulling tidb           ... done
Pulling tispark-master ... done
Pulling tispark-slave0 ... done
Pulling tidb-vision    ... done
Pulling pushgateway    ... done
Pulling prometheus     ... done
Pulling grafana        ... done
```

どんなイメージかな？っと

```
# docker images
REPOSITORY            TAG       IMAGE ID       CREATED        SIZE
pingcap/tikv          latest    3f22685fea0b   6 months ago   385MB
pingcap/pd            latest    3a909fabddbb   6 months ago   164MB
pingcap/tidb          latest    f8f39dfba115   6 months ago   165MB
pingcap/tispark       v2.1.1    501543755826   3 years ago    894MB
grafana/grafana       6.0.1     ffd9c905f698   3 years ago    241MB
pingcap/tidb-vision   latest    e9b25d9f7bdb   4 years ago    47.6MB
prom/prometheus       v2.2.1    cc866859f8df   4 years ago    113MB
prom/pushgateway      v0.3.1    434efa6ed9db   5 years ago    13.3MB
```

ん？？？ちょっと古くない？？？（これを実行したのは、8月後半）

### まぁ、立ち上げてみよう

とりあえず、立ち上げてみます。
（最初、prometheus と grafana が起動しませんでしたが、恐らくポートが使用されてただけなので、そこは割愛）

```
# docker-compose up -d
Creating network "tidb-docker-compose_default" with the default driver
Creating tidb-docker-compose_tidb-vision_1 ... done
Creating tidb-docker-compose_pd2_1         ... done
Creating tidb-docker-compose_pd0_1         ... done
Creating tidb-docker-compose_prometheus_1  ... done
Creating tidb-docker-compose_pushgateway_1 ... done
Creating tidb-docker-compose_pd1_1         ... done
Creating tidb-docker-compose_grafana_1     ... done
Creating tidb-docker-compose_tikv1_1       ... done
Creating tidb-docker-compose_tikv0_1       ... done
Creating tidb-docker-compose_tikv2_1       ... done
Creating tidb-docker-compose_tidb_1           ... done
Creating tidb-docker-compose_tispark-master_1 ... done
Creating tidb-docker-compose_tispark-slave0_1 ... done
```

お、起動

### ログインしてみる

mysql 互換ということで、mysql client でログインできます。

```
# mysql -h 127.0.0.1 -P 4000 -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.25-TiDB-v5.4.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

ポート番号は 4000（MySQLは3306）ですが、ログインした感じはどこかで見た風景です。

### 初期データベースはっと

初期データベースがどんな感じか見てみます。

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| INFORMATION_SCHEMA |
| METRICS_SCHEMA     |
| PERFORMANCE_SCHEMA |
| mysql              |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql>
```

おや、意外にありますね。
test って `mysql_secure_installation` だと削除するやつですよね。

```
mysql> use test
mysql> show tables;
Empty set (0.00 sec)

mysql>
```

あら、空ですやん。
なくてもよい気がしますね。。。

## 少し、パッケージとか新しくしてみる（後半戦）

ちょっと日が経って（家族がコロナとかで 2week くらい）、再度続きをチャレンジしました。
パッケージが古いのが気になったのです。

### とりあえず、もう一回 pull してみる。

```
# docker-compose pull
Pulling pd0            ... done
Pulling pd1            ... done
Pulling pd2            ... done
Pulling tikv0          ... done
Pulling tikv1          ... done
Pulling tikv2          ... done
Pulling tidb           ... done
Pulling tispark-master ... done
Pulling tispark-slave0 ... done
Pulling tidb-vision    ... done
Pulling pushgateway    ... done
Pulling prometheus     ... done
Pulling grafana        ... done
# docker images
REPOSITORY            TAG       IMAGE ID       CREATED       SIZE
pingcap/tidb          latest    44a49c4dfd5e   5 days ago    168MB
pingcap/tikv          latest    9b5b18ab74cb   5 days ago    441MB
pingcap/pd            latest    98ed991086c7   5 days ago    150MB
pingcap/tispark       v2.1.1    501543755826   3 years ago   894MB
grafana/grafana       6.0.1     ffd9c905f698   3 years ago   241MB
pingcap/tidb-vision   latest    e9b25d9f7bdb   4 years ago   47.6MB
prom/prometheus       v2.2.1    cc866859f8df   4 years ago   113MB
prom/pushgateway      v0.3.1    434efa6ed9db   5 years ago   13.3MB
```

お！？ 5days になっとる。
latest のイメージが新しくなったようですね。
これはうれしい。

tidb/tikv/pd についてはいい感じになりました。
ただ、他がちょっと古いですよね。。。

### tispark

tispark は、v2.1.1 が指定されてます。
docker hub で見ると、latest とその前で一番新しそうなのが、v2.2.0 ぽいですね。
latest のバージョンがいまいち不明ですね。。。
github のリリースを見ると、v3.0.2 が最新ぽいですね。
ただ、docker のイメージはないので、今回は保留（後日試してみます）にして、latest で試します。

### tidb-vison

これは、docker hub も github も古いままなので、そのままにします。

### pushgateway

prometheus 用のやつなので、がっつり最新版にしちゃいましょう。

### prometheus

これも、最新版に。

### grafana

これも、最新版に。

### さて、どうなった？

`docker-compose.yml` はこんな感じになりました。

```
version: '2.1'

services:
  pd0:
    image: pingcap/pd:latest
    ports:
      - "2379"
    volumes:
      - ./config/pd.toml:/pd.toml:ro
      - ./data:/data
      - ./logs:/logs
    command:
      - --name=pd0
      - --client-urls=http://0.0.0.0:2379
      - --peer-urls=http://0.0.0.0:2380
      - --advertise-client-urls=http://pd0:2379
      - --advertise-peer-urls=http://pd0:2380
      - --initial-cluster=pd0=http://pd0:2380,pd1=http://pd1:2380,pd2=http://pd2:2380
      - --data-dir=/data/pd0
      - --config=/pd.toml
      - --log-file=/logs/pd0.log
    restart: on-failure
  pd1:
    image: pingcap/pd:latest
    ports:
      - "2379"
    volumes:
      - ./config/pd.toml:/pd.toml:ro
      - ./data:/data
      - ./logs:/logs
    command:
      - --name=pd1
      - --client-urls=http://0.0.0.0:2379
      - --peer-urls=http://0.0.0.0:2380
      - --advertise-client-urls=http://pd1:2379
      - --advertise-peer-urls=http://pd1:2380
      - --initial-cluster=pd0=http://pd0:2380,pd1=http://pd1:2380,pd2=http://pd2:2380
      - --data-dir=/data/pd1
      - --config=/pd.toml
      - --log-file=/logs/pd1.log
    restart: on-failure
  pd2:
    image: pingcap/pd:latest
    ports:
      - "2379"
    volumes:
      - ./config/pd.toml:/pd.toml:ro
      - ./data:/data
      - ./logs:/logs
    command:
      - --name=pd2
      - --client-urls=http://0.0.0.0:2379
      - --peer-urls=http://0.0.0.0:2380
      - --advertise-client-urls=http://pd2:2379
      - --advertise-peer-urls=http://pd2:2380
      - --initial-cluster=pd0=http://pd0:2380,pd1=http://pd1:2380,pd2=http://pd2:2380
      - --data-dir=/data/pd2
      - --config=/pd.toml
      - --log-file=/logs/pd2.log
    restart: on-failure
  tikv0:
    image: pingcap/tikv:latest
    volumes:
      - ./config/tikv.toml:/tikv.toml:ro
      - ./data:/data
      - ./logs:/logs
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=tikv0:20160
      - --data-dir=/data/tikv0
      - --pd=pd0:2379,pd1:2379,pd2:2379
      - --config=/tikv.toml
      - --log-file=/logs/tikv0.log
    depends_on:
      - "pd0"
      - "pd1"
      - "pd2"
    restart: on-failure
  tikv1:
    image: pingcap/tikv:latest
    volumes:
      - ./config/tikv.toml:/tikv.toml:ro
      - ./data:/data
      - ./logs:/logs
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=tikv1:20160
      - --data-dir=/data/tikv1
      - --pd=pd0:2379,pd1:2379,pd2:2379
      - --config=/tikv.toml
      - --log-file=/logs/tikv1.log
    depends_on:
      - "pd0"
      - "pd1"
      - "pd2"
    restart: on-failure
  tikv2:
    image: pingcap/tikv:latest
    volumes:
      - ./config/tikv.toml:/tikv.toml:ro
      - ./data:/data
      - ./logs:/logs
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=tikv2:20160
      - --data-dir=/data/tikv2
      - --pd=pd0:2379,pd1:2379,pd2:2379
      - --config=/tikv.toml
      - --log-file=/logs/tikv2.log
    depends_on:
      - "pd0"
      - "pd1"
      - "pd2"
    restart: on-failure

  tidb:
    image: pingcap/tidb:latest
    ports:
      - "4000:4000"
      - "10080:10080"
    volumes:
      - ./config/tidb.toml:/tidb.toml:ro
      - ./logs:/logs
    command:
      - --store=tikv
      - --path=pd0:2379,pd1:2379,pd2:2379
      - --config=/tidb.toml
      - --log-file=/logs/tidb.log
      - --advertise-address=tidb
    depends_on:
      - "tikv0"
      - "tikv1"
      - "tikv2"
    restart: on-failure
  tispark-master:
    image: pingcap/tispark:latest
    command:
      - /opt/spark/sbin/start-master.sh
    volumes:
      - ./config/spark-defaults.conf:/opt/spark/conf/spark-defaults.conf:ro
    environment:
      SPARK_MASTER_PORT: 7077
      SPARK_MASTER_WEBUI_PORT: 8080
    ports:
      - "7077:7077"
      - "8080:8080"
    depends_on:
      - "tikv0"
      - "tikv1"
      - "tikv2"
    restart: on-failure
  tispark-slave0:
    image: pingcap/tispark:latest
    command:
      - /opt/spark/sbin/start-slave.sh
      - spark://tispark-master:7077
    volumes:
      - ./config/spark-defaults.conf:/opt/spark/conf/spark-defaults.conf:ro
    environment:
      SPARK_WORKER_WEBUI_PORT: 38081
    ports:
      - "38081:38081"
    depends_on:
      - tispark-master
    restart: on-failure

  tidb-vision:
    image: pingcap/tidb-vision:latest
    environment:
      PD_ENDPOINT: pd0:2379
    ports:
      - "8010:8010"
    restart: on-failure

  # monitors
  pushgateway:
    image: prom/pushgateway:latest
    command:
      - --log.level=error
    restart: on-failure
  prometheus:
    user: root
    image: prom/prometheus:latest
    command:
      - --log.level=error
      - --storage.tsdb.path=/data/prometheus
      - --config.file=/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
    volumes:
      - ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./config/pd.rules.yml:/etc/prometheus/pd.rules.yml:ro
      - ./config/tikv.rules.yml:/etc/prometheus/tikv.rules.yml:ro
      - ./config/tidb.rules.yml:/etc/prometheus/tidb.rules.yml:ro
      - ./data:/data
    restart: on-failure
  grafana:
    image: grafana/grafana:latest
    user: "0"
    environment:
      GF_LOG_LEVEL: error
      GF_PATHS_PROVISIONING: /etc/grafana/provisioning
      GF_PATHS_CONFIG: /etc/grafana/grafana.ini
    volumes:
      - ./config/grafana:/etc/grafana
      - ./config/dashboards:/tmp/dashboards
      - ./data/grafana:/var/lib/grafana
    ports:
      - "3000:3000"
    restart: on-failure
```

### それでは上げてみましょう

とりあえず、やってみます。

```
# docker-compose up -d
Creating network "tidb-docker-compose_default" with the default driver
Creating tidb-docker-compose_tidb-vision_1 ... done
Creating tidb-docker-compose_pd2_1         ... done
Creating tidb-docker-compose_pd0_1         ... done
Creating tidb-docker-compose_prometheus_1  ... done
Creating tidb-docker-compose_pushgateway_1 ... done
Creating tidb-docker-compose_pd1_1         ... done
Creating tidb-docker-compose_grafana_1     ... done
Creating tidb-docker-compose_tikv1_1       ... done
Creating tidb-docker-compose_tikv0_1       ... done
Creating tidb-docker-compose_tikv2_1       ... done
Creating tidb-docker-compose_tidb_1           ... done
Creating tidb-docker-compose_tispark-master_1 ... done
Creating tidb-docker-compose_tispark-slave0_1 ... done
```

お、問題なく上がりましたね。

```
# mysql -h 127.0.0.1 -P 4000 -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 405
Server version: 5.7.25-TiDB-v6.1.1 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

前半戦
`Server version: 5.7.25-TiDB-v5.4.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible`

後半戦
`Server version: 5.7.25-TiDB-v6.1.1 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible`

半年で、v5.4.0 -> v6.1.1 になったようですね。
ベースの MySQL は 5.7.25 から変わってないようですが。

### grafana

正直、そのまま最新版にして動くかどうかは謎でしたが。。。
結果、ダッシュボードの位置とかは変わってしまいましたが、何とかみられる感じにはなってました。
いくつか、`No data` とかあるので、そのあたりは設定ですかね。。。またいじってみます。

![TiDB_grafana.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318450/5c5805b1-ce21-16ad-aa8a-f3a1c9195682.png)

### 恒例（？）の CPU/メモリ

CPU については、正直 16 cores 32 threads とかのマシンでやってるので、ほとんど使ってないですね。。。
メモリですが、立ち上げただけで、6-7GBくらい使う感じです。
やはり、それなりに使うんだなぁ、という感じですね。

実行時メモリ使用量
```
# free
              total        used        free      shared  buff/cache   available
Mem:       52586960     7639116    40980164         976     3967680    44345156
Swap:      13631488           0    13631488
```

docker-compose down 後
```
# free
              total        used        free      shared  buff/cache   available
Mem:       52586960      451400    48173088          92     3962472    51536412
Swap:      13631488           0    13631488
```


## まとめ

TiDB スケールが楽そうというのは、いいんじゃないかと思います。
Auto increment に対応してないとかは、テーブル設計ちゃんと考えないとですね。
後は、サーバが結構な台数必要になるので、そこそこ大規模な環境じゃないと難しい感じですかね。
ちょっとしたDBくらいだと、費用的に厳しそうです。

今回は試してませんが、シングル構成とかでも上がるんですかね。。。
とりあえず、自分の環境で遊べることがわかったので、今後も色々試してみたいと思います。

## 参照リンク

- [Pingcap](https://pingcap.co.jp/)
- [github](https://github.com/pingcap)
- [docker hub](https://hub.docker.com/u/pingcap)

## おまけ

TiDB Cloud では、１年無料キャンペーン（最大700万円相当）やってるそうです。
https://pingcap.co.jp/start-dash-202205/

使ってみたい気はするけど、現状の本番環境で使うのは少し難度が高いかな。。。