10.TiPD 调度

调度概述

PD 是 TiDB 集群的管理模块,同时也负责集群数据的实时调度。本文档介绍一下 PD 的设计思想和关键概念。

场景描述

TiKV 集群是 TiDB 数据库的分布式 KV 存储引擎,数据以 Region 为单位进行复制和管理,每个 Region 会有多个 Replica(副本),这些 Replica 会分布在不同的 TiKV 节点上,其中 Leader 负责读/写,Follower 负责同步 Leader 发来的 Raft log。

需要考虑以下场景:

  • 为了提高集群的空间利用率,需要根据 Region 的空间占用对 Replica 进行合理的分布。

  • 集群进行跨机房部署的时候,要保证一个机房掉线,不会丢失 Raft Group 的多个 Replica。

  • 添加一个节点进入 TiKV 集群之后,需要合理地将集群中其他节点上的数据搬到新增节点。

  • 当一个节点掉线时,需要考虑快速稳定地进行容灾。

    • 从节点的恢复时间来看

      • 如果节点只是短暂掉线(重启服务),是否需要进行调度。

      • 如果节点是长时间掉线(磁盘故障,数据全部丢失),如何进行调度。

    • 假设集群需要每个 Raft Group 有 N 个副本,从单个 Raft Group 的 Replica 个数来看

      • Replica 数量不够(例如节点掉线,失去副本),需要选择适当的机器的进行补充。

      • Replica 数量过多(例如掉线的节点又恢复正常,自动加入集群),需要合理的删除多余的副本。

  • 读/写通过 Leader 进行,Leader 的分布只集中在少量几个节点会对集群造成影响。

  • 并不是所有的 Region 都被频繁的访问,可能访问热点只在少数几个 Region,需要通过调度进行负载均衡。

  • 集群在做负载均衡的时候,往往需要搬迁数据,这种数据的迁移可能会占用大量的网络带宽、磁盘 IO 以及 CPU,进而影响在线服务。

以上问题和场景如果多个同时出现,就不太容易解决,因为需要考虑全局信息。同时整个系统也是在动态变化的,因此需要一个中心节点,来对系统的整体状况进行把控和调整,所以有了 PD 这个模块。

调度的需求

对以上的问题和场景进行分类和整理,可归为以下两类:

第一类:作为一个分布式高可用存储系统,必须满足的需求,包括几种:

  • 副本数量不能多也不能少

  • 副本需要根据拓扑结构分布在不同属性的机器上

  • 节点宕机或异常能够自动合理快速地进行容灾

第二类:作为一个良好的分布式系统,需要考虑的地方包括:

  • 维持整个集群的 Leader 分布均匀

  • 维持每个节点的储存容量均匀

  • 维持访问热点分布均匀

  • 控制负载均衡的速度,避免影响在线服务

  • 管理节点状态,包括手动上线/下线节点

满足第一类需求后,整个系统将具备强大的容灾功能。满足第二类需求后,可以使得系统整体的资源利用率更高且合理,具备良好的扩展性。

为了满足这些需求,首先需要收集足够的信息,比如每个节点的状态、每个 Raft Group 的信息、业务访问操作的统计等;其次需要设置一些策略,PD 根据这些信息以及调度的策略,制定出尽量满足前面所述需求的调度计划;最后需要一些基本的操作,来完成调度计划。

调度的基本操作

调度的基本操作指的是为了满足调度的策略。上述调度需求可整理为以下三个操作:

  • 增加一个 Replica

  • 删除一个 Replica

  • 将 Leader 角色在一个 Raft Group 的不同 Replica 之间 transfer(迁移)。

刚好 Raft 协议通过 AddReplica、RemoveReplica、TransferLeader 这三个命令,可以支撑上述三种基本操作。

信息收集

调度依赖于整个集群信息的收集,简单来说,调度需要知道每个 TiKV 节点的状态以及每个 Region 的状态。TiKV 集群会向 PD 汇报两类消息,TiKV 节点信息和 Region 信息:

每个 TiKV 节点会定期向 PD 汇报节点的状态信息

TiKV 节点(Store)与 PD 之间存在心跳包,一方面 PD 通过心跳包检测每个 Store 是否存活,以及是否有新加入的 Store;另一方面,心跳包中也会携带这个 Store 的状态信息,主要包括:

  • 总磁盘容量

  • 可用磁盘容量

  • 承载的 Region 数量

  • 数据写入/读取速度

  • 发送/接受的 Snapshot 数量(Replica 之间可能会通过 Snapshot 同步数据)

  • 是否过载

  • labels 标签信息(标签是具备层级关系的一系列 Tag,能够感知拓扑信息

每个 Raft Group 的 Leader 会定期向 PD 汇报 Region 的状态信息

每个 Raft Group 的 Leader 和 PD 之间存在心跳包,用于汇报这个Region 的状态,主要包括下面几点信息:

  • Leader 的位置

  • Followers 的位置

  • 掉线 Replica 的个数

  • 数据写入/读取的速度

PD 不断的通过这两类心跳消息收集整个集群的信息,再以这些信息作为决策的依据。

除此之外,PD 还可以通过扩展的接口接受额外的信息,用来做更准确的决策。比如当某个 Store 的心跳包中断的时候,PD 并不能判断这个节点是临时失效还是永久失效,只能经过一段时间的等待(默认是 30 分钟),如果一直没有心跳包,就认为该 Store 已经下线,再决定需要将这个 Store 上面的 Region 都调度走。

但是有的时候,是运维人员主动将某台机器下线,这个时候,可以通过 PD 的管理接口通知 PD 该 Store 不可用,PD 就可以马上判断需要将这个 Store 上面的 Region 都调度走。

调度的策略

PD 收集了这些信息后,还需要一些策略来制定具体的调度计划。

一个 Region 的 Replica 数量正确

当 PD 通过某个 Region Leader 的心跳包发现这个 Region 的 Replica 数量不满足要求时,需要通过 Add/Remove Replica 操作调整 Replica 数量。出现这种情况的可能原因是:

  • 某个节点掉线,上面的数据全部丢失,导致一些 Region 的 Replica 数量不足

  • 某个掉线节点又恢复服务,自动接入集群,这样之前已经补足了 Replica 的 Region 的 Replica 数量过多,需要删除某个 Replica

  • 管理员调整了副本策略,修改了 max-replicas 的配置

一个 Raft Group 中的多个 Replica 不在同一个位置

注意这里用的是『同一个位置』而不是『同一个节点』。在一般情况下,PD 只会保证多个 Replica 不落在一个节点上,以避免单个节点失效导致多个 Replica 丢失。在实际部署中,还可能出现下面这些需求:

  • 多个节点部署在同一台物理机器上

  • TiKV 节点分布在多个机架上,希望单个机架掉电时,也能保证系统可用性

  • TiKV 节点分布在多个 IDC 中,希望单个机房掉电时,也能保证系统可用性

这些需求本质上都是某一个节点具备共同的位置属性,构成一个最小的『容错单元』,希望这个单元内部不会存在一个 Region 的多个 Replica。这个时候,可以给节点配置 labels 并且通过在 PD 上配置 location-labels 来指名哪些 label 是位置标识,需要在 Replica 分配的时候尽量保证一个 Region 的多个 Replica 不会分布在具有相同的位置标识的节点上。

副本在 Store 之间的分布均匀分配

由于每个 Region 副本中存储的数据容量上限是固定的,通过维持每个节点上面副本数量的均衡,使得各节点间承载的数据更均衡。

Leader 数量在 Store 之间均匀分配

Raft 协议要求读取和写入都通过 Leader 进行,所以计算的负载主要在 Leader 上面,PD 会尽可能将 Leader 在节点间分散开。

访问热点数量在 Store 之间均匀分配

每个 Store 以及 Region Leader 在上报信息时携带了当前访问负载的信息,比如 Key 的读取/写入速度。PD 会检测出访问热点,且将其在节点之间分散开。

各个 Store 的存储空间占用大致相等

每个 Store 启动的时候都会指定一个 Capacity 参数,表明这个 Store 的存储空间上限,PD 在做调度的时候,会考虑节点的存储空间剩余量。

控制调度速度,避免影响在线服务

调度操作需要耗费 CPU、内存、磁盘 IO 以及网络带宽,需要避免对线上服务造成太大影响。PD 会对当前正在进行的操作数量进行控制,默认的速度控制是比较保守的,如果希望加快调度(比如停服务升级或者增加新节点,希望尽快调度),那么可以通过调节 PD 参数动加快调度速度。

调度的实现

本节介绍调度的实现

PD 不断地通过 Store 或者 Leader 的心跳包收集整个集群信息,并且根据这些信息以及调度策略生成调度操作序列。每次收到 Region Leader 发来的心跳包时,PD 都会检查这个 Region 是否有待进行的操作,然后通过心跳包的回复消息,将需要进行的操作返回给 Region Leader,并在后面的心跳包中监测执行结果。

注意这里的操作只是给 Region Leader 的建议,并不保证一定能得到执行,具体是否会执行以及什么时候执行,由 Region Leader 根据当前自身状态来定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TiDB(“ Ti”代表Titanium)是一个开源的NewSQL数据库,它支持混合事务处理和分析处理(HTAP)工作负载。它与MySQL兼容,具有水平可伸缩性,强一致性和高可用性。 TiDB特点: 水平可伸缩性 TiDB只需添加新节点即可扩展SQL处理和存储。与仅纵向扩展的传统关系数据库相比,这使基础架构容量规划既简单又更具成本效益。 MySQL兼容语法 TiDB就像它是应用程序的MySQL 5.7服务器一样。您可以继续使用所有现有的MySQL客户端库,并且在许多情况下,您无需在应用程序中更改任何代码行。因为TiDB是从头开始构建的,而不是MySQL分支,所以请查看已知兼容性差异列表。 具有高度一致性的分布式事务 TiDB在内部将表分片为基于范围的小块,我们将其称为“区域”。每个区域的默认大小约为100MiB,并且TiDB在内部使用两阶段提交以确保以事务一致的方式维护区域。 云原生 TiDB旨在在公共,私有或混合云中工作,从而简化了部署,供应,操作和维护。 TiDB的存储层,称为TiKV,成为一个云计算原住民基金会在2018年会员项目TiDB平台的架构还允许SQL处理和存储在一个非常云友好的方式相互独立的缩放。 最小化ETL TiDB旨在支持事务处理(OLTP)和分析处理(OLAP)工作负载。这意味着,尽管您可能传统上已经在MySQL上进行了事务处理,然后将提取,转换和加载(ETL)数据提取到列存储中进行分析处理,但不再需要此步骤。 高可用性 TiDB使用Raft共识算法来确保数据高度可用,并在Raft组中的整个存储中安全地进行复制。如果发生故障,Raft组将自动为故障成员选出新的领导者,并自动修复TiDB集群,而无需任何手动干预。失败和自我修复操作对应用程序也是透明的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值