当前位置: 首页 > news >正文

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

作者: 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 任务,代码和库都没有变更,也能正常执行,应该没有产生不兼容的变化。

相关文章:

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

作者&#xff1a; reAsOn2010 原文来源&#xff1a; https://tidb.net/blog/612103f3 背景 使用 TiDB 作为我们的全量数据库已经有六七年了&#xff0c;当时还是 2.0 版本。早期TiDB的迭代和新特性的发布对于实际使用的影响还是很大的&#xff0c;所以从那个时候开始就有每…...

Redis的缓存穿透、击穿、雪崩

目录 缓存穿透 定义&#xff1a; 解决方法&#xff1a; 缓存击穿 定义&#xff1a; 解决方案&#xff1a; 缓存雪崩 定义&#xff1a; 解决方案&#xff1a; 缓存穿透、缓存击穿和缓存雪崩的区别 缓存穿透 定义&#xff1a; 查询一个不存在的数据&#xff0c;数据库未…...

【Django开发】前后端分离django美多商城项目第1篇:欢迎来到美多 项目主要页面介绍【附代码文档】

本教程的知识点为&#xff1a; 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计&#xff1a; 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后…...

【软件造价咨询】信息化项目预算评审看什么?

在信息化项目预算评审中&#xff0c;各方往往只重视预算金额部分&#xff0c;而忽视了项目建设的全局性和整体性把关&#xff0c;导致信息系统的重复建设、分散建设、业务和系统两张皮、重功能轻数据、重投资轻方案等问题频出&#xff0c;从而大幅降低财政投资效益。 例如&…...

第37讲:Cephfs文件系统的正确使用姿势

文章目录 1.Cephfs文件系统简介2.Cephfs文件系统细节介绍2.1.Cephfs文件系统多客户端隔离挂载2.2.Ceph集群中多个Cephfs如何单独使用 3.挂载多个Cephfs文件系统4.Cephfs文件系统多客户端隔离挂载实战4.1.创建一个Cephfs文件系统4.2.将Cephfs文件系统挂载到本地路径4.3.在Cephfs…...

单片机烧录

在设计芯片的时候&#xff0c;关于烧录的环节是一个不得不考虑的问题。 我们首先排除掉&#xff0c;由外部直接硬件操控FLASH 的方案&#xff0c;这个方案有很多缺点。 1、每个IC使用的FLASH型号是各不相同的&#xff0c;每种型号的FLASH的烧录命令和流程都有差别&#xff0c;这…...

mysql实现分布式锁

利用数据库的悲观锁实现分布式锁,实际应用中要考虑mysql的高可用。 DistributedLock.h #ifndef DistributedLock_H_ #define DistributedLock_H_// // DistributedLock.h: // #include "base/MySQLDriver.h" class CDistributedLock { public://// Construction/D…...

MySQL快速使用

关系型数据库&#xff08;RDBMS&#xff09;&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库 特点&#xff1a;使用表存储数据&#xff0c;格式统一方便维护&#xff1b;使用SQL语言操作&#xff0c;标准统一使用方便 通用语法&#xff1a; …...

LeetCode41.缺失的第一个正数

1. 题目大意 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 2. 思路分析 示例 1&#xff1a; 输入&#xff1a;nums [3,4,-1,1] 输出&#xff1a;2 解释&#xff1…...

ee trade:黄金投资与股票投资的区别

黄金和股票&#xff0c; 是金融市场中两种常见的投资工具&#xff0c; 它们拥有截然不同的特点和风险&#xff0c; 了解它们的差异&#xff0c; 可以帮助投资者制定更合理的投资策略。 一、 投资性质&#xff1a; 避险与成长&#xff0c; 两种投资方向 黄金&#xff1a; 被视…...

AI视频创作原理

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...

idea vue项目删除node_modules时报文件损坏且无法读取,导致删除失败

解决办法&#xff0c;查看node_modules所在盘&#xff0c;右击点击属性-工具&#xff0c;点击检查驱动&#xff0c;查完后修复即可&#xff0c; 就能够成功删除损坏的文件了...

Linux下编译安装-单机模式

1.1 Linux下编译安装-单机模式 1.1.1 安装 (1).把安装包放在Linux文件系统下 (2).解压缩 tar -zxf redis-4.0.2.tar.gz (3).切换到解压后的目录 cd redis-4.0.2(4).编译 make(5).进入到src目录 cd src(6).执行安装 make install(7) .返回上级目录 cd .. (8) .修改配置&…...

RSSI定位算法

文章目录 一、定位算法简介1.1. 定位技术原理1.2. 定位算法二、RSSI测距原理2.1. 建模与测量终端到基站的距离三、定位3.1. 三边定位算法3.2. 加权三边定位算法3.3. 加权三角形质心定位算法3.4. 程序定位算法的执行流程一、定位算法简介 1.1. 定位技术原理 定位终端接收到iBe…...

布局管理(Layouts)-Qt-思维导图-学习笔记

布局管理(Layouts) Qt 提供了非常丰富的布局类&#xff0c;主要包括以下基本布局管理类 QBoxLayout 提供了水平和垂直的布局管理&#xff0c;可以将子部件按行或列排列。根据排列方向的不同&#xff0c;QBoxLayout 分为 QHBoxLayout&#xff08;水平布局&#xff09;和 QVBox…...

《区块链赋能游戏业:破解虚拟资产交易与确权难题》

在当今数字化的时代&#xff0c;游戏行业正以前所未有的速度发展&#xff0c;虚拟资产在游戏中的重要性日益凸显。然而&#xff0c;虚拟资产的交易和确权问题一直困扰着游戏开发者和玩家。随着区块链技术的引入&#xff0c;为解决这些问题带来了新的曙光。 首先&#xff0c;我…...

机器学习第十一章-特征选择与稀疏学习

11.1子集收集与评价 属性称为"特征" &#xff0c;对当前学习任务有用的属性称为"相关特征" 、没什么用的属性称为"无关特 征" . 从给定的特征集合中选择出相关特征于集的过程&#xff0c;称为"特征选择"。 特征选择是一个重要的"…...

C#中客户端直接引用服务端Proto文件

gRPC 客户端是从 .proto 文件生成的具体客户端类型。 具体 gRPC 客户端具有转换为 .proto 文件中 gRPC 服务的方法。 下一步打开【服务引用】 控制面板 选择grpc选项&#xff0c;然后继续 到此配置完成&#xff0c;然后就和服务共用一份protocol文件...

SiLM5932SHO系列SiLM5932SHOCG-DG 12A/12A强劲驱动电流能力 支持主动短路保护功能(ASC)单通道隔离门极驱动器

SiLM5932SHO系列是一款单通道隔离驱动器&#xff0c;提供12A源电流和12A灌电流。主动保护功能包括退饱和过流检测、UVLO、隔离故障报警和 4A 米勒钳位。输入侧电源的工作电压为3V至5.5V&#xff0c;输出侧电源的工作电压范围为13V至30V。所有电源电压引脚都有欠压锁定 (UVLO) 保…...

本地项目上传github

一、先在github&#xff08;GitHub: Let’s build from here GitHub&#xff09;上创建仓库 1&#xff0c;登录github后&#xff0c;点击右上角头像&#xff0c;点击 Your repositories 2&#xff0c;点击new 3&#xff0c;填写仓库名&#xff0c;假设命名 testhub&#xff0…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...