【世界时快讯】通过TiDB Operator升级TiDB集群

2023-02-03 12:12:36 来源:51CTO博客


(相关资料图)

通过TiDB Operator来部署管理Kubernete上的TiDB集群,可以通过滚动更新来升级TiDB集群的版本,来减少对业务的影响。本文介绍如何使用滚动更新来升级 Kubernetes 上的 TiDB 集群。

滚动更新功能介绍

Kubernetes 提供了​​滚动更新功能​​,在不影响应用可用性的前提下执行更新。

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

滚动更新中,TiDB Operator 会自动处理 PD 和 TiKV 的 Leader 迁移。因此,在多节点的部署拓扑下(最小环境:PD \* 3、TiKV \* 3、TiDB \* 2),滚动更新 TiKV、PD 不会影响业务正常运行。对于有连接重试功能的客户端,滚动更新 TiDB 同样不会影响业务。

​注意事项​

​对于无法进行连接重试的客户端,滚动更新 TiDB 会导致连接到被关闭节点的数据库的连接失效,造成部分业务请求失败。对于这类业务,推荐在客户端添加重试功能,或者在低峰期进行 TiDB 的滚动更新操作。​​​​升级前,请参考​​​​文档​​​​确认没有正在进行的 DDL 操作。​

升级步骤

在TidbCluster中通过修改升级集群组件的镜像配置,一般修改​​spec.version​​即可,如果要为集群内不同组件设置不同的版本,修改 ​​spec、.version​​。

[root@k8s-master tidb]# kubectl apply -f tidb.yamltidbcluster.pingcap.com/lqb configured

查看升级进度

[root@k8s-master ~]# kubectl get pod -ntidb -wNAME                                  READY   STATUS      RESTARTS   AGEyz-discovery-68674b48b8-49vrl         1/1     Running     0          2d1hyz-pd-0                               1/1     Running     0          2d22hyz-pd-1                               1/1     Running     0          2d22hyz-pd-2                               1/1     Running     0          2m55syz-tidb-0                             2/2     Running     0          2d4hyz-tidb-1                             2/2     Running     0          2d22hyz-tidb-initializer-b8l8f             0/1     Completed   0          35dyz-tiflash-0                          4/4     Running     0          6d4hyz-tikv-0                             1/1     Running     0          2d4hyz-tikv-1                             1/1     Running     0          6d4hyz-tikv-2                             1/1     Running     2          3dyz-tikv-3                             1/1     Running     0          3dyz-pd-1                               1/1     Terminating   0          2d22hyz-pd-2                               1/1     Running       0          3m24syz-pd-1                               0/1     Terminating   0          2d22hyz-pd-1                               0/1     Terminating   0          2d22hyz-pd-1                               0/1     Terminating   0          2d22hyz-pd-1                               0/1     Pending       0          0syz-pd-1                               0/1     Pending       0          0syz-pd-1                               0/1     ContainerCreating   0          0syz-pd-1                               1/1     Running             0          1syz-pd-0                               1/1     Terminating         0          2d22hyz-pd-0                               0/1     Terminating         0          2d22hyz-pd-1                               1/1     Running             0          21syz-pd-0                               0/1     Terminating         0          2d22hyz-pd-0                               0/1     Terminating         0          2d22hyz-pd-0                               0/1     Pending             0          0syz-pd-0                               0/1     Pending             0          0syz-pd-0                               0/1     ContainerCreating   0          0syz-pd-0                               0/1     ErrImagePull        0          20syz-pd-0                               0/1     ImagePullBackOff    0          31s

查看集群升级是否完成

当所有 Pod 都重建完毕进入 ​​Running​​ 且TC都是True表示升级完成。

[root@k8s-master tidb]# kubectl get tc -ntidbNAME   READY   PD                  STORAGE   READY   DESIRE   TIKV                  STORAGE   READY   DESIRE   TIDB                  READY   DESIRE   AGElqb    True    pingcap/pd:v6.1.0   12Gi      3       3        pingcap/tikv:v6.1.0   12Gi      3       3        pingcap/tidb:v6.1.0   1       1        6d21hyz     True    pingcap/pd:v6.5.0   12Gi      3       3        pingcap/tikv:v6.5.0   12Gi      4       4        pingcap/tidb:v6.5.0   2       2        6d5h[root@k8s-master tidb]# kubectl get pod -ntidbNAME                                  READY   STATUS      RESTARTS   AGEtidbngmonitoring-yz-ng-monitoring-0   1/1     Running     1          4d13hyz-discovery-68674b48b8-49vrl         1/1     Running     0          2d2hyz-pd-0                               1/1     Running     0          55myz-pd-1                               1/1     Running     0          55myz-pd-2                               1/1     Running     0          59myz-tidb-0                             2/2     Running     0          35myz-tidb-1                             2/2     Running     0          38myz-tidb-initializer-b8l8f             0/1     Completed   0          35dyz-tikv-0                             1/1     Running     0          39myz-tikv-1                             1/1     Running     0          43myz-tikv-2                             1/1     Running     0          44myz-tikv-3                             1/1     Running     0          49m

升级出现故障解决方法

如果因为 PD 配置错误、PD 镜像 tag 错误、NodeAffinity 等相关的原因,导致 PD 集群不可用,此时无法成功升级 TiDB 集群版本。这种情况下,可使用 ​​force-upgrade​​ 强制升级集群以恢复集群功能。

强制升级步骤如下:

为集群设置annotation,并进行查看

[root@k8s-master tidb]# kubectl annotate --overwrite tc yz -n tidb tidb.pingcap.com/force-upgrade=truetidbcluster.pingcap.com/yz annotated

修改 PD 相关配置,确保 PD 进入正常状态。

修复 PD 配置后,删除刚才强制升级功能,否则下次升级过程可能会出现异常:

[root@k8s-master tidb]# kubectl annotate tc yz -n tidb tidb.pingcap.com/force-upgrade-tidbcluster.pingcap.com/yz annotated

完成上述步骤后,TiDB 集群功能将恢复正常,可以正常进行升级。

标签: 强制升级 不会影响 正常运行

上一篇:
下一篇: