试试轻松启动TiDB
这篇文章是对 TiDB 的 docker-compose 实现在家里的机器上进行试验的结果。
在中文中,TiDB 是什么?
TiDB是一种分布式SQL数据库,与MySQL兼容。
可以称之为NewSQL。
虽然有一些条件限制,但可以作为MySQL兼容数据库使用,非常好。
我以前就注意到它,但是一直没有机会去碰,现在终于碰到了。
操作环境:Docker 20.10.17在Windows10的WSL2 Ubuntu 18.04上运行。
# 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时,将创建一个名为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
嗯???有点过时了吧???(这个是在八月下旬执行的)
那么,让我们试着启动吧。
首先,我试着启动它。
(刚开始,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兼容。
# 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>
哎呀,天空好空荡啊。
感觉似乎不需要它呢。。。
稍微改一下包装或其他的(后半战)。
过了一段时间(家人因为新冠病毒等(情况)大概两周)后,我决定再次尝试进行下去。
我关注到包装很旧,有点担心。
暫時先試著再拉一次。
# 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
哦!?已经到第五天了。
最新的形象似乎变得新鲜了。
这令人高兴。
TiDB/TiKV/PD 的情况看起来不错。
只是其他的有些过时了呢。。。
提思帕克
tispark 的版本是 v2.1.1。
在 Docker Hub 上看,latest 和它之前的版本中,似乎最新的是 v2.2.0。
latest 的版本有点不明确呢。。。
根据 GitHub 的发布记录,最新的似乎是 v3.0.2。
但是 Docker 镜像并没有,所以这次先保留(日后再试),先尝试使用 latest。
TiDB 视觉
这两个都是古老的docker hub和github,所以我们将保持不变。
推送网关
由于这个是为 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>
前半部分的服务器版本是 5.7.25-TiDB-v5.4.0 TiDB 服务器(Apache License 2.0),是社区版,兼容 MySQL 5.7。
后半场
服务器版本:5.7.25-TiDB-v6.1.1 TiDB服务器(Apache License 2.0)社区版,兼容MySQL 5.7
在半年时间内,版本号似乎已经从v5.4.0升级至v6.1.1。
虽然MySQL的基础版本似乎没有改变,仍然是5.7.25。
Grafana 画板
坦率地说,不知道它是否能直接更新到最新版本并运行……结果是,仪表板的位置发生了变化,但总体上还是能看得到。可能还需要进行一些设置,因为有一些“无数据”的情况。。。我再试试看。
经典的 CPU/内存配置
对于CPU来说,老实说,我用的是16个核心32个线程这样的机器,所以几乎没有怎么使用它…
至于内存,只是启动时大概使用了6-7GB左右。
还是挺用得上的,这是我的感觉。
运行时内存使用量 shí
# 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的扩展性很不错。
如果不支持自动递增,则需要仔细考虑表的设计。
此外,由于需要相当数量的服务器,所以需要一个相对较大规模的环境才能实现,对一些小型数据库来说,费用上可能会有些困难。
我没有在这次试验中尝试过,但单人模式可能会上涨吧…
总之,我已经知道可以在我的环境中玩了,所以我希望今后能试验各种不同的东西。
请参考以下链接。
-
- Pingcap
-
- github
- docker hub
给你点赞
听说 TiDB Cloud 正在进行为期一年的免费活动(价值最高700万日元)。
我觉得想要尝试使用,但在目前的生产环境中使用可能有点难度高…