• 集群拓扑信息配置
    • 概述
    • TiKV 上报拓扑信息
    • PD 理解 TiKV 拓扑结构
    • PD 基于 TiKV 拓扑结构进行调度

    集群拓扑信息配置

    概述

    PD 能够根据 TiKV 集群的拓扑结构进行调度,使得 TiKV 的容灾能力最大化。

    阅读本章前,请先确保阅读 Ansible 部署方案 和 Docker 部署方案。

    TiKV 上报拓扑信息

    可以通过 TiKV 的启动参数或者配置文件来让 TiKV 上报拓扑信息给 PD。

    假设拓扑结构分为三级:zone > rack > host,可以通过 labels 来指定这些信息。

    启动参数:

    1. tikv-server --labels zone=<zone>,rack=<rack>,host=<host>

    配置文件:

    1. [server]
    2. labels = "zone=<zone>,rack=<rack>,host=<host>"

    PD 理解 TiKV 拓扑结构

    可以通过 PD 的配置文件让 PD 理解 TiKV 集群的拓扑结构。

    1. [replication]
    2. max-replicas = 3
    3. location-labels = ["zone", "rack", "host"]

    其中 location-labels 需要与 TiKV 的 labels 名字对应,这样 PD 才能知道这些 labels 代表了 TiKV 的拓扑结构。

    PD 基于 TiKV 拓扑结构进行调度

    PD 能够根据我们提供的拓扑信息作出最优的调度,我们只需要关心什么样的拓扑结构能够达到我们想要的效果。

    假设我们使用三副本,并且希望一个数据中心挂掉的情况下,还能继续保持 TiDB 集群的高可用状态,我们至少需要四个数据中心。

    假设我们有四个数据中心 (zone),每个数据中心有两个机架 (rack),每个机架上有两个主机 (host)。 每个主机上面启动一个 TiKV 实例:

    1. # zone=z1
    2. tikv-server --labels zone=z1,rack=r1,host=h1
    3. tikv-server --labels zone=z1,rack=r1,host=h2
    4. tikv-server --labels zone=z1,rack=r2,host=h1
    5. tikv-server --labels zone=z1,rack=r2,host=h2
    6. # zone=z2
    7. tikv-server --labels zone=z2,rack=r1,host=h1
    8. tikv-server --labels zone=z2,rack=r1,host=h2
    9. tikv-server --labels zone=z2,rack=r2,host=h1
    10. tikv-server --labels zone=z2,rack=r2,host=h2
    11. # zone=z3
    12. tikv-server --labels zone=z3,rack=r1,host=h1
    13. tikv-server --labels zone=z3,rack=r1,host=h2
    14. tikv-server --labels zone=z3,rack=r2,host=h1
    15. tikv-server --labels zone=z3,rack=r2,host=h2
    16. # zone=z4
    17. tikv-server --labels zone=z4,rack=r1,host=h1
    18. tikv-server --labels zone=z4,rack=r1,host=h2
    19. tikv-server --labels zone=z4,rack=r2,host=h1
    20. tikv-server --labels zone=z4,rack=r2,host=h2

    也就是说,我们有 16 个 TiKV 实例,分布在 4 个不同的数据中心,8 个不同的机架,16 个不同的机器。

    在这种拓扑结构下,PD 会优先把每一份数据的不同副本调度到不同的数据中心。 这时候如果其中一个数据中心挂了,不会影响 TiDB 集群的高可用状态。 如果这个数据中心一段时间内恢复不了,PD 会把这个数据中心的副本迁移出去。

    总的来说,PD 能够根据当前的拓扑结构使得集群容灾能力最大化,所以如果我们希望达到某个级别的容灾能力, 就需要根据拓扑机构在不同的地理位置提供多于备份数 (max-replicas) 的机器。