技术分享 | TiUP工具 - TiDB集群滚动升级核心流程解析

news2024/11/20 15:41:17

作者:贲绍华

爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


引言:

滚动升级是一种在线升级方式,相比离线升级,滚动升级可保证在部分或全部服务可用的情况下完成软件的升级。在集群规模大且支撑业务多且复杂时,尽量减少业务中断的滚动升级具有重要的意义。

TiUP在升级流程中还有一些细节处理在文中并没有详细书写,本文旨在DBA或开发在升级过程中如果遇问题,可以根据核心流程的解析给与一些帮助与思路。

一、TiDB简介

TiDB 是一款定位于在线事务处理/在线分析处理的融合型数据库产品,实现了一键水平伸缩,强一致性的多副本数据安全,分布式事务,实时 OLAP 等重要特性。同时兼容 MySQL 协议和生态,迁移便捷,运维成本极低。

详细架构见:https://docs.pingcap.com/zh/tidb/stable/tidb-architecture

为了方便下文理解,此处先介绍一下TiDB集群的核心三个组件:

  • TiDB Server

SQL 层,对外暴露 MySQL 协议的连接 endpoint,负责接受客户端的连接,执行 SQL 解析和优化,最终生成分布式执行计划。TiDB 层本身是无状态的,实践中可以启动多个 TiDB 实例,通过负载均衡组件(如 LVS、HAProxy 或 F5)对外提供统一的接入地址,客户端的连接可以均匀地分摊在多个 TiDB 实例上以达到负载均衡的效果。TiDB Server 本身并不存储数据,只是解析 SQL,将实际的数据读取请求转发给底层的存储节点 TiKV(或 TiFlash)。

  • PD (Placement Driver) Server

整个 TiDB 集群的元信息管理模块,负责存储每个 TiKV 节点实时的数据分布情况和集群的整体拓扑结构,提供 TiDB Dashboard 管控界面,并为分布式事务分配事务 ID。PD 不仅存储元信息,同时还会根据 TiKV 节点实时上报的数据分布状态,下发数据调度命令给具体的 TiKV 节点,可以说是整个集群的“大脑”。此外,PD 本身也是由至少 3 个节点构成,拥有高可用的能力。建议部署奇数个 PD 节点。

  • TiKV Server

负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range(从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region。TiKV 的 API 在 KV 键值对层面提供对分布式事务的原生支持,默认提供了 SI (Snapshot Isolation) 的隔离级别,这也是 TiDB 在 SQL 层面支持分布式事务的核心。TiDB 的 SQL 层做完 SQL 解析后,会将 SQL 的执行计划转换为对 TiKV API 的实际调用。所以,数据都存储在 TiKV 中。另外,TiKV 中的数据都会自动维护多副本(默认为三副本),天然支持高可用和自动故障转移。

二、名词解释:

  • Scheduler

Scheduler(调度器)是 PD 中生成调度的组件。PD 中每个调度器是独立运行的,分别服务于不同的调度目的。常用的调度器及其调用目标有:

  • balance-leader-scheduler:保持不同节点的 Leader 均衡。

  • balance-region-scheduler:保持不同节点的 Peer 均衡。

  • hot-region-scheduler:保持不同节点的读写热点 Region 均衡。

  • evict-leader-{store-id}:驱逐某个节点的所有 Leader。(常用于滚动升级)

  • Store

PD 中的 Store 指的是集群中的存储节点,也就是 tikv-server 实例。Store 与 TiKV 实例是严格一一对应的,即使在同一主机甚至同一块磁盘部署多个 TiKV 实例,这些实例也对会对应不同的 Store。

三、TiUP工具简介

从 TiDB 4.0 版本开始,TiUP 作为新的工具,承担着包管理器的角色,管理着 TiDB 生态下众多的组件,如 TiDB、PD、TiKV 等。用户想要运行 TiDB 生态中任何组件时,只需要执行 TiUP 一行命令即可,相比以前,极大地降低了管理难度。其中就包括了本篇要讲述的TiDB集群滚动升级功能。

四、核心流程解析

  1. 配置与参数检查、安装包拉取等(此处略过)

  2. 备份旧组件文件

    相关源码:https://github.com/pingcap/tiup/blob/9e2e464c362c8604d87a04ff9578e1da7d9b1e64/pkg/cluster/manager/upgrade.go#L140

  3. 部署组件
    TiDB组件为无状态流量入口,部署后会直接在此步骤重启实例进程
    相关源码:https://github.com/pingcap/tiup/blob/9e2e464c362c8604d87a04ff9578e1da7d9b1e64/pkg/cluster/manager/upgrade.go#L143

  4. 升级前置准备:

    4.1 获取PD配置信息,并从PD集群中寻找leader节点,建立连接

    4.2 调整PD集群参数,增大限制,使其升级job调度加速

schedule.leader-schedule-limit # 可以控制同时进行 leader 调度的任务个数
如果当前该配置项值小于64,则调整为:当前配置值+64
schedule.region-schedule-limit # 可以控制同时进行 Region 调度的任务个数
如果当前该配置项值小于1024,则调整为:当前值+1024
详细介绍见:https://docs.pingcap.com/zh/tidb/stable/dynamic-config#在线修改-pd-配置   

相关源码:https://github.com/pingcap/tiup/blob/9e2e464c362c8604d87a04ff9578e1da7d9b1e64/pkg/cluster/operation/upgrade.go#L85

  1. 构造需要特殊处理的组件job清单:

    将所有特殊组件节点加入清单中(本篇只讲述TiKV与PD组件),并检测其中PD节点是否为leader,如果是,则安排至最后被处理

    相关源码:https://github.com/pingcap/tiup/blob/9e2e464c362c8604d87a04ff9578e1da7d9b1e64/pkg/cluster/operation/upgrade.go#L119

  2. 升级TiKV集群:

    6.1 检测PD leader是否存活

    6.2 记录TiKV store leader信息

    为了接下来驱逐leader做准备

    6.3 [PD API Client] 创建store驱逐者

    驱逐者会踢掉当前的store leader

    相关源码:https://github.com/pingcap/tiup/blob/9e2e464c362c8604d87a04ff9578e1da7d9b1e64/pkg/cluster/spec/tikv.go#L336

    6.4 重启TiKV实例进程

    6.5 [PD API Client] 移除store驱逐者

    相关源码:https://github.com/pingcap/tiup/blob/9e2e464c362c8604d87a04ff9578e1da7d9b1e64/pkg/cluster/spec/tikv.go#L379

  3. 升级PD集群

    7.1 检查当前升级节点是否为PD leader,如果是则驱逐该leader。

    相关源码:https://github.com/pingcap/tiup/blob/9e2e464c362c8604d87a04ff9578e1da7d9b1e64/pkg/cluster/spec/pd.go#L353

    7.2 重启PD实例进程

    7.3 [PD API Client] PD集群健康状态检查

    相关源码:https://github.com/pingcap/tiup/blob/9e2e464c362c8604d87a04ff9578e1da7d9b1e64/pkg/cluster/spec/pd.go#L379

  4. 回滚PD集群schedule相关配置

    相关源码:https://github.com/pingcap/tiup/blob/9e2e464c362c8604d87a04ff9578e1da7d9b1e64/pkg/cluster/operation/upgrade.go#L91

  5. 保存元数据信息

    相关源码:https://github.com/pingcap/tiup/blob/9e2e464c362c8604d87a04ff9578e1da7d9b1e64/pkg/cluster/manager/upgrade.go#L237

  6. 升级成功

五、其他

版本说明

本文所列举升级流程为TiUP master分支最新代码,理论可以适用至最新的6.x版本

PD组件API

PD组件定义了很多可以直接管理集群的对外暴露的API服务,不过目前写在TiDB官方的手册上,感兴趣的可以了解一下。

详细列表见:https://github.com/tikv/pd/blob/master/server/api/router.go#L130

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运维工程师怎么找兼职?什么样的兼职合适?

运维老哥们应该都知道,这个岗位其实是个很宽泛的定义,不同公司对运维的要求也不一样。有些公司所谓运维就是桌面helpdesk ,有些公司就是网管。基本上从修电脑到会写点脚本做自动化,各个层次的都有。现状就是,有少数公司或者大厂的…

基于Django的图书交易系统

摘 要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,图书交易系统也不例外,但目前国内的有些公司仍然都使用人工管理,图书销量越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化…

第五课 算术运算

一、加法与减法 经过上次课的学习,我们已经学会了该如何在控制台中输出我们想要的内容了,但是计算机计算机,最早其实是用来进行计算的,Python能做这事吗,我们来试试。 看到这结果,估计很多同学就该说了&…

【每周研报复现】基于阻力支撑相对强度(RSRS)的市场择时

原创文章第106篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。 今天要复现的研报是:”光大证券_金融工程深度:基于阻力支撑相对强度(RSRS)的市场择时——技术择时系列报告之一“。 研报核心…

写个注解帮你净化使用分布式锁的重复操作

RedissonAop实现分布式锁 前言 简介 Aop的意义 AOP 旨在从业务逻辑中分离出来通用逻辑,切面实现了跨越多种类型和对象的关注点(例如事务管理、日志记录、权限控制)的模块化。 例子 就以这段代码为例子,这段代码总是回去获取锁之…

【HTML】关于height值设置和显示不同的原因以及font-size对象为中文和英文的区别

关于height值设置和显示不同的原因 height: 100px; CSS中把高度设置为100px,但是实际测量发现高度为125px 这个是因为:笔记本默认显示大小为125%,所以100的125%就是125. 还有一点,在你写网页时,要注意网页的缩放一定…

050_阵列天线方向图乘积原理

天线增益概念。原创不易,恐有错误,恳请读者指正。碎片三分钟逛电巢App,收获一丢丢。 天线定向性(directivity) 假设理想的无定向性天线,在远场区的3D球面空间各方向的辐射功率都相等,则定义球面等辐射功率的方向图的定…

Linux内存泄露案例分析和内存管理分享

作者:李遵举 一、问题 近期我们运维同事接到线上LB(负载均衡)服务内存报警,运维同事反馈说LB集群有部分机器的内存使用率超过80%,有的甚至超过90%,而且内存使用率还再不停的增长。接到内存报警的消息&…

代码随想录day56|583. 两个字符串的删除操作|72. 编辑距离|编辑距离总结篇|Golang

代码随想录day56 考试周了解一下 目录 代码随想录day56 583. 两个字符串的删除操作 72. 编辑距离 动态规划之编辑距离总结篇 583. 两个字符串的删除操作 思路 动态规划一 本题和动态规划:115.不同的子序列相比,其实就是两个字符串都可以删除了&am…

2023职教高考报名开启,报考人数继续增加

进入11月起,各地区2023年职教高考报名已经陆续开始,报考考生主要以中职学校学生为主。根据南京日报的报道,11月1日就启动的江苏省职教高考报名,吸引了不少家长和学生的关注,有些专业的报名人数已经比2022年翻了不止一倍…

Flutter Hooks — 快速了解

Flutter Hooks — 快速了解 前言 Hooks,直译过来就是"钩子",是前端 React 框架加入的特性,用来分离状态逻辑和视图逻辑。现在这个特性并不只局限在于 React 框架中,其它前端框架也在借鉴。 我们都知道在 FLutter 开发中的一大痛点就…

图解 | 监控系统 Prometheus 的原理

本篇将会以图解的方式剖析 Prometheus 的原理。本文主要内容如下: 一、Prometheus 是什么? ELK Stack 日志收集和检索平台想必大家应该比较熟悉,Elasticsearch Filebeat Logstash Kibana。 ELK 架构 而 Prometheus 就相当于一整个 ELK&a…

功率放大器的主要指标有哪些呢

功率放大器是电子测量行业比较常见的能够放大信号源电压信号的仪器,虽然功率放大器的应用十分广泛,但是很多人对于功率放大器的主要指标参数还不了解,就让安泰电子来为大家介绍功率放大器的主要指标。 功率放大器的核心参数指标包括带宽、电压…

python多线程返回值问题重写Thread类的run方法

python多线程使用 文章目录python多线程使用一、案例二、说明1、针对第一种是有返回值的 ,可以通过future.result() 去拿到每个线程返回值2、无返回值问题3、我们可以重写这个Thread类重写了__init__、run方法和join方法,主要是start()涉及的方法太多了而…

Redis篇(5)——持久化

持久化 RDB 1、save会阻塞所有命令。而bgsave则不能与其他持久化命令同时执行 2、自动rdb的发起:servercorn默认每100ms执行一次,根据redisserver里面记录的dirty(上次save后修改的次数)和lastsave(上次save的时间&a…

sklearn基础篇(七)-- 随机森林(Random forest)

上一节我们提到决策树的一个主要缺点在于经常对训练数据过拟合。随机森林是解决这个问题的一种方法。随机森林是属于集成学习,其核心思想就是集成多个弱分类器以达到一个强分类器的效果。 1 bagging的原理 随机森林采用Bagging的思想,所谓的Bagging可以…

HDFS的高级功能

3.6 HDFS的高级功能 3.6.1 安全模式 安全模式(Safemode)是HDFS所处的一种特殊状态。处于这种状态时,HDFS只接受读数据请求,不能对文件进行写、删除等操作。安全模式是保证一个系统保密性、完整性及可使用性的一种机制&#xff0…

精彩回顾:CACTER邮件数据防泄露EDLP亮相2022世界互联网大会

2022年世界互联网大会乌镇峰会于11月11日胜利闭幕。 本届峰会是世界互联网大会国际组织成立后的首届年会,以“共建网络世界 共创数字未来—携手构建网络空间命运共同体”为主题,共设置1场全体会议和20场分论坛,围绕全球网络空间热点问题展开讨…

【猿创征文】Vue3 企业级优雅实战 - 组件库框架 - 6 搭建example环境

本系列已更新文章: 分享一个实用的 vite vue3 组件库脚手架工具,提升开发效率 开箱即用 yyg-cli 脚手架:快速创建 vue3 组件库和vue3 全家桶项目 Vue3 企业级优雅实战 - 组件库框架 - 1 搭建 pnpm monorepo Vue3 企业级优雅实战 - 组件库框架…

线程池相关总结

多线程之线程池总结 1. 概述: 线程池(Thread Pool):把一个或多个线程通过统一的方式进行调度和重复使用的技术,统一管理,避免了因线程过多而带来使用上的开销和不可控。 作用: 降低资源消耗…