# 调度
调度概述
TiKV集群是分布式KV存储系统,数据以Region为单位进行复制和管理,每个Region会有多个副本,Leader负责读写,Follower负责同步Leader的Raft Log
调度的目的:
- 保证Region的多个副本分布在不同的机房、节点;
- 保证Region的Leader副本分布的均衡;
- 新节点加入、下线,数据重分配,协调负载均衡的过程,避免影响线上服务
分布式高可用存储系统:
- 副本数据维持
- 副本分布均衡
- 新加、下线节点,副本的重分配
优化点:
- 维持集群Leader分布的均匀
- 各节点存储容量均匀
- 访问热点均匀
- 控制负载均衡速度,避免影响线上业务
- 管理节点状态,包括上线、下线节点
Raft协议:
- AddReplica:增加一个副本
- RemoveReplica:减少一个副本
- TransferLeader:把Leader副本在同一个Raft Group的不同副本间迁移
调度准备:信息收集
PD通过两类心跳收集整个集群的信息,另外还有管理接口的额外的信息,以它们为决策的依据
- TiKV通过心跳定期向PD汇报(节点信息、Region信息)
PD通过心跳包检测每个Store是否存活,及是否有新加入的Store
汇报Store的状态信息
- 总磁盘容量
- 可用磁盘容量
- Region的数量
- 数据读取/写入速度
- 发送/接收的Snapshot数量(副本间可能通过Snapshot同步数据)
- 是否过载
- labels标签信息(具备层级关系的一系列Tag)
- Raft Group的Leader会定期向PD汇报Region状态信息
- Leader的位置
- Follows的位置
- 掉线的副本数量
- 数据写入/读取的速度
调度策略:
- 副本数量
- 副本不在同一个位置
- 副本均匀分布在Store间
- 副本的Leader数量均匀分布在Store间
- 访问热点均匀分布在Store之间
- Store的存储空间占用大致相等
- 调度的速度,避免影响线上
弹性调度
在传统IDC环境中,我们希望各机器资源利用率平均,并且机器预留足够的资源应对高峰期,造成资源的浪费
TiDB Operator:定期获取TiDB和TiKV的Metrics信息及PD上集群的状态,通过内部Auto-Scaling算法对TidbCluster.Spec.Replicas进行调整。并且通过API的方式暴露出期望的TiDB和TiKV节点的数量
TiKV热点Region的动态调度是通过PD完成,以达到快速分推压力和以最小的代价提高弹性伸缩的速度
动态调度:
- 动态分裂:根据QPS阈值进行自动的负载动态分裂Region
- 热点隔离:自增的主健、递增的索引写入。TiDB可以识别单一热点到高性能机器,达到热点隔离的目的