# 调度

调度概述

TiKV集群是分布式KV存储系统,数据以Region为单位进行复制和管理,每个Region会有多个副本,Leader负责读写,Follower负责同步Leader的Raft Log

调度的目的:

  1. 保证Region的多个副本分布在不同的机房、节点;
  2. 保证Region的Leader副本分布的均衡;
  3. 新节点加入、下线,数据重分配,协调负载均衡的过程,避免影响线上服务

分布式高可用存储系统:

  1. 副本数据维持
  2. 副本分布均衡
  3. 新加、下线节点,副本的重分配

优化点:

  1. 维持集群Leader分布的均匀
  2. 各节点存储容量均匀
  3. 访问热点均匀
  4. 控制负载均衡速度,避免影响线上业务
  5. 管理节点状态,包括上线、下线节点

Raft协议:

  1. AddReplica:增加一个副本
  2. RemoveReplica:减少一个副本
  3. TransferLeader:把Leader副本在同一个Raft Group的不同副本间迁移

调度准备:信息收集

PD通过两类心跳收集整个集群的信息,另外还有管理接口的额外的信息,以它们为决策的依据

  1. TiKV通过心跳定期向PD汇报(节点信息、Region信息) PD通过心跳包检测每个Store是否存活,及是否有新加入的Store 汇报Store的状态信息
    • 总磁盘容量
    • 可用磁盘容量
    • Region的数量
    • 数据读取/写入速度
    • 发送/接收的Snapshot数量(副本间可能通过Snapshot同步数据)
    • 是否过载
    • labels标签信息(具备层级关系的一系列Tag)
  2. Raft Group的Leader会定期向PD汇报Region状态信息
    • Leader的位置
    • Follows的位置
    • 掉线的副本数量
    • 数据写入/读取的速度

调度策略:

  1. 副本数量
  2. 副本不在同一个位置
  3. 副本均匀分布在Store间
  4. 副本的Leader数量均匀分布在Store间
  5. 访问热点均匀分布在Store之间
  6. Store的存储空间占用大致相等
  7. 调度的速度,避免影响线上

弹性调度

在传统IDC环境中,我们希望各机器资源利用率平均,并且机器预留足够的资源应对高峰期,造成资源的浪费

TiDB Operator:定期获取TiDB和TiKV的Metrics信息及PD上集群的状态,通过内部Auto-Scaling算法对TidbCluster.Spec.Replicas进行调整。并且通过API的方式暴露出期望的TiDB和TiKV节点的数量

TiKV热点Region的动态调度是通过PD完成,以达到快速分推压力和以最小的代价提高弹性伸缩的速度

动态调度:

  1. 动态分裂:根据QPS阈值进行自动的负载动态分裂Region
  2. 热点隔离:自增的主健、递增的索引写入。TiDB可以识别单一热点到高性能机器,达到热点隔离的目的
上次更新: : 5 months ago