我的docker随笔42:TiDB数据库部署

本文介绍 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 字符。如数据库名、表名、字段名等。

    扫描二维码关注公众号,回复: 16973213 查看本文章
  • 单个表的列数据最大限制为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

猜你喜欢

转载自blog.csdn.net/subfate/article/details/130957454