1、简介 TiDB Operator是 Kubernetes 上的 TiDB 集群自动运维系统,提供包括部署、升级、扩缩容、备份恢复、配置变更的 TiDB 全生命周期管理。借助 TiDB Operator,TiDB 可以无缝运行在公有云或私有部署的 Kubernetes 集群上,目前已开源 pingcap/tidb-operator 。 TiDB Operator 与适用的 TiDB 版本的对应关系如下: TiDB 版本 适用的 TiDB Operator 版本 dev dev TiDB >= 5.4 1.3 5.1 <= TiDB < 5.4 1.3(推荐),1.2 3.0 <= TiDB < 5.1 1.3(推荐),1.2,1.1 2.1 <= TiDB < v3.0 1.0(停止维护) 2、为什么需要TiDB Operator 第一,使用传统的自动化工具带来了很高的部署和运维成本。 TiDB 的分层架构对于分布式系统是比较常见的,各个组件都可以根据业务需求独立水平伸缩,并且 TiKV 和 TiDB 都可以独立使用。比如,在 TiKV 之上可以构建兼容 Redis 协议的 KV 数据库,而 TiDB 也可以对接 LevelDB 这样的 KV 存储引擎。但是,这种多组件的分布式系统增加了手工部署和运维的成本。一些传统的自动化部署和运维工具如 Puppet/Chef/SaltStack/Ansible,由于缺乏全局状态管理,不能及时对各种异常情况做自动故障转移,并且很难发挥分布式系统的弹性伸缩能力。其中有些还需要写大量的 DSL 甚至与 Shell 脚本一起混合使用,可移植性较差,维护成本比较高。 第二,在云时代容器成为应用分发部署的基本单位,Kubernetes 成为当前容器编排技术上的标准。 如今各大云厂商都开始提供托管的 Kubernetes 集群,部署在 Kubernetes 平台的应用可以不用绑定在特定云平台,轻松实现在各种云平台之间的迁移,其容器化打包和发布方式也解决了对操作系统环境的依赖。 为了在 Kubernetes 上部署和管理 TiDB 这种有状态的服务,我们需要扩展 StatefulSet 的功能。TiDB Operator 正是基于 Kubernetes 内置的 StatefulSet 开发的 TiDB 集群管理和运维工具。官方本地 PV 方案直到最近的 Kubernetes v1.10 才相对稳定地支持调度功能(需要运行在 Kubernetes v1.10 及以上版本),满足用户对本地 PV 的需求。为了降低用户的使用和管理成本并且拥抱 Kubernetes 开源社区,pingcap又重新基于官方的本地 PV 方案实现了对数据的管理。 3、架构
其中,TidbCluster、TidbMonitor、TidbInitializer、Backup、Restore、BackupSchedule、TidbClusterAutoScaler 是由 CRD(CustomResourceDefinition)定义的自定义资源:
- TidbCluster 用于描述用户期望的 TiDB 集群
- TidbMonitor 用于描述用户期望的 TiDB 集群监控组件
- TidbInitializer 用于描述用户期望的 TiDB 集群初始化 Job
- Backup 用于描述用户期望的 TiDB 集群备份
- Restore 用于描述用户期望的 TiDB 集群恢复
- BackupSchedule 用于描述用户期望的 TiDB 集群周期性备份
- TidbClusterAutoScaler 用于描述用户期望的 TiDB 集群自动伸缩 TiDB 集群的编排和调度逻辑则由下列组件负责:
- tidb-controller-manager 是一组 Kubernetes 上的自定义控制器。这些控制器会不断对比 TidbCluster 对象中记录的期望状态与 TiDB 集群的实际状态,并调整 Kubernetes 中的资源以驱动 TiDB 集群满足期望状态,并根据其他 CR 完成相应的控制逻辑;
- tidb-scheduler 是一个 Kubernetes 调度器扩展,它为 Kubernetes 调度器注入 TiDB 集群特有的调度逻辑。
- tidb-admission-webhook 是一个 Kubernetes 动态准入控制器,完成 Pod、StatefulSet 等相关资源的修改、验证与运维。
- discovery 是一个用于组件间发现的服务。每一个 TiDB 集群会对应存在一个 discovery Pod,用于该集群中组件发现其他已经创建的组件。 注意: tidb-scheduler 并不是必须使用,详情可以参考 tidb-scheduler 与 default-scheduler。
4、流程解析 下图是 TiDB Operator 的控制流程解析。从 TiDB Operator v1.1 开始,TiDB 集群、监控、初始化、备份等组件,都通过 CR 进行部署、管理。
整体的控制流程如下:
- 用户通过 kubectl 创建 TidbCluster 和其他 CR 对象,比如 TidbMonitor 等;
- TiDB Operator 会 watch TidbCluster 以及其它相关对象,基于集群的实际状态不断调整 PD、TiKV、TiDB 或者 Monitor 等组件的 StatefulSet、Deployment 和 Service 等对象;
- Kubernetes 的原生控制器根据 StatefulSet、Deployment、Job 等对象创建更新或删除对应的 Pod;
- 如果 TidbCluster 中配置组件使用 tidb-scheduler,PD、TiKV、TiDB 的 Pod 声明中会指定使用 tidb-scheduler 调度器。在调度对应 Pod 时,tidb-scheduler 会应用 TiDB 的特定调度逻辑。 基于上述的声明式控制流程,TiDB Operator 能够自动进行集群节点健康检查和故障恢复。部署、升级、扩缩容等操作也可以通过修改 TidbCluster 对象声明“一键”完成。 5、TiDB Operator 原理解析 Operator 本质上是 Kubernetes 的控制器(Controller),其核心思想是用户给定一个 Spec 描述文件,Controller 根据 Spec 的变化,在 Kubernetes 集群中创建对应资源,并且不断调整资源使其状态满足用户预期的 Spec。
上图是 TiDB Operator 工作流程原理图,其中 TidbCluster 是通过 CRD(Custom Resource Definition)扩展的内置资源类型:
- 用户通过 Helm 往 Kubernetes API Server 创建或更新 TidbCluster 对象。
- TiDB Operator 通过 watch API Server 中的 TidbCluster 对象创建更新或删除,维护 PD/TiKV/TiDB StatefulSet, Service 和 Deployment 对象更新。
- Kubernetes 根据 StatefulSet, Service 和 Deployment 对象创建更新或删除对应的容器和服务。 在第 2 步中,TiDB Operator 在更新 StatefulSet 等对象时会参考 PD API 给出的集群状态来做出 TiDB 集群的运维处理。通过 TiDB Operator 和 Kubernetes 的动态调度处理,创建出符合用户预期的 TiDB 集群。