我的docker随笔42:TiDB数据库部署
本文介绍 TiDB 数据库的容器化部署。more。
本文介绍 TiDB 数据库的容器化部署。
起因
前段时间,国产化替换提上了日程,有关部门(这个真的是某部门)作为领导身份介入,因此,需启动相应的事情,但最近似乎没有什么动静。因为身份问题,只好私下做一些力所能及的事。
数据库方面,有同事已经对接上达梦,当前只是安装了达梦数据库,加了技术群,然后就没有然后了。因为一些原因,没有对此研究很深,恰好看到 TiDB,高度兼容 MySQL,在 github 上是开源的,而且是用 golang 写的,天然有好感,于是花点时间接触。
既然是国产化,操作系统也要考虑国产的,当然还是 Linux 操作系统,硬件芯片则必须是 arm64(aarch64)的。奇怪的是,在网上搜索资料, arm 平台的实践很少,docker 镜像又没有更新,即使在 arm64 平台的系统上拉取镜像,却还是 x86 架构的,或者无法运行。无奈,只能自己从头开始了。
一般地,TiDB 都是使用集群方式部署,作为起步,使用非集群方式,即将其作为 MySQL 的简单替换。
本文介绍的内容有:下载 TiDB 源码,编译,打包镜像,程序测试。
初识TiDB
本节介绍一些基础知识。
-
TiDB 项目地址:https://github.com/pingcap。文档中心:https://docs.pingcap.com/zh/tidb/stable。
-
TiDB 高度兼容 MySQL 5.7 协议、MySQL 5.7 常用的功能及语法。
-
TiDB 有2个版本,长期支持版本 (Long-Term Support Releases, LTS) 、开发里程碑版本 (Development Milestone Releases, DMR) 。前者约每六个月发布一次,后者约每两个月发布一次。
-
标识符长度最长为 64 字符。如数据库名、表名、字段名等。
-
单个表的列数据最大限制为1017,最大可调至 4096。
环境准备
由于要编译,因此需安装 docker 以及 golang。本文所用的版本如下:
# docker -v
Docker version 20.10.3, build 48d30b5
# go version
go version go1.20.2 linux/arm64
golang 环境变量配置:
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
export GOPROXY=https://goproxy.io,direct
服务端部署
下载镜像(失败)
下载官方镜像:
# docker pull pingcap/pd-arm64
Using default tag: latest
Error response from daemon: manifest for pingcap/pd-arm64:latest not found: manifest unknown: manifest unknown
注:笔者没有找到官方可用的镜像。
源码编译
下载源码,本文所用版本:tidb-server v6.5.2。下载文件为tidb-6.5.2.tar.gz
。
将压缩包上传到服务器,解压,进入工程目录,下载依赖包:
# go mod vendor
编译:
# make server
fatal: 不是一个 git 仓库(或者任何父目录):.git
...
CGO_ENABLED=1 GO111MODULE=on go build -tags codes -ldflags '-X "github.com/pingcap/tidb/parser/mysql.TiDBReleaseVersion=" -X "github.com/pingcap/tidb/util/versioninfo.TiDBBuildTS=2023-05-28 07:42:53" -X "github.com/pingcap/tidb/util/versioninfo.TiDBGitHash=" -X "github.com/pingcap/tidb/util/versioninfo.TiDBGitBranch=" -X "github.com/pingcap/tidb/util/versioninfo.TiDBEdition=Community" ' -o bin/tidb-server ./tidb-server
Build TiDB Server successfully!
注:可能为了国际化,写入的编译时间戳使用UTC时间。
tidb-server使用
编译成功后,在bin
目录下有tidb-server
,即为服务程序。可参考-h
查看使用帮助。
./bin/tidb-server -h
简单的选项,列举如下:
-P 指定端口,默认4000
-config 指定配置文件
-log-file 指定日志文件,可带目录,不存在则自动创建
-path 数据存储目录,默认为/tmp/tidb
注:配置文件可参考 https://kgithub.com/pingcap/tidb-docker-compose/blob/master/config/tidb.toml
制作镜像
主要参考官方的Dockerfile,由于是手工编译,因此直接拷贝最终的二进制文件即可,完整内容如下:
# cat Dockerfile-arm
FROM rockylinux:9-minimal
COPY tidb-server /tidb-server
WORKDIR /
EXPOSE 4000
ENTRYPOINT ["/tidb-server"]
容器启动脚本
docker-compose.yaml
文件:
# cat docker-compose.yaml
version: '3.8'
services:
tidb:
image: "arm64v8/tidb:6.5.2"
container_name: tidb
hostname: tidb
restart: always
#command: "sh ./myrun-arm.sh"
command:
- --config=/tidb.toml
- --log-file=/logs/tidb.log
volumes:
- ./config/tidb.toml:/tidb.toml:ro
- ./logs:/logs
- ./tidb_data:/data/tidb
- /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static
environment:
- AA=aa
ports:
- "4000:4000"
- "10080:10080"
networks:
- my-net
networks:
my-net:
name: "my-tidb"
driver: bridge
文件说明:
- 使用
command
指定程序启动的选项, - 将配置文件、日志目录、数据目录挂载到宿主机。
- 由于在一台x86服务上测试,因为挂载了
qemu-aarch64-static
程序。 - 导出2个端口,目前只使用4000。
启动:
docker-compose up -d
客户端使用
客户端使用mysql命令行、Navicat等图形化工具,可以正常连接、使用。
Mysql测试
启动容器。
也可以直接运行数据库服务程序,作为测试,可不加参数,如下:
./bin/tidb-server
创建用户及修改root密码
默认情况下,tidb
没有设置密码,可连接数据库自行添加,示例:
mysql -h 127.0.0.1 -P 4000
use mysql;
# 创建latelee用户
CREATE USER 'latelee'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'latelee'@'%' WITH GRANT OPTION;
# 修改root密码
ALTER USER 'root' IDENTIFIED BY '123456';
小结
限于能力,本文仅将tidb
作为普通的数据库程序使用,而像集群,可能要到后续才能研究,因为当务之急是替换掉mysql
。
mysql容器启动时,可以指定账号信息,也可指定初始化mysql脚本。后续有时间参考官方文档,将该机制迁移到tidb中。
附
出错处理
本节列出一些错误信息记录。
TiDB 没有完全支持 mysql 数据库的所有字符集,测试发现如下错误:
ERROR 1115 (42000) at line 227 in file: 'mysql/sql/mytest.sql': Unknown character set: 'utf8mb3'
ERROR 1146 (42S02) at line 245 in file: 'mysql/sql/mytest.sql': Table 'testdb.userinfo' doesn't exist
解决方法:
将 utf8mb3 改为 utf8mb4,utf8mb3_general_ci 改为 utf8mb4_general_ci
更多推荐
所有评论(0)