Docker 运行 Tidb

Docker 运行 Tidb

tidb 兼容 mysql,但在自增 id 上,和单机的 mysql 有所不同,单机的 mysql id 是自增且不会跳跃的,而多写主的 mysql 集群上,id 和 tidb 一样,可能会跳跃。这里介绍使用 docker 搭建 tidb 本地测试集群,并简单介绍 SEQUENCE 和 自增 id

根据官方文档:https://docs.pingcap.com/zh/tidb/stable/tiup-playground/ 可使用 tiup 来搭建本地测试集群,而这里我将介绍在 docker 里使用 tiup 来搭建 tidb

Dockfile 如下:

1
2
3
4
5
6
7
8
9
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
ENV TIDB_VERSION=v8.5.1
RUN  curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh && ln -s /root/.tiup/bin/tiup /bin/tiup
RUN tiup install tidb:${TIDB_VERSION} pd:${TIDB_VERSION} tikv:${TIDB_VERSION} playground
RUN tiup install tiproxy:v1.3.0 prometheus:${TIDB_VERSION}
RUN tiup install grafana:${TIDB_VERSION}
COPY . /opt
CMD /bin/bash /opt/startup.sh

startup.sh 如下:

1
2
tiup playground ${TIDB_VERSION} --tag default --host 0.0.0.0 \
--db 3 --pd 3 --kv 3 --tiproxy 1 --db.config /opt/tidb.toml --tiflash 0

tidb.toml 如下

graceful-wait-before-shutdown=15

tidb.toml、startup.sh 以及 Dockerfile 需要放在同一个目录下,且不要有其他文件。

通过:docker build -t tidb . 来构建镜像,然后通过:
docker run --name tidb -p 16000:6000 -p 12382:2382 -p 13000:3000 -itd tidb 来运行。

控台地址是:http://localhost:12382/dashboard/ 用户名为 root,密码为空,可考虑自行修改下。

连接时,连接 localhost:16000 即可,docker 里 6000 为 tiproxy 的地址。

tidb sequence 使用

1
2
3
4
5
6
CREATE SEQUENCE seq2 start 3 increment 2 minvalue 1 maxvalue 10 cache 3;
CREATE SEQUENCE seq3 start 1024 increment 1 cache 100;
SELECT nextval(seq2);
SELECT lastval(seq2);
SELECT setval(seq2, 10);
drop SEQUENCE seq2

官方文档:https://docs.pingcap.com/zh/tidb/stable/sequence-functions/ 主要方法有:nextval、lastval、setval,需要注意的是,lastval 是会话级别的,暂时没看到类似 current val 的函数。

sequence 可用于自增 id,另外,也可以使用 mysql 兼容模式的自增 id 方案

tidb mysql 兼容模式的自增 id

根据官方文档: mysql-兼容模式

从 v6.4.0 开始,TiDB 实现了中心化分配自增 ID 的服务,可以支持 TiDB 实例不缓存数据,而是每次请求都访问中心化服务获取 ID。

当前中心化分配服务内置在 TiDB 进程,类似于 DDL Owner 的工作模式。有一个 TiDB 实例将充当“主”的角色提供 ID 分配服务,而其它的 TiDB 实例将充当“备”角色。

当“主”节点发生故障时,会自动进行“主备切换”,从而保证中心化服务的高可用。MySQL 兼容模式的使用方式是,建表时将 AUTO_ID_CACHE 设置为 1。

⚠️

TiDB 各个版本中,AUTO_ID_CACHE 设置为 1 都表明 TiDB 不再缓存 ID,但不同版本的实现方式不一样:

对于 TiDB v6.4.0 之前的版本,由于每次分配 ID 都需要通过一个 TiKV 事务完成 AUTO_INCREMENT 值的持久化修改,因此设置 AUTO_ID_CACHE 为 1 会出现性能下降。

对于 v6.4.0 及以上版本,由于引入了中心化的分配服务,AUTO_INCREMENT 值的修改只是在 TiDB 服务进程中的一个内存操作,相较于之前版本更快。

将 AUTO_ID_CACHE 设置为 0 表示 TiDB 使用默认的缓存大小 30000。

使用 MySQL 兼容模式后,能保证 ID 唯一、单调递增,行为几乎跟 MySQL 完全一致。即使跨 TiDB 实例访问,ID 也不会出现回退。只有在中心化分配自增 ID 服务的“主” TiDB 实例进程退出(如该 TiDB 节点重启)或者异常崩溃时,才有可能造成部分 ID 不连续。

经测试发现,mysql 兼容模式下,如有节点宕机,自增 id 可能不连续,但不会回跳或重复,几乎完美。

最后更新于