K8s 部署的 TiDB 集群运维
Part I: Manage TiDB cluster in Kubernetes
配置
- 通过yaml文件
- 通过 kubectl apply -f xxx.yaml 应用配置
- 通过 kubectl edit tc ${cluster_name} -n ${namespace} 直接修改
- 缺点:需要配置一个严格和TiDB集群中组件一致的结构体
滚动升级
- 版本升级/修改集群配置
- tidb-controller-manager 实际上是使用了 StatefulSet 中 partition的功能,但没有使用原生
- 因为原生是删除pod再起一个,而TiKV/PD需要钱迁移leader
- 而且TiDB组件间有启动顺序
- 如果升级过程中某一个pod升级失败,升级步骤会终止,防止影响整个集群
- 在Rolling update TiDB组件过程中,client连接会中断,因此需要client有自动重连的机制
扩缩容
-
水平扩缩容
- 修改replicas并执行kubectl edit tidbcluster
- 扩容时需要注意原有的TiKV中是否有旧的数据,如果有需要清理掉
- 缩容时需要先delete store再删除pod
-
垂直扩容
- 需要有足够的资源去承担pod
- 更建议水平扩容
故障转移
- 如果底层StatefulSet 检测到某一个pod宕掉后,默认不会新启pod,因为需要保证pod name的唯一性
- 因此需要自我实现 - 在TiDB cluster 的status中记下failureMember/failureStores,依据这个内容去新启pod去补足宕掉的pod造成的影响
- 示意图 - 需要有足够的资源
故障转移厚的恢复
- TiDB / PD
- 如果之前的pod恢复了,operator会自动恢复TiDB和PD,并自动将之前新建的pod移除
- TiKV / TiFlash
- 当故障pod恢复,由于其中存有数据,operator并不会去做自动的恢复
- 需要手动的在业务低峰期去做恢复,将集群恢复至原有状态
Part II: Restarting, status and logs
重启集群组件
- 通过编辑TiDB cluster的 customer resource对想要重启的组件配置上一个annotation
- operator会将信息同步给各个StatefulSet,触发其rolling update
查看TiDB cluster 状态
-
kubectl get tc ${cluster_name} -n ${namespace} 获取集群全局状态
-
kubectl describe tc ${cluster_name} -n ${namespace} 获取集群所有的event
-
kubectl get tc ${cluster_name -n ${namespace} -oyaml 获取集群的yaml
-
kubectl describe sts -n {namespace} ${pod_name} 获取StatefulSet的状态
-
kubectl get sts -n ${namespace} ${pod_name} -oyaml 获取StatefulSet的yaml
-
kubectl get sve 获取集群中服务状态
查看TiDB 集群日志
- kubectl logs -n ${namespace} ${pod_name} 单独查看某个pod的日志
- kubectl logs -n ${namespace} ${pod_name} -c ${container_name} 单独查看这个pod对应的某个容器的日志
- kubectl get po -n ${namespace} 查看TiDB operator的日志
- rockdb的log目前需要进到容器中去查看(/var/lib/tikv/db/LOG)
Part III: Backup and Restore
operator支持的备份
- 全量备份 ad-hoc / 周期性备份
- 增量备份 通过BR来支持
通过BR来执行备份恢复
- 创建RBAC规则
- kubectl apply -f xxx.yaml -n ${namespace}
- 创建s3-secret里面需要包含访问s3的key
- kubectl create secret generic s3-secret --from-literal=access_key=xxx --from-literal=secret_key=yyy --namespace=${namespace}
- 创建TiDB的secret (为了operator来访问TiDB自动生成GC)
- kubectl create secret generic backup-demo1-tidb-secret --from-literal=password=${password} --namespace=${namespace}
通过dumpling/lightning/BR进行备份/恢复时,其核心是修改yaml配置文件以适用对应的场景
Part IV: Monitor
- metadata.namespace参数需要与TiDBCluster保持一致
- spec.clusters.name参数需要与TiDBCluster保持一致