文档章节

TiKV 集群版本的安全迁移

TiDB
 TiDB
发布于 2018/09/22 17:16
字数 1685
阅读 48
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

问题描述

在 TiDB 的产品迭代中,不免会碰到一些兼容性问题出现。通常协议上的兼容性 protobuf 已经能帮我们处理的很好,在进行功能开发,性能优化时,通常会保证版本是向后兼容的,但并不保证向前兼容性,因此,当集群中同时有新旧版本节点存在时,旧版本不能兼容新版本的特性,就有可能造成该节点崩溃,影响集群可用性,甚至丢失数据。目前在有不兼容的版本升级时,会要求进行离线升级,但这会影响到服务,我们需要一个适合的机制来进行不停服务的升级。因此我们需要在进行滚动升级时,让这些不能保证整个集群的向后兼容性的功能不被启用。只有在保证集群中所有节点都已经升级完成后,我们才安全的启用这些功能。

常见的当我们对引入新的 RaftCommand 的时候,旧版本的 TiKV 并不能识别新的添加的 RaftCommand,对于不能认知的 RaftCommand TiKV 有不同的处理,可能会报错退出或忽略。比如为了支持 Raft Learner, 在 raftpb 里对添加新的 ConfChange 类型。 当 PD 在进行 Region 调度时,会先发送 AddLearner 到 TiKV 上,接受到这个命令的肯定是这个 Region 的 Leader,在进行一系列检查后,会将该命令 Proposal, 而 Follwer 如果是旧版本的话,在 Apply 这条 Command 就会出错。而在滚动升级时,很有可能存在 Leader 是新版本,Follwer 是老版本的情况。

引入版本检查机制

TiDB 的版本定义是遵循 Semver 的版本规则的。版本格式一般由主版本号(Major),次版本号(Minor),修订号(Patch),版本号递增规则如下:

  1. 主版本号:当进行了不兼容的 API 修改。
  2. 次版本号:当做了向下兼容的功能性新增。
  3. 修订号:当做了向下兼容的问题修正。

先行版本号(PreRelase)及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。比如 TiDB 目前的版本是 2.1.0-beta,先行版号为 beta 版。

在此之前,集群并没有版本的概念,虽然每个组件都有各自的版本信息,但各个节点的各自组件的版本都可以任意的。没有一个管理机制可以管理或查看所有组件的版本信息。为了解决滚动升级过程中存在多个版本的兼容性问题,这里引入集群版本的概念,并由 TiDB 集群的中心节点 PD 来进行管理和检查。

具体实现

1.升级集群

在 PD 中,会设置一个 cluster_version 的键值对,对应当前运行集群中 TiKV 节点中最旧的版本。也就是必须要兼容这个版本, 因此不能打开集群中其他新版本的节点的一些不兼容的特性。

在集群启动的时候,每个 TiKV 都需要向 PD 注册,注册时会带上版本信息。当当前 TiKV 的版本低于集群版本的时候,该 TiKV 会注册失败。因为此时集群的版本已经是更高的版本了,而加入旧版本的节点需要对旧版本进行兼容,为了防止已有的特性降级,直接拒绝不兼容的版本加入,目前默认主版本号和此版本号一样则为兼容的版本。

如果 TiKV 的版本高于或等于当前的 cluster_version 时, TiKV 能够注册成功并成功启动。每次注册都会触发 PD 的一次检查,会检测当前集群中正常运行的 TiKV 的最低版本,并与当前的 cluster_version 进行比对,如果最低版本比 cluster_version 更加新,则将 cluster_version 更新。因此每次滚动升级的时候,能够自动更新集群的版本。

2. 版本特性的开启

TiKV 很多功能是需要 PD 的参与,目前这些新功能的开启也是通过 PD 进行控制的。在 PD 中,会将每个版本新特性记录下来,在 TiKV 2.0 中,对应有 Raft Leaner, Region Merge。 TiKV 2.1 中有 Batch Split,Joint Consensus 等。这些特性都需要 PD 的参与与控制。比如说 Add Leaner,Region Merge,Joint Consensus 需要 PD 下发调度给 TiKV,Batch Split 则是 TiKV 主动发起并请求 PD 分配新的 Region ID。因此这些功能都是能通过 PD 进行控制的。PD 会通过比对当前的集群版本,选择开启当前集群版本所支持的新特性。从而保证版本的兼容性。

3. 集群回滚

当升级完成后,如果遇到问题需要进行集群进行回滚时, 需要手动修改集群版本后。PD 提供了 pdctl 可以通过命令手动修改集群的 cluster_version,这时旧版本的 TiKV 就能注册并启动,从而进行回滚。

PD 对 cluster_version 是通过 etcd 进行了持久化,在每次 PD 启动的时候,leader 都会从 etcd kv 中加载出 clustrer_version,然后提供服务。从而保证在 PD leader 切换后 cluster_version 的一致性。另外 PD 本身的版本可能会小于当前 cluster_version。因此在滚动升级的时候,需要先升级 PD,如果只升级了 TiKV,虽然 cluster_version 已经更新到新的版本的,但 PD 并不能开启新的功能,因为对它来说是不支持的。如果出现这种情况,PD 的日志中会有报警。在升级的时候,最好按 PD,TiKV,TiDB 的顺序逐一对各个组件。

后续计划

上面提到的新功能特性一般都是需要 PD 参与的。而有些特性不需要PD的参与,因此需要保证这种特性在 TiKV 之间是可以兼容的,实现的时候可以采用类是 http2 <-> http 的方式,对请求进行降级装发,保留两套接口等。另为 TiDB 目前是自身保证可以无缝兼容,但与 TiKV 可能存在兼容性问题,往后同样考虑让TiDB 也在 PD上进行注册。

作者:陈书宁

TiDB

TiDB

粉丝 257
博文 376
码字总数 1022889
作品 4
海淀
私信 提问
加载中
请先登录后再评论。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.4K
6
iOS 应用版本更新检查--Harpy

实现 app 版本检查功能。用户打开app之后,进行app的版本更新检查。如果检查到 appstore 上有当前qpp的新版本,则弹出对话框提醒用户下载。可以设置让用户选择下载或者强制用户下载。 [Code4...

匿名
2013/02/18
1.7K
0
集群存储系统--YFS

YFS集群存储系统由多个元数据服务器(MDS)、多个块数据服务器(CDS)和多个客户端(client)互联组成集群; 数据被分成64M固定大小的数据块(Chunk),每个数据块在CDS本地以常规文件的形式...

匿名
2013/02/19
1.7K
0
工作流管理系统--Pegasus WMS

Pegasus (飞马座)工作流管理系统包括一套技术标准工作流程应用程序中执行帮助许多不同的环境中,包括桌面、校园集群、网格、云。它弥补了科学领域和执行环境通过自 动映射到分布式资源的高层工...

匿名
2013/02/24
5.3K
0
律师事务所管理程序--eLawOffice

eLawOffice eLawOffice是第一个在sourceforge上的开源的管理律师事务所的程序,并且也是最完整的。但是eLawOffice特别为意大利会计法律及事物处理方便定制。 这个是一个跨平台的java套件,用...

匿名
2012/10/26
2K
0

没有更多内容

加载失败,请刷新页面

加载更多

静态类和单例模式之间的区别? - Difference between static class and singleton pattern?

问题: What real (ie practical) difference exists between a static class and a singleton pattern? 静态类和单例模式之间存在什么真正(即实用)的区别? Both can be invoked without ......

法国红酒甜
17分钟前
13
0
代理服务器和反向代理服务器之间有什么区别? - What's the difference between proxy server and reverse proxy server?

问题: 代理服务器和反向代理服务器有什么区别? 解决方案: 参考一: https://stackoom.com/question/wRc/代理服务器和反向代理服务器之间有什么区别 参考二: https://oldbug.net/q/wRc/W...

技术盛宴
今天
16
0
第八讲:配置外界可以访问虚拟机里面的HDFS

本节通过配置实现外界访问虚拟机Centos6.4里面的HDFS。为后续的java读写HDFS做准备 步骤有: 1、修改主机Windos7的网络配置 2、修改虚拟机Centos6.4里面的网络配置 3、修改虚拟机Centos6.4里...

刘日辉
今天
26
0
OSChina 周四乱弹 —— 不劳而获的饭好吃么?好吃!非常好吃!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑推荐:《世界上不存在的歌 (2020重唱版)》- 陈奕迅 《世界上不存在的歌 (2020重唱版)》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
今天
31
3
从 GPU、TPU,到 Web 端、移动端,深度学习框架部署训练开始变简单

本文作者:o****0 早些时候的统计显示,今年3月,深度学习框架集中爆发。5月,有人发布可以直接在 iphone11上训练神经网络的开源项目。日前,百度开源国内首个可直接运行在 Web 端的深度学习...

百度开发者中心
昨天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部