作者: foxchan 原文来源: https://tidb.net/blog/6e628afd
为什么要升级?
本次升级7.5的目的如下:
1、tidb有太多的分区表需要归档整理。7.5版本这个功能GA了。
2、之前集群tikv节点的region迁移过慢,影响tikv节点迁移的效率,现在region的迁移速度显著提升。
3、tidb分布式执行框架功能GA了,对于大表的索引创建速度有了显著提升。
升级步骤
不同于官方的升级方式,我是通过自己写k8s pod 来实现的部署。
为什么?
1、因为资源有限,我并没有另一套集群来做cdc 同步。
2、毕竟跨2个大版本,tidb的底层数据结构都进行了大的变化。
所以自己通过脚本来实现集群的升级,保证每个步骤都是可控的。当然也是相信tidb的健壮性,不会因为升级失败导致集群不可用。
升级过程
整体升级流程和tiup的流程一致:
tiflash -- pd -- tikv -- tidb -- ticdc
tiflash 滚动升级
TiDBMPP 功能打开:
第一步:关闭 TiDB MPP 功能:在 TiDB 中运行 set @@global.tidb_allow_mpp=0;滚动重启所有 TiDB 节点(因为 global 变量的设置需要在新的 session 中生效,如果不滚动重启 TiDB 的话,现有的 session 仍然会生成 MPP 计划)
第二步:正常升级集群 第三步:重新开启 TiDB MPP 功能:在 TiDB 中运行 set @@global.tidb_allow_mpp=1; 并滚动重启所有 TiDB 节点
tikv滚动升级
将需要升级的tikv leader进行驱逐,在驱逐后升级image,待状态正常后恢复leader
pd-ctl -u
http://192.168.7.25:2479 scheduler add evict-leader-scheduler 1
pd-ctl -u
http://192.168.7.25:2479 scheduler remove evict-leader-scheduler
升级带来的好处
1、tiflash cpu消耗明显减少,如图所示,cpu使用减少了一半
2、集群很稳定,如果不是追求新功能和修复bug,可以一直运行。如图,这个集群平稳度过618活动,让小伙伴们安心过节
升级遇到的问题
遇到的最大问题是代价模型的改变, 每次跨大版本升级都要注意这个
以前的SQL执行计划从tiflash改到了tikv,导致性能急剧下降,问题情况和解决方案具体可参考: https://asktug.com/t/topic/1025244/1
这里把我升级遇到的问题列出来,当然这些都已经解决了。
tiflash 7.5.1 cpu负载不均衡
原因:
tiflash 的 region 只会在 store 级别均衡,也就是每个 store 的 region 总数平均。但每个 table 在各个 store 的 region 数量不一定平均。
tidb7.5.1:部分分区健康度一直是0,drop stats 和手动analyze也不行
原因:属于bug,tidb内存更新失败,需要定期重启tidb。
tiflash 7.5.2 rename table 到其他database会崩溃
原因:属于bug,已于7.5.3修复
处理ddl假死
处理方式:
在 v6.5.0 及之后的版本中,TiDB 默认开启元数据锁特性。当集群从 v6.5.0 之前的版本升级到 v6.5.0 及之后的版本时,TiDB 会自动开启元数据锁功能。
新版本引入了 mysql.tidb_mdl_view 视图,可以用于查看当前阻塞的 DDL 的相关信息 SELECT * FROM mysql.tidb_mdl_view
从上面的输出结果中了解到,有一个 SESSION ID事务阻塞了该添加索引 DDL 的执行,通过KILL 命令中止 SESSION ID 的事务
cdc的升级
cdc从6.5才开始支持滚动升级,尤其是从6往7升级要注意,changefeed的写法也发生了改变。
每次升级cdc都要看这个文档,来确认cdc的版本兼容性。
所以你要是想通过cdc往低版本或者高版本的tidb集群同步数据,都要看这个文档哦!
https://github.com/pingcap/tiflow/blob/master/pkg/version/check.go
参数修改
每次升级都有一些参数需要修改,来匹配新版本的特性
#优化器选择优化 SET GLOBAL tidb_cost_model_version =2
#统计信息优化
SET GLOBAL tidb_enable_async_merge_global_stats='on' SET GLOBAL tidb_merge_partition_stats_concurrency=2
总结
1、如果没有特别的需求,可以使用比官方低一个版本的release。比如最新的GA是8.1,那么生产环境最高是7.5。
2、升级的版本建议是版本号第三位及以后。比如你要升级7.5,建议等到7.5.3之后再升级。