集群拓扑信息配置

概述

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

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

TiKV 上报拓扑信息

可以通过 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 理解 TiKV 拓扑结构

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

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

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

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

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

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

假设我们有四个数据中心 (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 会优先把每一份数据的不同副本调度到不同的数据中心。 这时候如果其中一个数据中心挂了,不会影响 TiDB 集群的高可用状态。 如果这个数据中心一段时间内恢复不了,PD 会把这个数据中心的副本迁移出去。

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

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""