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 如下:
|
|
startup.sh 如下:
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 使用
官方文档: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 可能不连续,但不会回跳或重复,几乎完美。