# label 与高可用

![left](./student-guide/diagram/LabelWithHighAvailability_aa_002_20220509.png)

-------------------------------------------------------------
为了说明 label 的功能,我们一起来看下图,在图中 DC 1 ～ 3 代表 3 个独立的数据中心,Rack 1 ～ 6 代表 6 个机柜（机架）,TiKV-1 ～ TiKV-12 代表 12 台主机,每台主机上有一个 TiKV 实例。接下来,我们看 3 种 region 的分布情况,假设都是默认 3 副本:

1. Region 1 的分布情况是 1 个 leader 和 1 个 follower 分别在 Rack 4 机柜的 2 台主机 TiKV-7 和 TiKV-8 上,另一个 follower 在 DC 3 的 Rack 6 机柜中。这样部署的风险是,如果 DC 2 出问题或者 Rack 4 出了问题,都会造成 Region 1 的不可用。

2. Region 2 的分布情况是 1 个 leader 和 2 个 follower 分别在不同的机柜中,所以任何一个机柜单独出现问题,Region 2 都可用,这点是比 Region 1 强的。但是,如果 IDC 1 出了问题,我们的 Region 2 又不可用了。

3. Region 3 的分布情况是 1 个 leader 和 2 个 follower 分别在不同的 DC 中,这样,无论是 DC,机柜（rack）还是主机（TiKV）出现问题,都不会影响 Region 1 的可用。
对比了,Region 1,Region 2 和 Region 3 的分布,我们发现不同的 Region 分布对于可用性是有影响的,尤其是某些 Region 中如果存放的是数据库的元数据,比如 information schema,那么一个 Region 的不可用会造成整个数据库的不可用。
可是,我们知道,Region 的原始分布是 PD 随机部署的,PD 节点仅仅保证同一个 TiKV 节点上不会放置一个 Region 的多个副本,但是对于 DC,机柜（rack）和主机（host）这些概念 PD 节点是一无所知的。
怎么办呢 ？于是就有了 label 的概念,也就是我们常说的打标签,我们可以在为每个 TiKV 实例设置一个 label（打标签）,用于标识其在哪个 DC 的哪个 机柜（rack） 中的哪个主机（host）上。而 PD 节点约定好 label 的格式,这样 PD 节点在初始分布 region 的时候,就可以根据 TiKV 节点上设置好的 lable,感知到 DC,机柜（rack）和主机（host）的位置了,从而最大程度的实现高可用的分布。