https://docs.pingcap.com/zh/tidb/stable/schedule-replicas-by-topology-labels#%E5%9F%BA%E4%BA%8E%E6%8B%93%E6%89%91-label-%E7%9A%84-pd-%E8%B0%83%E5%BA%A6%E7%AD%96%E7%95%A5
11 Contributors
 
注意

TiDB 在 v5.3.0 中引入了 Placement Rules in SQL。使用该功能,你可以更方便地配置表和分区的位置。在未来版本中,Placement Rules in SQL 可能取代通过 PD 配置放置规则的功能。

为了提升 TiDB 集群的高可用性和数据容灾能力,我们推荐让 TiKV 节点尽可能在物理层面上分散,例如让 TiKV 节点分布在不同的机架甚至不同的机房。PD 调度器根据 TiKV 的拓扑信息,会自动在后台通过调度使得 Region 的各个副本尽可能隔离,从而使得数据容灾能力最大化。

要让这个机制生效,需要在部署时进行合理配置,把集群的拓扑信息(特别是 TiKV 的位置)上报给 PD。阅读本章前,请先确保阅读 TiUP 部署方案

根据集群拓扑配置 labels

设置 TiKV 和 TiFlash 的 labels

TiKV 和 TiFlash 支持在命令行参数或者配置文件中以键值对的形式绑定一些属性,我们把这些属性叫做标签 (label)。TiKV 和 TiFlash 在启动后,会将自身的标签上报给 PD,因此可以使用标签来标识 TiKV 和 TiFlash 节点的地理位置。

比如集群的拓扑结构分成四层:机房 (zone) -> 数据中心 (dc) -> 机架 (rack) -> 主机 (host),就可以使用这 4 个标签来设置 TiKV 和 TiFlash 的位置。

使用命令行参数的方式启动一个 TiKV 实例:

tikv-server --labels zone=<zone>,dc=<dc>,rack=<rack>,host=<host>

使用配置文件的方式:

[server] [server.labels] zone = "<zone>" dc = "<dc>" rack = "<rack>" host = "<host>"

TiFlash 支持通过 tiflash-learner.toml (tiflash-proxy 的配置文件)的方式设置 labels:

[server] [server.labels] zone = "<zone>" dc = "<dc>" rack = "<rack>" host = "<host>"

设置 TiDB 的 labels(可选)

如果需要使用 Follower Read 的优先读同一区域副本的功能,需要为 TiDB 节点配置相关的 labels

TiDB 支持使用配置文件的方式设置 labels

[labels] zone = "<zone>" dc = "<dc>" rack = "<rack>" host = "<host>"
 
注意

目前,TiDB 依赖 zone 标签匹配选择同一区域的副本。如果需要使用此功能,需要在 PD location-labels 配置中包含 zone,并在 TiDB、TiKV 和 TiFlash 设置的 labels 中包含 zone。关于如何设置 TiKV 和 TiFlash 的 labels,可参考设置 TiKV 和 TiFlash 的 labels

设置 PD 的 location-labels 配置

根据前面的描述,标签可以是用来描述 TiKV 属性的任意键值对,但 PD 无从得知哪些标签是用来标识地理位置的,而且也无从得知这些标签的层次关系。因此,PD 也需要一些配置来使得 PD 理解 TiKV 节点拓扑。

PD 上的配置叫做 location-labels,是一个字符串数组。该配置的每一项与 TiKV labels 的 key 是对应的,而且其中每个 key 的顺序代表不同标签的级别关系(从左到右,隔离级别依次递减)。

location-labels 没有默认值,你可以根据具体需求来设置该值,包括 zonerackhost 等等。同时,location-labels 对标签级别的数量也没有限制(即不限定于 3 个),只要其级别与 TiKV 服务器的标签匹配,则可以配置成功。

 
注意
  • 必须同时配置 PD 的 location-labels 和 TiKV 的 labels 参数,否则 PD 不会根据拓扑结构进行调度。
  • 如果你使用 Placement Rules in SQL,只需要配置 TiKV 的 labels 即可。Placement Rules in SQL 目前不兼容 PD location-labels 设置,会忽略该设置。不建议 location-labels 与 Placement Rules in SQL 混用,否则可能产生非预期的结果。

你可以根据集群状态来选择不同的配置方式:

  • 在集群初始化之前,可以通过 PD 的配置文件进行配置:

    [replication] location-labels = ["zone", "rack", "host"]
  • 如果需要在 PD 集群初始化完成后进行配置,则需要使用 pd-ctl 工具进行在线更改:

    pd-ctl config set location-labels zone,rack,host

设置 PD 的 isolation-level 配置

在配置了 location-labels 的前提下,用户可以还通过 isolation-level 配置来进一步加强对 TiKV 集群的拓扑隔离要求。假设按照上面的说明通过 location-labels 将集群的拓扑结构分成三层:机房 (zone) -> 机架 (rack) -> 主机 (host),并对 isolation-level 作如下配置:

[replication] isolation-level = "zone"

当 PD 集群初始化完成后,需要使用 pd-ctl 工具进行在线更改:

pd-ctl config set isolation-level zone

其中,isolation-level 配置是一个字符串,需要与 location-labels 的其中一个 key 对应。该参数限制 TiKV 拓扑集群的最小且强制隔离级别要求。

 
注意

isolation-level 默认情况下为空,即不进行强制隔离级别限制,若要对其进行设置,必须先配置 PD 的 location-labels 参数,同时保证 isolation-level 的值一定为 location-labels 中的一个。

使用 TiUP 进行配置(推荐)

如果使用 TiUP 部署集群,可以在初始化配置文件中统一进行 location 相关配置。TiUP 会负责在部署时生成对应的 TiKV、PD 和 TiFlash 配置文件。

下面的例子定义了 zone 和 host 两层拓扑结构。集群的 TiKV 和 TiFlash 分布在三个 zone,z1、z2 和 z3。每个 zone 内有四台主机,z1 两台主机分别部署两个 TiKV 实例,另外两台分别部署一个 TiFlash 实例,z2 和 z3 其中两台主机分别部署一个 TiKV 实例,另外两台分别部署一个 TiFlash 实例。以下例子中 tikv-n 代表第 n 个 TiKV 节点的 IP 地址,tiflash-n 代表第 n 个 TiFlash 节点的 IP 地址。

server_configs: pd: replication.location-labels: ["zone", "host"] tikv_servers: # z1 - host: tikv-1 config: server.labels: zone: z1 host: h1 - host: tikv-2 config: server.labels: zone: z1 host: h1 - host: tikv-3 config: server.labels: zone: z1 host: h2 - host: tikv-4 config: server.labels: zone: z1 host: h2 # z2 - host: tikv-5 config: server.labels: zone: z2 host: h1 - host: tikv-6 config: server.labels: zone: z2 host: h2 # z3 - host: tikv-7 config: server.labels: zone: z3 host: h1 - host: tikv-8 config: server.labels: zone: z3 host: h2 tiflash_servers: # z1 - host: tiflash-1 learner_config: server.labels: zone: z1 host: h3 - host: tiflash-2 learner_config: server.labels: zone: z1 host: h4 # z2 - host: tiflash-3 learner_config: server.labels: zone: z2 host: h3 - host: tiflash-4 learner_config: server.labels: zone: z2 host: h4 # z3 - host: tiflash-5 learner_config: server.labels: zone: z3 host: h3 - host: tiflash-6 learner_config: server.labels: zone: z3 host: h4

详情参阅 TiUP 跨数据中心部署拓扑

 
注意

如果你未在配置文件中配置 replication.location-labels 项,使用该拓扑配置文件部署集群时可能会报错。建议在部署集群前,确认 replication.location-labels 已配置。

基于拓扑 label 的 PD 调度策略

PD 在副本调度时,会按照 label 层级,保证同一份数据的不同副本尽可能分散。

下面以上一节的拓扑结构为例分析。

假设集群副本数设置为 3 (max-replicas=3),因为总共有 3 个 zone,PD 会保证每个 Region 的 3 个副本分别放置在 z1/z2/z3,这样当任何一个数据中心发生故障时,TiDB 集群依然是可用的。

假如集群副本数设置为 5 (max-replicas=5),因为总共只有 3 个 zone,在这一层级 PD 无法保证各个副本的隔离,此时 PD 调度器会退而求其次,保证在 host 这一层的隔离。也就是说,会出现一个 Region 的多个副本分布在同一个 zone 的情况,但是不会出现多个副本分布在同一台主机。

在 5 副本配置的前提下,如果 z3 出现了整体故障或隔离,并且 z3 在一段时间后仍然不能恢复(由 max-store-down-time 控制),PD 会通过调度补齐 5 副本,此时可用的主机只有 4 个了,故而无法保证 host 级别的隔离,于是可能出现多个副本被调度到同一台主机的情况。

但假如 isolation-level 设置不为空,值为 zone,这样就规定了 Region 副本在物理层面上的最低隔离要求,也就是说 PD 一定会保证同一 Region 的副本分散于不同的 zone 之上。即便遵循此隔离限制会无法满足 max-replicas 的多副本要求,PD 也不会进行相应的调度。例如,当前存在 TiKV 集群的三个机房 z1/z2/z3,在三副本的设置下,PD 会将同一 Region 的三个副本分别分散调度至这三个机房。若此时 z1 整个机房发生了停电事故并在一段时间后(由 max-store-down-time 控制,默认为 30 分钟)仍然不能恢复,PD 会认为 z1 上的 Region 副本不再可用。但由于 isolation-level 设置为了 zone,PD 需要严格保证不同的 Region 副本不会落到同一 zone 上。此时的 z2 和 z3 均已存在副本,则 PD 在 isolation-level 的最小强制隔离级别限制下便不会进行任何调度,即使此时仅存在两个副本。

类似地,isolation-level 为 rack 时,最小隔离级别便为同一机房的不同 rack。在此设置下,如果能在 zone 级别保证隔离,会首先保证 zone 级别的隔离。只有在 zone 级别隔离无法完成时,才会考虑避免出现在同一 zone 同一 rack 的调度,并以此类推。

总的来说,PD 能够根据当前的拓扑结构使得集群容灾能力最大化。所以如果用户希望达到某个级别的容灾能力,就需要根据拓扑结构在对应级别提供多于副本数 (max-replicas) 的机器。同时 TiDB 也提供了诸如 isolation-level 这样的强制隔离级别设置,以便更灵活地根据场景来控制对数据的拓扑隔离级别。

[转帖]通过拓扑 label 进行副本调度的更多相关文章

  1. [转帖]Linux的进程线程及调度

    Linux的进程线程及调度 本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10393707.html 本文为宋宝华<Linux的进程 ...

  2. Kubernetes集群调度器原理剖析及思考

    简述 云环境或者计算仓库级别(将整个数据中心当做单个计算池)的集群管理系统通常会定义出工作负载的规范,并使用调度器将工作负载放置到集群恰当的位置.好的调度器可以让集群的工作处理更高效,同时提高资源利用 ...

  3. Kubernetes K8S之调度器kube-scheduler详解

    Kubernetes K8S之调度器kube-scheduler概述与详解 kube-scheduler调度概述 在 Kubernetes 中,调度是指将 Pod 放置到合适的 Node 节点上,然后 ...

  4. k8s之list-watch机制、节点调度以及亲和性

    k8s之list-watch机制.节点调度以及亲和性 目录 k8s之list-watch机制.节点调度以及亲和性 一.list-watch机制 1. list-watch介绍 2. list-watc ...

  5. kubernetes 调度器

    调度器 kube-scheduler 是 kubernetes 的核心组件之一,主要负责整个集群资源的调度功能,根据特定的调度算法和策略,将 Pod 调度到最优的工作节点上面去,从而更加合理.更加充分 ...

  6. K8S群集调度器

    目录: 调度约束 Pod启动典型创建过程 调度过程 Predicate常见的算法 常见的优先级选项 指定调度节点 亲和性 键值运算关系 Pod亲和性和反亲和性 污点和容忍 污点 容忍 其他注意事项 c ...

  7. STORM_0009_Lifecycle-of-a-topology/拓扑的生命周期

    http://storm.apache.org/releases/1.0.1/Lifecycle-of-a-topology.html STORM拓扑的生命周期   本页的内容基于0.7.1代码,后来 ...

  8. YARN label 特性 & 指定队列及label提交任务

    以下基于 hadoop版本 hadoop-2.8.4 给各个节点打标签 yarn rmadmin -addToClusterNodeLabels fastcpu,normal # 是否独占默认是tru ...

  9. # kubernetes调度之nodeName与NodeSelector

    系列目录 Kubernetes的调度有简单,有复杂,指定NodeName和使用NodeSelector调度是最简单的,可以将Pod调度到期望的节点上. 本文主要介绍kubernetes调度框架中的No ...

  10. 深入kubernetes调度之NodeSelector

    Kubernetes的调度有简单,有复杂,指定NodeName和使用NodeSelector调度是最简单的,可以将Pod调度到期望的节点上. 1 NodeNamePod.spec.nodeName用于 ...

随机推荐

  1. AIGC的阿克琉斯之踵

    摘要:现在,越来越多的企业和个人使用AIGC生成文章.图片.音乐甚至视频等内容,AIGC已经成为一种必备的工具.在游戏和原画师行业,甚至已经出现了第一批因为AI而失业的人. 本文分享自华为云社区< ...

  2. 突破开源Redis的内存限制,存算分离的GaussDB到底有多能“装”?

    摘要:GaussDB(for Redis)(下文简称高斯Redis)是华为云数据库团队自主研发的兼容Redis协议的云原生数据库,该数据库采用计算存储分离架构,突破开源Redis的内存限制,可轻松扩展 ...

  3. 动手实践丨基于ModelAtrs使用A2C算法制作登月器着陆小游戏

    摘要:在本案例中,我们将展示如何基于A2C算法,训练一个LunarLander小游戏. 本文分享自华为云社区<使用A2C算法控制登月器着陆>,作者:HWCloudAI . LunarLan ...

  4. 云原生时代,政企混合云场景IT监控和诊断的难点和应对之道

    摘要:正是因为政企IT架构云化的云原生架构,相比之前的单体烟囱式架构,在监控诊断方面有着更多的难点和挑战,这也在业界催生出大量相关的标准和工具. 本文分享自华为云社区<[华为云Stack][大架 ...

  5. STM32CubeMX教程16 DAC - 输出3.3V内任意电压

    1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK ...

  6. 深入浅出 WebRTC AEC(声学回声消除)

    前言:近年来,音视频会议产品提升着工作协同的效率,在线教育产品突破着传统教育形式的种种限制,娱乐互动直播产品丰富着生活社交的多样性,背后都离不开音视频通信技术的优化与创新,其中音频信息内容传递的流畅性 ...

  7. 奶瓶KeyBoard | N68键盘使用说明

    1.旋钮功能及操作说明 旋钮功能向下长按5秒按为音量调节/灯光亮度调节互换,顺时针方向为音量+/亮度加,逆时针方向为音量-/亮度减 2. 无线连接及操作说明 Tab按键右侧和Q按键中间为通道连接指示灯 ...

  8. AtCoder Beginner Contest 242(C~E)

    AB 水题 C - 1111gal password 题意:给出 N(\(2\le N\le 1e6\))求满足以下条件的 \(X\) 的数量,需除以模 (\(998244353\)) $X $ 是 ...

  9. LeetCode 第 193 场周赛 解题报告

    5436. 一维数组的动态和 时间复杂度:O(n) 知识点:前缀和 根据题目给出的公式 runningSum[i] = sum(nums[0]-nums[i]),可得: 当 i > 0 时,ru ...

  10. 记一次 .NET某道闸收费系统 内存溢出分析

    一:背景 1. 讲故事 前些天有位朋友找到我,说他的程序几天内存就要爆一次,不知道咋回事,找不出原因,让我帮忙看一下,这种问题分析dump是最简单粗暴了,拿到dump后接下来就是一顿分析. 二:Win ...