一、需求背景
客户单位收到上级单位通知,需要将应用程序使用的 mysql 数据库切换为信创认证的国产数据库,因此项目组需要对mysql数据库切换为国产数据库进行技术可行性分析。
按信创名单排查后,决定先使用 PingCAP 公司旗下的 TiDB 进行技术分析,原因是 TiDB 数据库几乎完全兼容 mysql 数据库。
问题汇总(持续更新) | 子项 | 处理办法 |
---|---|---|
机器/服务器 | CPU架构,关联使用 Tiflash 组件(涉及join性能) | 老机器部署 v6.2 版本以下的 TiDB |
mysql兼容性 | 外键,不兼容外键 | 去掉mysql外键(这个的确没啥用) |
mysql兼容性 | 字符集,不兼容部分字符集,如 utf8_danish_ci | 修改 utf8_danish_ci 字符集 |
mysql兼容性 | 主键控制,要求每张表都要有主键 | 增加主键控制 |
mysql兼容性 | UNION ALL语法报错,原因为字段设置为bit类型 | 修改字段类型为char |
mysql兼容性 | 语法强校验;group by column desc; mysql不会报错,但TiDB报错 | 修正语法 |
mysql兼容性 | 不支持分组合计 with rollup 语法 | X |
mysql兼容性 | 不支持存储过程、函数、触发器 | X |
从上面来看,TiDB还是做得非常好,规避一些mysql人为造成的不规范行为。
二、单机上丝滑部署TiDB生产集群
1、下载并安装 TiUP(工具):
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
2、声明全局环境变量(任何地方都可以用TiUP工具):
# 修改为 Shell profile 文件的实际位置,在上面安装Tiup工具时已经告知
source ${your_shell_profile}
source /root/.bash_profile
3、开始安装(TiDB集群) 配置环境:
tiup playground 是快速而临时的搭建方案(不推荐),生产环境不能这样使用,需要配置一份 topology.yaml 文件,去描述集群内容、端口、数据存储地址。
做到优雅、丝滑的启动集群、停止集群、重启集群、监测集群。
3.1、安装与更新cluster
tiup cluster;
tiup update --self && tiup update cluster;
3.2、创建标准的目录结构:
# 标准的目录结构,有助于规范部署行为、便于后期运维
cd home;
mkdir TiDB;
cd TiDB;
mkdir tidb-deploy;
mkdir tidb-data;
vim topo.yaml;
3.3、topo.yaml 模板文件如下(1个tidb库、3个tikv存储):
10.10.26.233 机器网卡IP,用于后续其他机器、程序或者navicat客户端链接使用。
# 注意下述的存储路径,端口不能被其他程序占用(可以替换端口)
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/home/TiDB/tidb-deploy"
data_dir: "/home/TiDB/tidb-data"
monitored:
node_exporter_port: 9100
blackbox_exporter_port: 9115
server_configs:
tidb:
instance.tidb_slow_log_threshold: 300
tikv:
readpool.storage.use-unified-pool: false
readpool.coprocessor.use-unified-pool: true
pd:
replication.enable-placement-rules: true
replication.location-labels: ["host"]
tiflash:
logger.level: "info"
pd_servers:
- host: 10.10.26.233
tidb_servers:
- host: 10.10.26.233
tikv_servers:
- host: 10.10.26.233
port: 20160
status_port: 20180
config:
server.labels: { host: "logic-host-1" }
- host: 10.10.26.233
port: 20161
status_port: 20181
config:
server.labels: { host: "logic-host-2" }
- host: 10.10.26.233
port: 20162
status_port: 20182
config:
server.labels: { host: "logic-host-3" }
tiflash_servers:
- host: 10.10.26.233
monitoring_servers:
- host: 10.10.26.233
grafana_servers:
- host: 10.10.26.233
3.4、部署集群
tiup list tidb 命令可查看版本
# 执行命令后要求输入当前ssh的root账号密码,等待几分钟部署完成
tiup cluster deploy tidb v6.1.6 /home/TiDB/topo.yaml --user root -p
坑点:TiDB从 6.2 版本开始,tiflash 对向量化引擎做了优化,但是对 CPU架构也有了一定要求,需要支持avx2。
报错如下:failed to start: 10.10.26.233 tiflash-9000.service, please check the instance’s log(/home/TiDB/tidb-deploy/tiflash-9000/log) for more detail.: timed out waiting for port 3930 to be started after 2m0s
因此:老机器/服务器的CPU可能导致 tiflash 部署失败;而tiflash 为复杂join查询和并行计算提供了优化,同时使用事务和分析查询的话还是必须要安装tiflash,所以我这里采用的是 v6.1.6版本
4、启动集群
# 启动集群
tiup cluster start tidb
#查看集群列表
tiup cluster list
#查看集群的拓扑结构和状态
tiup cluster display tidb
#关闭集群
tiup cluster stop tidb
5、连接TiDB数据库:
# 可以用如下两个命令连接TIDB数据库
tiup client
mysql --host 127.0.0.1 --port 4000 -u root
5.1、设置数据库密码:
# 如同mysql一样,设置root账号的密码(外部navicat就能链接上了)
mysql --host 10.10.26.233 --port 4001 -u root;
use mysql;
update user set authentication_string=password("cdqcp01.com") where user="root";
flush privileges;
5.2、查看数据库监控:
TiDB自带数据库监控
TiDB Dashboard: http://10.10.26.233:2379/dashboard (账号和密码为数据库账号密码)
Grafana: http://10.10.26.233:3000 (默认admin/admin,进入后需要修改密码)
6、删除安装和数据:
危险命令
# 销毁集群
tiup cluster destroy tidb;
# Yes, I know my cluster and data will be deleted.
# 清除所有的 TIUP部署和数据
tiup clean --all