课程名称:课程版本(101/201/301)+ 课程名称
学习时长:1H
课程收获:
在 Kubernetes 集群上管理 TiDB 集群
课程内容:
- 配置/升级
- 配置YAML
- toml to yaml,可使用工具
- tidb-cluster.yaml
- kubectl apply -f tidb-cluster.yaml
- 直接修改配置:kubectl edit tc${cluster_name} -n ${namespace}
- TOML
- 滚动更新
-
当用户请求以下操作时,TiDB集群自动执行滚动更新
- 升级集群版本
- 更新集群配置(spec.configUpdateStrategy: RollingUpdate)
-
TIKV:停止前逐个迁移region leader
-
PD:停止前逐个迁移leader
-
通过设置StatefulSet的"partition"字段,tidb-controller-manager控制更新过程
-
顺序:PD → TiKV → Pump → TiDB → TiFlash → TiCDC
-
Pod order:逆序
-
错误处理:Pod升级失败,会停下来重试,而不会继续升级,影响整个集群
-
可能回影响客户端程序
- 解决方法:客户端连接检查,比如testOnBorrow
-
- 配置YAML
- 水平/垂直扩展
- 水平扩展
- 通过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缩容可能会影响客户端程序
- PD缩容(pd-controller)
- 垂直扩展
- 处置扩展 = 改变Pod的资源 = 滚动更新
- 大多数情况下都倾向于水平扩展
- TiKV/PD Pod是绑定到节点的(如果使用 Local PV),节点资源必须充足
- 处置扩展 = 改变Pod的资源 = 滚动更新
- 水平扩展
- 自动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
-
- 重启集群
- 通过kubectl edit tc ${cluster_name} -n ${namepsace}来添加annotation
- 通过kubectl edit tc ${cluster_name} -n ${namepsace}来添加annotation
- 检查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
- 从名称为slowlog的sidecar容器中查看slow log
- 查看单独Pod的日志
- 备份和恢复
- 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资源
- wget https://raw.githubusercontent.com/pingcap/tidb-operator/master/manifests/backup/backup-rbac.yaml
- kubectl apply -f backup-rback.yaml -n test1
- 创建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}
- kubectl apply -f back-aws-s3.yaml
- 创建RBAC资源
- 使用dumpling备份到S3
- 全量备份
- kubectl apply -f backup-s3.yaml
-
先备份到PVC,在上传到S3
- 检查pod状态和S3结果
- kubectl get pods -n ${namespace}
- kubectl apply -f backup-s3.yaml
- 全量备份
- 使用BR从S3恢复
- 全量恢复
- kubectl apply -f restore-aws-s3.yaml
- 检查pod状态和S3结果
- kubectl get pods -n ${namespace}
- kubectl apply -f restore-aws-s3.yaml
- 全量恢复
- 使用Lightning从S3恢复
- 执行全量恢复
- kubectl apply -f restoe-s3.yaml
-
从S3拉数据到PVC,然后Lightning读取数据恢复
- 检查pod状态和S3结果
- kubectl get pods -n ${namespace}
- kubectl apply -f restoe-s3.yaml
- 执行全量恢复
- 使用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
- 安装tikv-importer
- helm install pingcap/tikv-importer --name=${cluster_name} --namespace=${namespace} --version=${chart_version} -f values.yaml
- 使用helm生成部署tikv-importer的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
- TiDB Operator支持以下两种备份方式
- 监控
-
metadata.namespace要和TiDB集群一致
-
spec.clusters.name要和TiDB集群一致
-
持久化监控数据
-
非TLS可以一个Monitor监控多个集群