试试轻松启动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 画板

坦率地说,不知道它是否能直接更新到最新版本并运行……结果是,仪表板的位置发生了变化,但总体上还是能看得到。可能还需要进行一些设置,因为有一些“无数据”的情况。。。我再试试看。

TiDB_grafana.png

经典的 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万日元)。

我觉得想要尝试使用,但在目前的生产环境中使用可能有点难度高…