TiDB操作员源代码读取(III):组件控制回路

2021-07-21 谊文陈 工程类

作者:谊文陈(TiDB操作员、PingCAP软件工程师提交人)

转接器:冉黄编辑:汤姆德万

TiDB操作员源代码读取(III):组件控制回路

本系列以前的文章:

在我最后一篇文章,我介绍了我们如何设计和实现tidb-controller-manager控制器的内部逻辑以及每个控制器接收和处理更改的方式。这次,我将描述如何实现组件控制器。

潮团控制器管理TiDB中主要组件的生命周期。我要潮团并以实例介绍了元件控制回路的设计。您将了解在TiDB群集生命周期管理期间如何编排控制循环事件,以及这些事件如何管理资源。

本文只是对这些过程和定义的一般介绍。下一篇文章将介绍每个组件的具体应用程序。现在,让我们开始吧。

调用组件控制循环

在关于控制器内部逻辑,我提到UpdateDbCluster的函数潮团控制器,位于包裹/控制器/ tidbcluster / tidb_cluster_control.go.作为TiDB组件生命周期管理的入口,该函数调用一系列生命周期管理函数:

  • c、 ReceivePolicyManager.Sync(tc)
  • c、 孤儿袋清洁器(tc)
  • c、 discoveryManager.confidence(tc)
  • c、 ticdcMemberManager.Sync(tc)
  • c、 tiflashMemberManager.Sync(tc)
  • c、 pdMemberManager.Sync(tc)
  • c、 tikvMemberManager.Sync(tc)
  • c、 pumpMemberManager.Sync(tc)
  • c.tidbMemberManager.Sync (tc)
  • c.metaManager.Sync (tc)
  • c.pvcCleaner.Clean (tc)
  • c.pvcResizer.Resize (tc)
  • c、 tidbClusterStatusManager.Sync(tc)

这些功能分为两类:

  • TiDB组件控制回路的实现,例如PD、TiDB、TiKV、TiFlash、TiCDC、泵和Discovery。
  • TiDB组件使用的Kubernetes资源的管理其他组件的生命周期管理,例如维护PV的回收策略、清理孤立的Pods、维护Kubernetes资源的元信息、清理和扩展pvc,以及管理状态潮团对象

TiDB组件的生命周期管理过程

TiDB主要部件的控制回路代码位于目录中包装/经理/成员文件的结尾是_会员经理,如pd_member_manager.go.这些文件引用其他实现缩放和升级特性的文件,例如_去吧_升级机

_会员经理文件的组件,我们可以识别通用实现:

//同步服务如果犯错误:=syncServiceForTidbClustertc犯错误! =返回犯错误//同步无头服务如果犯错误:=syncHeadlessServiceForTidbClustertc犯错误! =返回犯错误//同步状态集返回syncStatefulSetForTidbClustertcfuncsyncStatefulSetForTidbClustertcV11字母潮团错误如果犯错误:=星团状态tc老套犯错误! =klog错误无法同步TidbCluster:[%s/%s]的状态,错误:%vnstcName犯错误如果tc规格停顿klogV4Infoftidb群集%s/%s已暂停,跳过状态集的同步tcGetNamespacetcGetName返回厘米犯错误:=同步配置映射tc老套新闻集犯错误:=getnewSetForTidbClustertc厘米如果犯错误:=定标器规模tc老套新闻集犯错误! =返回犯错误如果犯错误:=故障转移故障转移tc犯错误! =返回犯错误如果犯错误:=升级机升级tc老套新闻集犯错误! =返回犯错误返回UpdateStatefulSetdeps状态设置控件tc新闻集老套

上面的代码执行两个主要任务:

  • 同步服务:为TiDB组件创建或同步服务资源。
  • 同步StatefulSet:
    • 同步组件状态。
    • 检查是否潮团停止同步。
    • 同步ConfigMap。
    • 根据中的配置生成新的StatefulSet潮团并对新状态集执行相关操作,例如滚动更新、向外扩展、向内扩展和故障切换。
    • 创建或更新StatefulSet。

组件控制循环重复执行上述任务,以确保组件保持最新状态。

下面几节介绍在控制回路中完成的具体工作。

同步服务

当组件协调开始时,服务协调也开始。此过程创建并同步组件使用的服务,如cluster1 pd群集1 pd对等

控制循环函数调用getNewServiceForTidbCluster函数,它根据中记录的信息创建新的服务模板潮团自定义资源(CR)。如果服务不存在,则控制循环函数创建一个服务;如果服务存在,它将比较旧的服务规范和新的服务规范,并确定是否更新服务对象。

服务和Headless服务都允许组件被其他人访问。

  • 如果组件不需要知道它正在与哪个实例通信,以及组件是否支持负载平衡,例如当TiKV和TiDB访问Placement Driver (PD)时,组件将使用Service。
  • 如果组件需要知道哪个Pod提供服务,它使用Headless service进行通信豆荚DNS.例如,当TiKV启动时,它将其Pod DNS暴露为广告地址,以便其他Pod可以通过Pod DNS访问TiKV。

同步状态集

同步服务后,组件将连接到群集网络,因此它们可以访问群集并从群集中进行访问。控制回路进入控制回路syncStatefulSetForTidbCluster函数并开始协调StatefulSet。

协调StatefulSet的第一步是通过运行星团状态然后,根据状态信息,将执行其他操作,如升级、向内扩展、向外扩展和故障切换。

同步组件状态

TiDB操作员的关键操作之一是同步组件状态。状态信息包括:

  • Kubernetes的组件信息,包括群集中副本的数量、更新状态和映像版本。TiDB运算符还检查StatefulSet是否在更新过程中。
  • TiDB的内部群集信息。TiDB操作员同步来自PD的信息,包括关于PD成员、TiKV存储和TiDB成员的信息。TiDB操作员还对TiDB进行健康检查。

检查TiDB群集是否暂停同步

同步状态后,TiDB操作员通过检查来确定集群是否停止同步tc.Spec.Paused.如果同步暂停,TiDB Operator将跳过以下所有更新StatefulSet的操作。

同步配置映射

同步状态后,将显示同步配置映射函数更新ConfigMap,其中包含组件的配置文件和启动脚本。

配置文件是从配置项目规格YAML文件的。TiDB操作员支持直接使用TOML配置(推荐)或从YAML转换配置。

启动脚本包含组件所需的启动参数,并使用这些参数启动组件进程。

当组件需要从TiDB Operator获取启动参数时,信息处理在发现组件中执行。例如,当PD需要使用参数来确定是否应该初始化节点或加入节点时,它使用wget访问发现并获取参数。通过从启动脚本获取参数,TiDB操作符可以在更新StatefulSet时避免意外的滚动更新。这可能会影响在线服务。

生成一个新的StatefulSet

getNewPDSetForTidbCluster函数获取一个新的StatefulSet模板,该模板包含新生成的服务和ConfigMap的引用。该函数使用最新状态和规范生成其他项,例如环境容器,及体积

然后,这个新的状态集将经历三个过程:滚动更新、扩展和故障切换UpdateStatefulSet函数比较现有的StatefulSet和新的StatefulSet,并确定是否更新现有的StatefulSet。

滚动更新

m、 升级,升级函数执行与滚动更新(主要是更新)相关的操作升级策略。类型UpgradeStrategy。分区在州里。

使用StatefulSet中的滚动更新策略执行滚动更新操作。当组件被协调时,它将StatefulSet的更新策略设置为滚动更新。在Kubernetes中,您可以通过配置来控制滚动更新进度UpgradeStrategy。分区. StatefulSet仅更新之前未更新且ID大于或等于的POD值UpgradeStrategy。分区. TiDB操作员使用此机制确保每个Pod只有在能够正常向外部应用程序提供服务后才进行滚动更新。

当集群未被更新或刚刚处于更新的开始阶段时,组件协调设置UpgradeStrategy。分区到状态集中最大的Pod ID。这可以防止任何Pod被更新。更新开始后,当Pod更新并在重启后提供服务时,Pod被视为已成功升级。然后,TiDB运算符将UpgradeStrategy。分区值并更新下一个Pod。

放大和缩小

m.scaler.Scale缩放组件的输入和输出。它的主要任务是更新复制品状态集合中组件的名称。

m.scaler.Scale函数一步一步地对组件进行缩放。它比较了复制品对于中的组件潮团CR(例如tc.Spec.PD.Replicas)随着水流复制品. 基于此,它确定是向外扩展还是在组件中扩展,并在一个复制副本上执行扩展操作。然后进入下一轮的组成部分对账。通过多轮和解,,m.scaler.Scale完成所有缩放要求。

在扩展过程中,PD需要转移Leader,TiKV需要删除Store。这些操作使用PD API。在对账过程中m.scaler.Scale功能使用PD接口执行操作,查看操作是否成功。如果是,则转移到下一个缩放操作。

故障转移

m、 故障转移功能用于执行灾难恢复的相关操作,包括发现失败、记录失败状态和从失败中恢复。

如果启用AutoFailover在部署TiDB Operator时,TiDB Operator会监控组件的故障状态。当发现一个故障时,TiDB Operator将故障信息记录到FailureStoresFailureMembers. 接下来,它启动一个新的组件吊舱来接管故障吊舱的工作负载。故障Pod恢复后,TiDB操作员修改状态集合中的副本数量,以在新Pod中扩展。

当TiDB操作员对TiKV和TiFlash执行故障切换时,默认情况下,新创建的Pod不会按比例放大。您需要配置spec.tikv.recoverFailover:真在中启用自动缩放。

更新现有的StatefulSet

在最后一个阶段,将创建新的StatefulSetUpdateStatefulSet函数,该函数比较新的StatefulSet和现有的StatefulSet。如果两个StatefulSet不一致,则该函数更新现有的StatefulSet。

该函数还检查是否存在不由TiDB Operator管理的状态集。由于早期版本的TiDB Operator使用Helm Chart部署TiDB,TiDB Operator需要向这些旧的状态集添加依赖项标记,并将其包括在生命周期管理中。

通过以上操作,可以查看潮团CR升级到最新版本。创建相应的Service和ConfigMap。生成新的StatefulSet,它执行滚动更新、扩展和故障转移。组件协调继续进行,监视组件的生命周期并响应生命周期状态的更改和用户指定的更改。整个集群运行正常。

其他生命周期管理任务

除了协调TiDB中的主要组件外,其他生命周期管理操作由以下功能执行:

  • Discovery配置PD启动参数和TiDB Dashboard Proxy。它为组件提供了要使用的动态信息,避免了修改ConfigMap而导致Pod滚动更新。
  • 回收策略管理器同步的配置tc.Spec.PVP政策. 默认情况下,PV回收策略设置为保留降低数据丢失的风险。
  • 孤立豆荚清洁器在无法创建PVC时清理豆荚。然后StatefulSet控制器再次尝试创建pod和相应的pvc。
  • PVC清洁剂去除标记为可删除的PVC。
  • PVC Resizer可扩展PVC。在云中运行TiDB Operator时,您可以通过在中修改存储配置来更改PVC的大小潮团
  • 元管理器同步StoreIDLabel成员标签,及名称空间标签添加到POD、PVC和PVs的标签。
  • TiDBCluster Status Manager同步相关的信息潮汐监测仪和TiDB仪表板。

总结

至此,您已经了解了TiDB组件控制回路的设计,包括:

  • 协调函数如何遵循它们相应的程序来检查组件资源
  • 协调功能如何将用户的期望状态转换为实际组件状态

TiDB运算符中几乎所有的控制回路都符合本文描述的设计逻辑。在以后的文章中,我将进一步解释如何将此逻辑应用于每个组件以管理组件生命周期。

如果您对TiDB操作员有任何疑问或想法,请随时联系加入我们的休闲频道或者加入我们在pingcap / tidb-operator

TiDB操作员

准备好开始使用TiDB了吗?