杭州百腾教育科技 TiDB 6.5 to 7.5 升级记录

news/2024/9/23 18:32:51/

作者: reAsOn2010 原文来源: https://tidb.net/blog/612103f3

背景

使用 TiDB 作为我们的全量数据库已经有六七年了,当时还是 2.0 版本。早期TiDB的迭代和新特性的发布对于实际使用的影响还是很大的,所以从那个时候开始就有每年的例行升级运维。

而每年暑假都是我们业务的低谷时间,自然选择在7月底8月初左右进行这次的升级。

事实上 TiDB 6.5 在使用上已经相当稳定了,当然我们仍然选择了更新的 LTS 作为这次的升级目标。

官方这次的升级互助活动提供的升级方案基本上都是使用 TiUP 进行的,而我们的 TiDB 集群已经全部纳入 K8S 管理,所以我们这次的升级是通过 TiDB Operator 进行。 升级时间 2024.07.29

升级流程

准备工作

感谢表妹在群里分享的 TiDB 参数变更,一路升级上来除了有一次重建了新集群,其他时候都没有特别去调整参数配置。升级前已经是 6.5 了,所以直接应用一下推荐值,排查发现有2个参数需要变更。

这边整理版本升级到v6.x以上的一些系统变量和配置项默认值改变一些参数,一般情况在升级后可以直接设置,建议排查下刚升级的集群

set global tidb_server_memory_limit="80%"; --该参数请根据实际情况调整

set global tidb_enable_rate_limit_action=false;

set global tidb_enable_paging=ON;

set global tidb_enable_pseudo_for_outdated_stats=OFF;

set global tidb_enable_outer_join_reorder=ON;

set global tidb_stats_load_sync_wait=100;

set global tidb_stats_load_pseudo_timeout=ON;

set global tidb_enable_index_merge=ON;

set global tidb_prepared_plan_cache_size = 50;

TiDB Server 实例内存阈值 <= 64 GiB 时,tidb_prepared_plan_cache_size = 50

TiDB Server 实例内存阈值 > 64 GiB 时,tidb_prepared_plan_cache_size = 100

tidb_ddl_enable_fast_reorg 从 v6.3.0 版本开始引入6.5默认值为on,如需正确使用但需要正确配置temp-dir,如使用该功能可以关闭

set global tidb_ddl_enable_fast_reorg = off;

然后查一下对应的版本,集群将要升级到 7.5,查询官方文档可知 TiDB Operator 的版本推荐为 1.5。所以我们将要升级到 v1.5.3

正式开始

升级 TiDB Operator

先更新 CRD

kubectl replace -f https://raw.githubusercontent.com/pingcap/tidb-operator/v1.5.3/manifests/crd.yaml

我们使用 kustomize 来管理所有 K8S 上的资源,所以升级比较简单,更新掉版本号就好。

diff --git a/tidb-admin/tidb-operator/base/kustomization.yaml b/tidb-admin/tidb-operator/base/kustomization.yaml
index bc77f9d7f..824d79d11 100644
--- a/tidb-admin/tidb-operator/base/kustomization.yaml
+++ b/tidb-admin/tidb-operator/base/kustomization.yaml
@@ -1,19 +1,19 @@namespace: tidb-adminresources: []# - https://raw.githubusercontent.com/pingcap/tidb-operator/v1.4.4/manifests/crd.yamlhelmCharts:- name: tidb-operator
-    version: v1.4.7
+    version: v1.5.3valuesInline:scheduler:create: falsetimezone: "Asia/Shanghai"controllerManager:resources:requests:cpu: 10mmemory: 128Milimits:memory: 128Mirepo: https://charts.pingcap.org/releaseName: tidb-operator

等待新实例启动,观察日志出现类似如下的信息,代表已经完成。理论上升级 TiDB Operator 不会引起 TiDB 本身的更新,兼容性没问题的话,会直接进入 ready 的状态。

I0815 16:12:13.182073 1 tidbcluster_control.go:71] TidbCluster: [ops/bigdata] updated successfully
I0815 16:12:43.204827 1 tidbcluster_control.go:71] TidbCluster: [ops/bigdata] updated successfully

升级 TiDB

更新 CRD 里的 version 参数即可。 同样我们的 CRD 也是用 kustomize 管理的,所以更新版本号

diff --git a/ops/tidb/overlays/prod/tidb.yaml b/ops/tidb/overlays/prod/tidb.yaml
index ac8269805..1d8761a96 100644
--- a/ops/tidb/overlays/prod/tidb.yaml
+++ b/ops/tidb/overlays/prod/tidb.yaml
@@ -10,7 +10,7 @@ spec:######################### TiDB cluster version
-  version: "v6.5.7"
+  version: "v7.5.2"## Time zone of TiDB cluster Podstimezone: Asia/Shanghai

应用后,TiDB Operator 就会马上开始滚动升级,PD → TiKV → TiDB → TiCDC。我们线上是一个最小高可用规模的集群,大概花费半个小时左右的事件就能滚动升级完毕,消耗时间较长的是 TiKV 和 TiCDC,过程中需要迁移 leader 以保证尽可能的平滑,需要等待一些时间。

建议通过观察 TiDB Operator 日志来确定是否升级完毕

升级 DM

我们通过一组 DM 同步 MySQL 数据到 TiDB 当中,升级完 TiDB 后配套升级 DM。

同样是更新 CRD 里的 version 参数

diff --git a/ops/tidb-dm/overlays/prod/dm.yaml b/ops/tidb-dm/overlays/prod/dm.yaml
index dddfe1f55..a0802b168 100644
--- a/ops/tidb-dm/overlays/prod/dm.yaml
+++ b/ops/tidb-dm/overlays/prod/dm.yaml
@@ -3,7 +3,7 @@ kind: DMClustermetadata:name: bigdataspec:
-  version: v6.5.7
+  version: v7.5.2configUpdateStrategy: RollingUpdatepvReclaimPolicy: Deletediscovery:

DM 的升级过程相当快,基本上都可以看作是无状态的服务,重启了就好了。

建议通过观察 TiDB Operator 日志来确定是否升级完毕

升级 TiDB Monitor

更新 TiDB monitor 的版本号。

diff --git a/ops/tidb-monitor/overlays/prod/monitor.yaml b/ops/tidb-monitor/overlays/prod/monitor.yaml
index d9c19bfea..f7fb4ba38 100644
--- a/ops/tidb-monitor/overlays/prod/monitor.yaml
+++ b/ops/tidb-monitor/overlays/prod/monitor.yaml
@@ -10,7 +10,7 @@ spec:- name: bigdatainitializer:baseImage: ccr.ccs.tencentyun.com/patest/tidb-monitor-initializer
-      version: v6.5.7
+      version: v7.5.2alertmanagerURL: alertmanager.ops:9093kubePrometheusURL: http://k8s-prometheus.ops:9090thanos:
@@ -22,7 +22,7 @@ spec:name: thanos-configrequests:cpu: 10m
-      memory: 32Mi
+      memory: 64Miversion: v0.31.0grafana:baseImage: grafana/grafana
@@ -45,7 +45,7 @@ spec:version: v2.45.0initializer:baseImage: ccr.ccs.tencentyun.com/patest/tidb-monitor-initializer
-    version: v6.5.7
+    version: v7.5.2reloader:baseImage: pingcap/tidb-monitor-reloaderlimits:

可能是因为升级之后监控指标变多了, 以前开的非常小的 Thanos sidecar 内存不够用了。

可以看到我们的 initializer baseImage 用的是我们自己打包的镜像,原因是我们希望 DM 和 TiDB 的指标用同一组 Prometheus + Grafana,而官方的 initializer 每次执行时似乎会清理掉原有的配置,所以对镜像里的脚本做了一些简单的魔改,注释掉了清理逻辑。(不知道将来官方是否可以考虑通过参数支持这个需求)

升级完毕后遇到的问题

升级完后整体上业务都没有特别的感知,但有一个我们的业务在重启后出现了无法启动的问题。

  • 业务为 Spring Boot 应用,没有使用 Hibernate 作为数据库的 ORM 库,而是使用的 JetBrains Exposed 框架。
  • 这个框架在进行初始化时会尝试通过访问 INFORMATION_SCHEMA 的一些系统表来验证业务内表名及字段的合法性
  • 升级前后 TiDB 上报的 MySQL 版本发生了变化,从 5.7.x → 8.x
  • JetBrains Exposed 发现是 MySQL 8,尝试访问 INFORMATION_SCHEMA.KEYWORDS
  • TiDB v7.5.2 暂时还不支持这张表

当时也在社区里查了一下这个问题,发现类似情况 https://asktug.com/t/topic/1018669 ,最后选择改 TiDB 参数而不去动业务了

diff --git a/ops/tidb/overlays/prod/tidb.yaml b/ops/tidb/overlays/prod/tidb.yaml
index 1d8761a96..bcdfcefdd 100644
--- a/ops/tidb/overlays/prod/tidb.yaml
+++ b/ops/tidb/overlays/prod/tidb.yaml
@@ -364,6 +364,8 @@ spec:## tidb-server Configuration## Ref: https://docs.pingcap.com/tidb/stable/tidb-configuration-fileconfig: |
+      server-version = "5.7.44-TiDB-v7.5.2"
+[log][log.file]max-backups = 3

使用 TiDB Operator 时,修改运行参数也很方便,只要直接在 CRD 对应字段里加上,等着滚动升级即可。配置完后问题即得到解决。

总结

升级后遇到的兼容性问题刚好在 TiDB v7.5.3 获得了修复,后续计划再进行一次升级,同时把手动更改的参数恢复到默认值。时间不巧,刚好没赶上。

升级完毕后,整体感觉集群运行更为稳定了。虽然遇到了 MySQL 8 的兼容性问题,但也可以看到 TiDB 正在努力兼容,这也为未来我们全面升级到 MySQL 8 打下了良好的基础。

升级过程可以说非常丝滑,全部升级大概只花了半天的时间 ,整个过程基本上就是看着 TiDB Operator 的日志进行操作,通过 K8S CRD 对集群的抽象配置也进一步减少了人工的介入。去年将集群全部迁移进 K8S 现在来看确实是一件非常值得的事情,一方面提高了机器资源利用率,另一方面也减轻了此后的运维压力。

后续还在升级后的集群上运行了过去的 TiSpark 任务,代码和库都没有变更,也能正常执行,应该没有产生不兼容的变化。


http://www.ppmy.cn/news/1512319.html

相关文章

Microsoft Edge 使用方法与秘诀概览

目录 ​编辑引言 Microsoft Edge 功能与技巧概览 掌握这些设置技巧&#xff0c;让 Edge 浏览器的体验更干净 1. 使用阅读视图 2. 开启广告过滤 3. 管理扩展 4. 个性化新标签页 5. 使用网页截图 6. 清理浏览器缓存 7. 管理启动设置 8. 自定义地址栏建议 9. 使用内置笔…

精通推荐算法26:行为序列建模之BST— Transformer建模用户行为序列

1 行为序列建模算法架构 2 BST背景 DIEN利用GRU循环神经网络来建模用户行为序列&#xff0c;捕获了用户行为的演变过程&#xff0c;以及行为间的相关关系&#xff0c;取得了非常不错的业务效果。但受制于GRU天然的串行计算方式&#xff0c;存在长程序列梯度弥散、串行计算影响…

气膜场馆:释放城市闲置土地的无限潜能—轻空间

在城市化进程中&#xff0c;许多边角闲置土地被长期忽视&#xff0c;成为城市发展的“盲点”。然而&#xff0c;这些看似无用的地块&#xff0c;蕴藏着无限的可能性。通过巧妙的规划和创新的建设&#xff0c;这些“盲点”可以转化为城市的“亮点”&#xff0c;不仅助力城市更新…

「Qt Widget中文示例指南」如何实现一个旋转框(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 旋转框示例展示了如…

精通推荐算法27:行为序列建模之BST— 代码实现

1 引言 上文 精通推荐算法26&#xff1a;行为序列建模之BST— Transformer建模用户行为序列-CSDN博客 讲解了BST的背景和模型结构&#xff0c;本文给出其代码实现&#xff0c;供大家参考。 2 BST核心代码 Transformer已经成为了算法工程师的必备技能&#xff0c;因此这一节给…

ISO 26262中的失效率计算:IEC 61709-Clause 10_Resistors and resistor networks

目录 概要 1 元器件分类和基准温度 2 失效率的计算 2.1 失效率预测模型 2.2 温度应力系数 2.2.1 温度应力系数计算模型 3.2.2 温度应力系数计算 结语 概要 IEC 61709是国际电工委员会&#xff08;IEC&#xff09;制定的一个标准&#xff0c;即“电子元器件 可靠性 失效…

Open3D 计算点云基本特征

目录 一、概述 二、特征计算公式 三、完整代码 3.1计算特征值和特征向量 3.2完整代码 四、实现效果 4.1原始点云 4.2数据显示 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博…

学习C语言 第十九天

第一项 C 内存管理 内存是通过指针变量来管理的。通过一些函数和运算符&#xff0c;可以对内存进行操作&#xff0c;包括分配、释放、移动和复制等。 序号函数和描述1void *calloc(int num, int size); 在内存中动态地分配 num 个长度为 size 的连续空间&#xff0c;并将每一…