PD 能够根据 TiKV 集群的拓扑结构进行调度,使得 TiKV 的容灾能力最大化。
阅读本章前,请先确保阅读 Binary 部署方案 和 Docker 部署方案。
可以通过 TiKV 的启动参数或者配置文件来让 TiKV 上报拓扑信息给 PD。
假设拓扑结构分为三级:zone > rack > host,可以通过 labels 来指定这些信息。
启动参数:
tikv-server --labels zone=<zone>,rack=<rack>,host=<host>
配置文件:
[server]
labels = "zone=<zone>,rack=<rack>,host=<host>"
可以通过 PD 的配置文件让 PD 理解 TiKV 集群的拓扑结构。
[replication]
max-replicas = 3
location-labels = ["zone", "rack", "host"]
其中 location-labels
需要与 TiKV 的 labels
名字对应,这样 PD 才能知道这些 labels
代表了 TiKV 的拓扑结构。
PD 能够根据我们提供的拓扑信息作出最优的调度,我们只需要关心什么样的拓扑结构能够达到我们想要的效果。
假设我们使用三副本,并且希望一个数据中心挂掉的情况下能够正常服务,我们至少需要四个数据中心 (理论上三个数据中心即可,但是当前实现无法保证)。
假设我们有四个数据中心 (zone),每个数据中心有两个机架 (rack),每个机架上有两个主机 (host)。 我们可以在每个主机上面启动两个 TiKV 实例:
# zone=z1
tikv-server --labels zone=z1,rack=r1,host=h1
tikv-server --labels zone=z1,rack=r1,host=h2
tikv-server --labels zone=z1,rack=r2,host=h1
tikv-server --labels zone=z1,rack=r2,host=h2
# zone=z2
tikv-server --labels zone=z2,rack=r1,host=h1
tikv-server --labels zone=z2,rack=r1,host=h2
tikv-server --labels zone=z2,rack=r2,host=h1
tikv-server --labels zone=z2,rack=r2,host=h2
# zone=z3
tikv-server --labels zone=z3,rack=r1,host=h1
tikv-server --labels zone=z3,rack=r1,host=h2
tikv-server --labels zone=z3,rack=r2,host=h1
tikv-server --labels zone=z3,rack=r2,host=h2
# zone=z4
tikv-server --labels zone=z4,rack=r1,host=h1
tikv-server --labels zone=z4,rack=r1,host=h2
tikv-server --labels zone=z4,rack=r2,host=h1
tikv-server --labels zone=z4,rack=r2,host=h2
也就是说,我们有 16 个 TiKV 实例,分布在 4 个不同的数据中心,8 个不同的机架,16 个不同的机器。
在这种拓扑结构下,PD 会优先把每一份数据的不同副本调度到不同的数据中心。 这时候如果其中一个数据中心挂了,不会影响正常服务。 如果这个数据中心一段时间内恢复不了,PD 会把这个数据中心的副本迁出去。 如果只剩下三个(或两个)数据中心的话,无法保证一个数据中心挂掉还能正常服务,但是能够保证任意一个机房挂掉以后可以正常服务。
总的来说,PD 能够根据当前的拓扑结构使得集群容灾能力最大化,所以如果我们希望达到某个级别的容灾能力,
就需要根据拓扑机构在不同的地理位置提供多于备份数 (max-replicas
) 的机器。