课程名称:课程版本(301)+ 3.2.2 TiDB Cluster Operation(K8s 部署的 TiDB 集群运维)
学习时长:40分钟
课程收获:学习了K8S部署的TiDB运维方式以及相关的操作命令
课程内容:
- 配置yaml
配置TOML - 滚动升级:
1) 当用户有如下请求时,TiDB集群自动执行滚动更新:
升级集群版本
修改集群配置(spec.configUpdateStrategy: RollingUpdate)
TIKV:停止前逐个迁移region leader
PD:停止前逐个迁移leader
通过设置StatefulSet的"partition"字段,tidb-controller-manager控制更新过程
2) 组件排序:PD -> TiKV -> Pump -> TiDB -> TiFlash -> TiCDC
Pod order:逆序
错误处理:Pod升级失败,会停下来重试,而不会继续升级,影响整个集群
3) 可能会影响客户端程序的访问,解决方案:客户端连接检查,例如testOnBorrow - 扩缩容
1) 水平扩展
通过kubectl edit tidbcluster修改副本数
TiDB Operator会管理好诸如leader transfer等一致性
有状态应用:缩容 不等于 删除Pod
通知PD集群拓扑改变
A) PD缩容(pd-controller):移除成员,删除Pod
B) TiKV缩容(tikv-controller):从PD删除store,等改PD驱逐leader,迁移数据,在store状态变为墓碑时,删除Pod
C) 注意点:由于leader发生转移或驱逐,可能比较耗时,TiKV副本数不应小于配置的max-replicas,TiDB缩容可能会影响客户端程序
2) 垂直扩展处置扩展 = 改变Pod的资源 = 滚动更新
- 大多数情况下都倾向于水平扩展
- TiKV/PD Pod是绑定到节点的(如果使用 Local PV),节点资源必须充足
- 自动failover
1) 控制器从k8s和PD周期性地收集状态数据,从而发现故障
2) TiDB Operator增加新的副本后,将其注册为新的TiKV store,然后TiKV自动转移region数据到新副本中(需要额外的资源)
3) 对于PD和TiDB来说,所有Pods恢复后,新建的Pods会被移除
4) 对TiKV和TiFlash来说,故障Pod恢复后,不会自动移除新建Pod,因为可能会影响新能,需要手动删除新建Po,比如TiKV,spec.tikv.recoverFailover:true( TiDB Operator >= v1.1.5)后,会自动删掉新建Pod - 重启集群,通过kubectl edit tc ${cluster_name} -n ${namepsace}来添加annotation
- 检查TiDB集群状态
1) 全局状态:kubectl get tc basic -n default
2) tc event:kubectl describe tc basic -n default
3) yaml:kubectl get tc basic -n default -o yaml
4) StatefuleSet:kubectl get statefulset -n default
5) event:kubectl describe sts -n default basic-pd
6) kubectl get sts -n default basic-pd -o yaml
7) Service:kubectl get svc,basic-tidb.default.svc.cluster.local,Pod域名:basic-tidb-0.basic-tidb-peer.default.svc.cluster.local - 查看TiDB集群日志
1) 查看单独Pod的日志
kubectl logs -n ${namespace} ${pod_name}
2) 如果 Pod包含多个容器,可以查看Pod中某个容器日志
kubectl logs -n ${namespace} ${pod_name} -c ${container_name}
3) 查看TiDB Operator组件的log
kubectl get po -n tidb-admin
然后即可查看对应组件的log
4) 从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
- 备份和恢复
1) TiDB Operator支持以下两种备份方式
全量备份:即席或周期性
增量备份:当前是BR,将来用PiTR(任意时间点恢复)
2) dumpling, lightning and BR
dumpling:逻辑全量备份
lightning:使用备份数据恢复TiDB集群
BR:备份/恢复
BR备份,BR恢复
dumpling备份,lightning恢复
3) TiDB Operator两种备份恢复方法,TiDB Operator < v1.1,用Helm charts>= v1.1,使用CRD
4) 使用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结果
a) kubectl get pods -n ${namespace}
5) 使用dumpling备份到S3
i. 全量备份 - kubectl apply -f backup-s3.yaml
a) 先备份到PVC,在上传到S3 - 检查pod状态和S3结果
a) kubectl get pods -n ${namespace}
6) 使用BR从S3恢复
全量恢复 - kubectl apply -f restore-aws-s3.yaml
- 检查pod状态和S3结果
a) kubectl get pods -n ${namespace}
7) 使用Lightning从S3恢复
执行全量恢复 - kubectl apply -f restoe-s3.yaml,从S3拉数据到PVC,然后Lightning读取数据恢复
- 检查pod状态和S3结果,kubectl get pods -n ${namespace}
8) 使用Lightning和Importer恢复tikv-importer安装 - 使用helm生成部署tikv-importer的yaml文件
a) helm repo update
b) helm search tikv-importer -l
c) helm inspect values pingcap/tikv-importer --version=v1.1.4 > values.yaml
d) vim values.yaml - 安装tikv-importer
a) helm install pingcap/tikv-importer --name=${cluster_name} --namespace=${namespace} --version=${chart_version} -f values.yaml
b) 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
- 监控
1) metadata.namespace要和TiDB集群一致
2) spec.clusters.name要和TiDB集群一致
3) 持久化监控数据
4) 非TLS可以一个Monitor监控多个集群