【TiDB 4.0 PCTA 学习笔记】- 3.2.2 TiDB Cluster Operation(K8s 部署的 TiDB 集群运维)@2班+欧阳

课程名称:3.2.2 TiDB Cluster Operation(K8s 部署的 TiDB 集群运维)

学习时长:40min

课程收获:在 Kubernetes 集群上管理 TiDB 集群

课程内容:

  • 配置/升级

    • 配置YAML

    • 滚动更新

      • 当用户请求以下操作时,TiDB集群自动执行滚动更新

        • 升级集群版本
        • 更新集群配置(spec.configUpdateStrategy: RollingUpdate)
      • TIKV:停止前逐个迁移region leader

      • PD:停止前逐个迁移leader

      • 通过设置StatefulSet的"partition"字段,tidb-controller-manager控制更新过程

      • 顺序:PD → TiKV → Pump → TiDB → TiFlash → TiCDC

      • Pod order:逆序

      • 错误处理:Pod升级失败,会停下来重试,而不会继续升级,影响整个集群

      • 可能回影响客户端程序

  • 水平/垂直扩展

    • 水平扩展

      • 通过kubectl edit tidbcluster修改副本数

      • TiDB Operator会管理好诸如leader transfer等一致性

      • 有状态应用:缩容 不等于 删除Pod

      • 通知PD集群拓扑改变

        • PD缩容(pd-controller)

          • 移除成员
          • 删除Pod
        • TiKV缩容(tikv-controller)

          • 从PD删除store
          • 等改PD驱逐leader,迁移数据
          • 在store状态变为墓碑时,删除Pod
        • 注意点

          • 由于leader发生转移或驱逐,可能比较耗时
          • TiKV副本数不应小于配置的max-replicas数
          • TiDB缩容可能会影响客户端程序
    • 垂直扩展

      • 处置扩展 = 改变Pod的资源 = 滚动更新

        • 大多数情况下都倾向于水平扩展
        • TiKV/PD Pod是绑定到节点的(如果使用 Local PV),节点资源必须充足
  • 自动failover

    • 控制器从k8s和PD周期性地收集状态数据,从而发现故障

    • TiDB Operator增加新的副本后,将其注册为新的TiKV store,然后TiKV自动转移region数据到新副本中(需要额外的资源)

    • 对于PD和TiDB来说

      • 所有Pods恢复后,新建的Pods会被移除
    • 对TiKV和TiFlash来说

      • 故障Pod恢复后,不会自动移除新建Pod,因为可能会影响新能

      • 需要手动删除新建Pod

        • 比如TiKV,spec.tikv.recoverFailover:true( TiDB Operator >= v1.1.5)后,会自动删掉新建Pod
  • 重启集群

  • 检查TiDB集群状态

    • 全局状态:kubectl get tc basic -n default

    • tc event:kubectl describe tc basic -n default

    • yaml:kubectl get tc basic -n default -o yaml

    • StatefuleSet:kubectl get statefulset -n default

      • event:kubectl describe sts -n default basic-pd
      • kubectl get sts -n default basic-pd -o yaml
    • Service:kubectl get svc

      • basic-tidb.default.svc.cluster.local
      • Pod域名:basic-tidb-0.basic-tidb-peer.default.svc.cluster.local
  • 查看TiDB集群日志

    • 查看单独Pod的日志

      • kubectl logs -n ${namespace} ${pod_name}
    • 如果 Pod包含多个容器,可以查看Pod中某个容器日志

      • kubectl logs -n ${namespace} ${pod_name} -c ${container_name}
    • 查看TiDB Operator组件的log

      • kubectl get po -n tidb-admin
      • 然后即可查看对应组件的log
    • 从3.0开始,slow log和application log分离

      • 从名称为slowlog的sidecar容器中查看slow log

        • kubectl logs -n default basic-tidb-0 -c slowlog
      • rocksdb log

        • 进入容器:kubectl exec -it -n default basic-tikv-0 sh
        • cat /var/lib/tikv/db/LOG
  • 备份和恢复

    • TiDB Operator支持以下两种备份方式

      • 全量备份:即席或周期性
      • 增量备份:当前是BR,将来用PiTR(任意时间点恢复)
    • dumpling, lightning and BR

      • dumpling:逻辑全量备份
      • lightning:使用备份数据恢复TiDB集群
      • BR:备份/恢复
      • BR备份,BR恢复
      • dumpling备份,lightning恢复
    • TiDB Operator两种备份恢复方法

      • TiDB Operator < v1.1,用Helm charts
      • >= v1.1,使用CRD
    • 使用BR备份数据到S3

      • 创建RBAC资源

      • 创建s3-secret

        • kubectl create secret generic s3-secret --from-literal=access-key=xxx --from-literal=secret-key=yyy --namespace=test1
      • 创建backup-demo1-tidb-secret,保存TiDB集群的密码

        • kubectl create secret generic backup-demo1-tidb-secret --from-literal=password=${password} --namespace=test1
      • 全量备份

        • kubectl apply -f back-aws-s3.yaml

        • 检查pod状态和S3结果

          • kubectl get pods -n ${namespace}
    • 使用dumpling备份到S3

      • 全量备份

        • kubectl apply -f backup-s3.yaml

        • 检查pod状态和S3结果

          • kubectl get pods -n ${namespace}
    • 使用BR从S3恢复

      • 全量恢复

        • kubectl apply -f restore-aws-s3.yaml

        • 检查pod状态和S3结果

          • kubectl get pods -n ${namespace}
    • 使用Lightning从S3恢复

      • 执行全量恢复

        • kubectl apply -f restoe-s3.yaml

        • 检查pod状态和S3结果

          • kubectl get pods -n ${namespace}
    • 使用Lightning和Importer恢复

      • tikv-importer安装

        • 使用helm生成部署tikv-importer的yaml文件

          • helm repo update
          • helm search tikv-importer -l
          • helm inspect values pingcap/tikv-importer --version=v1.1.4 > values.yaml
          • vim values.yaml
          • jpg
        • 安装tikv-importer

          • helm install pingcap/tikv-importer --name=${cluster_name} --namespace=${namespace} --version=${chart_version} -f values.yaml
      • Lightning安装

        • helm inspect values pingcap/tidb-lightning --version=v1.1.4 > tidb-lightning-values.yaml
        • edit yaml
        • helm install pingcap/tidb-lightning --name=${release_name} --namespace=${namespace} --set FailFast=true --version=${chart_version} -f tidb-lightning-values.yaml
  • 监控

学习过程中遇到的问题或延伸思考:

学习过程中参考的其他资料