この記事は 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
とかあるので、そのあたりは設定ですかね。。。またいじってみます。
恒例(?)の 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くらいだと、費用的に厳しそうです。
今回は試してませんが、シングル構成とかでも上がるんですかね。。。
とりあえず、自分の環境で遊べることがわかったので、今後も色々試してみたいと思います。
参照リンク
おまけ
TiDB Cloud では、1年無料キャンペーン(最大700万円相当)やってるそうです。
https://pingcap.co.jp/start-dash-202205/
使ってみたい気はするけど、現状の本番環境で使うのは少し難度が高いかな。。。