Kubernetes 上的 TiDB 集群扩缩容

本文介绍 TiDB 在 Kubernetes 中如何进行水平扩缩容和垂直扩缩容。

水平扩缩容

TiDB 水平扩缩容操作指的是通过增加或减少节点的数量,来达到集群扩缩容的目的。扩缩容 TiDB 集群时,会按照填入的 replicas 值,对 PD、TiKV、TiDB 进行顺序扩缩容操作。扩容操作按照节点编号由小到大增加节点,缩容操作按照节点编号由大到小删除节点。目前 TiDB 集群使用 TidbCluster Custom Resource (CR) 管理方式。

扩缩容 PD、TiDB、TiKV

使用 kubectl 修改集群所对应的 TidbCluster 对象中的 spec.pd.replicasspec.tidb.replicasspec.tikv.replicas 至期望值。

同样,你可以使用以下命令在线修改 Kubernetes 集群中的 TidbCluster 定义。

kubectl edit tidbcluster ${cluster_name} -n ${namespace}

你可以通过以下指令查看 Kubernetes 集群中对应的 TiDB 集群是否更新到了你的期望定义。

kubectl get tidbcluster ${cluster_name} -n ${namespace} -oyaml

如果上述指令输出的 TidbCluster 中,spec.pd.replicasspec.tidb.replicasspec.tikv.replicas 的值和你之前更新的值一致,那么可以通过以下指令来观察 TidbCluster Pod 是否新增或者减少。对于 PD 和 TiDB 而言,会需要 10 到 30 秒左右的时间进行扩容或者缩容。对于 TiKV 组件,由于涉及到数据搬迁,可能会需要 3 到 5 分钟来进行扩容或者缩容。

watch kubectl -n ${namespace} get pod -o wide

扩容 TiFlash

如果集群中部署了 TiFlash,可以通过修改 spec.tiflash.replicas 对 TiFlash 进行扩容。

扩缩容 TiCDC

如果集群中部署了 TiCDC,可以通过修改 spec.ticdc.replicas 对 TiCDC 进行扩缩容。

缩容 TiFlash

  1. 通过 port-forward 暴露 PD 服务:

    kubectl port-forward -n ${namespace} svc/${cluster_name}-pd 2379:2379
  2. 打开一个终端标签或窗口,通过如下命令确认开启 TiFlash 的所有数据表的最大副本数 N:

    curl 127.0.0.1:2379/pd/api/v1/config/rules/group/tiflash | grep count

    输出结果中 count 的最大值就是所有数据表的最大副本数 N。

  3. 回到 port-forward 命令所在窗口,按 Ctrl+C 停止 port-forward

  4. 如果缩容 TiFlash 后,TiFlash 集群剩余 Pod 数大于等于所有数据表的最大副本数 N,直接进行下面第 6 步。如果缩容 TiFlash 后,TiFlash 集群剩余 Pod 数小于所有数据表的最大副本数 N,参考访问 TiDB 集群的步骤连接到 TiDB 服务,并针对所有副本数大于集群剩余 TiFlash Pod 数的表执行如下命令:

    alter table <db_name>.<table_name> set tiflash replica 0;
  5. 等待相关表的 TiFlash 副本被删除。

    连接到 TiDB 服务,执行如下命令,查不到相关表的同步信息时即为副本被删除:

    SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = '<db_name>' and TABLE_NAME = '<table_name>';
  6. 修改 spec.tiflash.replicas 对 TiFlash 进行缩容。

    你可以通过以下指令查看 Kubernetes 集群中对应的 TiDB 集群中的 TiFlash 是否更新到了你的期望定义。检查以下指令输出内容中,spec.tiflash.replicas 的值是否符合预期值。

    kubectl get tidbcluster ${cluster-name} -n ${namespace} -oyaml

查看集群水平扩缩容状态

watch kubectl -n ${namespace} get pod -o wide

当所有组件的 Pod 数量都达到了预设值,并且都进入 Running 状态后,水平扩缩容完成。

水平扩缩容故障

无论是水平扩缩容、或者是垂直扩缩容,都可能遇到资源不够时造成 Pod 出现 Pending 的情况。可以参考 Pod 处于 Pending 状态

垂直扩缩容

垂直扩缩容操作指的是通过增加或减少节点的资源限制,来达到集群扩缩容的目的。垂直扩缩容本质上是节点滚动升级的过程。目前 TiDB 集群使用 TidbCluster Custom Resource (CR) 管理方式。

垂直扩缩容操作

通过 kubectl 修改集群所对应的 TidbCluster 对象的 spec.pd.resourcesspec.tikv.resourcesspec.tidb.resources 至期望值。

如果集群中部署了 TiFlash,可以通过修改 spec.tiflash.resources 对 TiFlash 进行垂直扩缩容。

如果集群中部署了 TiCDC,可以通过修改 spec.ticdc.resources 对 TiCDC 进行垂直扩缩容。

查看垂直扩缩容进度

watch kubectl -n ${namespace} get pod -o wide

当所有 Pod 都重建完毕进入 Running 状态后,垂直扩缩容完成。

垂直扩缩容故障

无论是水平扩缩容、或者是垂直扩缩容,都可能遇到资源不够时造成 Pod 出现 Pending 的情况。可以参考 Pod 处于 Pending 状态