滚动升级 Kubernetes 上的 TiDB 集群

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 滚动更新 TiDB 集群时,会按 PD、TiKV、TiDB 的顺序,串行删除 Pod,并创建新版本的 Pod,当新版本的 Pod 正常运行后,再处理下一个 Pod。滚动升级过程会自动处理 PD、TiKV 的 Leader 迁移与 TiDB 的 DDL Owner 迁移。因此,在多节点的部署拓扑下(最小环境:PD * 3、TiKV * 3、TiDB * 2),滚动更新 TiKV、PD 不会影响业务正常运行。对于有连接重试功能的客户端,滚动更新 TiDB 同样不会影响业务。对于无法进行重试的客户端,滚动更新 TiDB 则会导致连接到被关闭节点的数据库连接失效,造成部分业务请求失败。对于这类

滚动更新 TiDB 集群时,会按 PD、TiKV、TiDB 的顺序,串行删除 Pod,并创建新版本的 Pod,当新版本的 Pod 正常运行后,再处理下一个 Pod。

滚动升级过程会自动处理 PD、TiKV 的 Leader 迁移与 TiDB 的 DDL Owner 迁移。因此,在多节点的部署拓扑下(最小环境:PD 3、TiKV 3、TiDB * 2),滚动更新 TiKV、PD 不会影响业务正常运行。

对于有连接重试功能的客户端,滚动更新 TiDB 同样不会影响业务。对于无法进行重试的客户端,滚动更新 TiDB 则会导致连接到被关闭节点的数据库连接失效,造成部分业务请求失败。对于这类业务,推荐在客户端添加重试功能或在低峰期进行 TiDB 的滚动升级操作。

滚动更新可以用于升级 TiDB 版本,也可以用于更新集群配置。

通过 TidbCluster CR 升级
如果 TiDB 集群是直接通过 TidbCluster CR 部署的或者通过 Helm 方式部署的然后又切换到了 TidbCluster CR 管理,可以通过下面步骤升级 TiDB 集群。

升级 TiDB 版本
修改集群的 TidbCluster CR 中各组件的镜像配置。

需要注意的是,TidbCluster CR 中关于镜像配置有多个参数:

spec.version,格式为 imageTag,例如 v3.1.0
spec.<pd/tidb/tikv/pump>.baseImage,格式为 imageName,例如 pingcap/tidb
spec.<pd/tidb/tikv/pump>.version,格式为 imageTag,例如 v3.1.0
spec.<pd/tidb/tikv/pump>.image,格式为 imageName:imageTag,例如 pingcap/tidb:v3.1.0
镜像配置获取的优先级为:

spec.<pd/tidb/tikv/pump>.baseImage + spec.<pd/tidb/tikv/pump>.version > spec.<pd/tidb/tikv/pump>.baseImage + spec.version > spec.<pd/tidb/tikv/pump>.image。

正常情况下,集群内的各组件应该使用相同版本,所以一般建议配置 spec.<pd/tidb/tikv/pump>.baseImage + spec.version 即可,这样升级 TiDB 集群只需要修改 spec.version。

kubectl edit tc ${cluster_name} -n ${namespace}
查看升级进度:

watch kubectl -n ${namespace} get pod -o wide
当所有 Pod 都重建完毕进入 Running 状态后,升级完成。

更新 TiDB 集群配置
默认条件下,修改配置不会自动应用到 TiDB 集群中,只有在 Pod 重启时,才会重新加载新的配置文件,建议设置 spec.configUpdateStrategy 为 RollingUpdate 开启配置自动更新特性,在每次配置更新时,自动对组件执行滚动更新,将修改后的配置应用到集群中。

设置 spec.configUpdateStrategy 为 RollingUpdate;

参考 TiDB 集群配置调整集群配置项;

查看升级进度:

watch kubectl -n ${namespace} get pod -o wide
当所有 Pod 都重建完毕进入 Running 状态后,升级完成。

强制升级 TiDB 集群
如果 PD 集群因为 PD 配置错误、PD 镜像 tag 错误、NodeAffinity 等原因不可用,TiDB 集群扩缩容、升级 TiDB 版本和更新 TiDB 集群配置这三种操作都无法成功执行。

这种情况下,可使用 force-upgrade 强制升级集群以恢复集群功能。 首先为集群设置 annotation:

kubectl annotate --overwrite tc ${cluster_name} -n ${namespace} tidb.pingcap.com/force-upgrade=true
然后修改 PD 相关配置,确保 PD 进入正常状态。

警告:

PD 集群恢复后,必须执行下面命令禁用强制升级功能,否则下次升级过程可能会出现异常:

kubectl annotate tc ${cluster_name} -n ${namespace} tidb.pingcap.com/force-upgrade-
通过 Helm 升级
如果选择继续用 Helm 管理集群,可以参考下面QQ靓号买卖平台步骤升级 TiDB 集群。

升级 TiDB 版本
修改集群的 values.yaml 文件中的 tidb.image、tikv.image、pd.image 的值为新版本镜像;

执行 helm upgrade 命令进行升级:

helm upgrade ${release_name} pingcap/tidb-cluster -f values.yaml --version=${chart_version}
查看升级进度:

watch kubectl -n ${namespace} get pod -o wide
当所有 Pod 都重建完毕进入 Running 状态后,升级完成。

更新 TiDB 集群配置
默认条件下,修改配置文件不会自动应用到 TiDB 集群中,只有在实例重启时,才会重新加载新的配置文件。

您可以开启配置文件自动更新特性,在每次配置文件更新时,自动执行滚动更新,将修改后的配置应用到集群中。操作步骤如下:

修改集群的 values.yaml 文件,将 enableConfigMapRollout 的值设为 true;

根据需求修改 values.yaml 中需要调整的集群配置项;

执行 helm upgrade 命令进行升级:

helm upgrade ${release_name} pingcap/tidb-cluster -f values.yaml --version=${chart_version}
查看升级进度:

watch kubectl -n ${namespace} get pod -o wide
当所有 Pod 都重建完毕进入 Running 状态后,升级完成。

注意:

将 enableConfigMapRollout 特性从关闭状态打开时,即使没有配置变更,也会触发一次 PD、TiKV、TiDB 的滚动更新。
强制升级 TiDB 集群
如果 PD 集群因为 PD 配置错误、PD 镜像 tag 错误、NodeAffinity 等原因不可用,TiDB 集群扩缩容、升级 TiDB 版本和更新 TiDB 集群配置这三种操作都无法成功执行。

这种情况下,可使用 force-upgrade(TiDB Operator 版本 > v1.0.0-beta.3 )强制升级集群以恢复集群功能。 首先为集群设置 annotation:

kubectl annotate --overwrite tc ${release_name} -n ${namespace} tidb.pingcap.com/force-upgrade=true
然后执行对应操作中的 helm upgrade 命令:

helm upgrade ${release_name} pingcap/tidb-cluster -f values.yaml --version=${chart_version}
警告:

PD 集群恢复后,必须执行下面命令禁用强制升级功能,否则下次升级过程可能会出现异常:

kubectl annotate tc ${release_name} -n ${namespace} tidb.pingcap.com/force-upgrade-

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
15天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
16天前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
1月前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
112 17
|
1月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
356 1
|
1月前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
91 1
|
1月前
|
负载均衡 应用服务中间件 nginx
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
49 1
|
27天前
|
Kubernetes Ubuntu Linux
Centos7 搭建 kubernetes集群
本文介绍了如何搭建一个三节点的Kubernetes集群,包括一个主节点和两个工作节点。各节点运行CentOS 7系统,最低配置为2核CPU、2GB内存和15GB硬盘。详细步骤包括环境配置、安装Docker、关闭防火墙和SELinux、禁用交换分区、安装kubeadm、kubelet、kubectl,以及初始化Kubernetes集群和安装网络插件Calico或Flannel。
128 0
|
1月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
69 0
|
1月前
|
弹性计算 Kubernetes Linux
如何使用minikube搭建k8s集群
如何使用minikube搭建k8s集群
|
1月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--k8s集群使用容器镜像仓库Harbor
本文介绍了在CentOS 7.9环境下部署Harbor容器镜像仓库,并将其集成到Kubernetes集群的过程。环境中包含一台Master节点和两台Node节点,均已部署好K8s集群。首先详细讲述了在Harbor节点上安装Docker和docker-compose,接着通过下载Harbor离线安装包并配置相关参数完成Harbor的部署。随后介绍了如何通过secret和serviceaccount两种方式让Kubernetes集群使用Harbor作为镜像仓库,包括创建secret、配置节点、上传镜像以及创建Pod等步骤。最后验证了Pod能否成功从Harbor拉取镜像运行。
下一篇
无影云桌面