TiDB 数据库调度(PD)揭秘

news2024/11/25 10:01:18

目录

一、PD 简介

        1.1 元数据管理

        1.2 调度决策

        1.3 全局服务

        1.4 集群配置与管理

二、TiKV 管理

        2.1 调度需求

        2.2 信息收集

三、TiDB server 管理

四、PD 集群主节点选取


一、PD 简介

        TiDB PD (Placement Driver) 是 TiDB 分布式数据库系统中的核心组件之一,负责整个集群的元数据管理和调度工作。PD 在 TiDB 架构中扮演着至关重要的角色,确保了数据的正确分布、高可用性、以及资源的有效利用。

        PD 的功能如下:

        1.1 元数据管理

        存储集群全局元信息:PD 保存了 TiKV 集群的整体拓扑结构、每个 TiKV 节点的状态、以及数据在各个节点上的分布情况(即 Region 分布)等关键元数据。

        维护 Region 信息:Region 是 TiKV 中数据的最小分布单元,PD 负责记录每个 Region 的键值范围、副本位置、Leader 信息等,并动态调整 Region 分布以实现数据均衡。

        1.2 调度决策

        数据均衡:PD 根据预设的策略(如 Region 大小、副本数、地域分布等)定期进行数据均衡操作,通过迁移 Region 的副本来避免数据热点、保证资源利用率,并确保在节点故障时有足够的副本可用。

        故障恢复:当 TiKV 节点发生故障或网络隔离时,PD 负责检测并触发故障转移流程,重新选举 Leader,确保数据的高可用性。

        Region Split/Merge:根据数据增长和查询需求,PD 自动触发 Region 的分裂(Split)和合并(Merge)操作,以维持合理的 Region 大小,优化查询性能。

        1.3 全局服务

        全局唯一时间戳(Timestamp Oracle, TSO):PD 提供全局单调递增的时间戳服务,用于协调分布式事务中的时间顺序,确保事务的 ACID 特性。

        全局唯一 ID 分配:PD 分配全局唯一的 Region ID、Table ID、Index ID 等,确保在整个集群内标识符的唯一性。

        1.4 集群配置与管理

        配置变更:PD 存储并管理 TiKV、TiDB 等组件的配置信息,支持动态调整配置并通过 gRPC 接口推送变更。

        监控与告警:PD 收集集群的运行状态和性能指标,支持通过 Prometheus 等工具进行监控,并提供告警功能。

        Dashboard & CLI:提供图形化界面(TiDB Dashboard)和命令行工具(pd-ctl)供管理员查看集群状态、执行管理操作。

二、TiKV 管理

        TiKV 集群是 TiDB 数据库的分布式 KV 存储引擎,数据以 Region 为单位进行复制和管理,每个 Region 会有多个副本 (Replica),这些副本会分布在不同的 TiKV 节点上,其中 Leader 负责读/写,Follower 负责同步 Leader 发来的 Raft log。

        需要考虑一下场景:

  1. 为了提高集群的空间利用率,需要根据 Region 的空间占用对副本进行合理的分布。
  2. 集群进行跨机房部署时,要保证一个机房掉线,不对丢失 Raft Group 的多个副本。
  3. 添加一个新的 TiKV 节点时,需要合理的将集群中其他节点上的数据搬到新节点上。
  4. 当一个节点掉线时,需要考虑快速的容灾。
  5. 并不是所有的 Region 都被频繁的访问,可能访问热点只在少数几个 Region,需要通过调度进行负载均衡。

        以上问题和场景如果多个同时出现,就不太容易解决,因为需要考虑全局信息。同时整个系统也是在动态变化的,因此需要一个中心节点,来对系统的整体状况进行把控和调整,所以有了 PD 这个模块。

        2.1 调度需求

        对以上问题进行分类和整理,可以分为两个问题:

        1. 作为一个分布式高可用系统,必须满足以下要求

  • 副本数量要合适,不能多也不能少
  • 副本要均匀的分布在不同的机器上
  • 节点宕机能够自动合理的进行容灾

        2. 作为一个良好的分布式系统,要考虑的方面如下

  • 维持整个 Leader 分布均匀
  • 维持每个节点存储容量均匀
  • 维持访问热点数据均匀
  • 控制负载均衡
  • 管理节点状态,包括手动上线\下线节点

        满足第一类需求后,整个系统将具备强大的容灾功能。满足第二类需求后,可以使得系统整体的资源利用率更高且合理,具备良好的扩展性。

        为了满足这些需求,首先需要收集足够的信息,比如每个节点的状态、每个 Raft Group 的信息、业务访问操作的统计等;其次需要设置一些策略,PD 根据这些信息以及调度的策略,制定出尽量满足前面所述需求的调度计划;最后需要一些基本的操作,来完成调度计划。

        2.2 信息收集

        调度依赖于整个集群的信息收集,简单来说,调度需要知道每个 TiKV 节点的状态以及每个Region 的状态。TiKV 集群会向PD汇报两类信息,TiKV 节点信息和 Region 信息。每个 TiKV 节点会定期向 PD 汇报节点的状态信息。

        TiKV节点(Store)与PD之间存在心跳包,一方面PD通过心跳包检测每个Store是否存活,以及是否有新加入的Store;另一方面心跳包也会携带这个Store的状态信息,主要包括:

  • 总磁盘容量
  • 可用磁盘容量
  • 承载的 Region 数量
  • 数据写入/读取速度
  • 发送/接收的 Snapshot 数量(副本之间可能会通过 Snapshot 同步数据)
  • 是否过载
  • labels标签信息

        TiKV Store 的状态具体分为 Up,Disconnect,Offline,Down,Tombstone。各状态的关系如下:

        Up:表示当前的 TiKV Store 处于提供服务的状态。

        Disconnect:当 PD 和 TiKV Store 的心跳信息丢失超过 20 秒后,该 Store 的状态会变为 Disconnect 状态,当时间超过 max-store-down-time 指定的时间后,该 Store 会变为 Down 状态。

        Down:表示该 TiKV Store 与集群失去连接的时间已经超过了 max-store-down-time 指定的时间,默认 30 分钟。超过该时间后,对应的 Store 会变为 Down,并且开始在存活的 Store 上补足各个 Region 的副本。

        Offline:当对某个 TiKV Store 通过 PD Control 进行手动下线操作,该 Store 会变为 Offline 状态。该状态只是 Store 下线的中间状态,处于该状态的 Store 会将其上的所有 Region 搬离至其它满足搬迁条件的 Up 状态 Store。当该 Store 的 leader_count 和 region_count (在 PD Control 中获取) 均显示为 0 后,该 Store 会由 Offline 状态变为 Tombstone 状态。在 Offline 状态下,禁止关闭该 Store 服务以及其所在的物理服务器。下线过程中,如果集群里不存在满足搬迁条件的其它目标 Store(例如没有足够的 Store 能够继续满足集群的副本数量要求),该 Store 将一直处于 Offline 状态。

        Tombstone:表示该 TiKV Store 已处于完全下线状态,可以使用 remove-tombstone 接口安全地清理该状态的 TiKV。

         每个 Raft Group 的 Leader 会定期向 PD 汇报 Region 状态。每个 Raft Group 的 Leader 和 PD 之间存在心跳包,用户汇报 Region 状态,主要包括以下信息:

  • Leader的位置
  • Follwers的位置
  • 掉线副本个数
  • 数据写入读取速度

        PD 不断的通过这两类心跳消息收集整个集群的信息,再以这些信息作为决策的依据。

        除此之外,PD 还可以通过扩展的接口接受额外的信息,用来做更准确的决策。比如当某个 Store 的心跳包中断的时候,PD 并不能判断这个节点是临时失效还是永久失效,只能经过一段时间的等待(默认是 30 分钟),如果一直没有心跳包,就认为该 Store 已经下线,再决定需要将这个 Store 上面的 Region 都调度走。

三、TiDB server 管理

        PD 如何管理和监控 TiDB Server,一下是主要内容:

  • 元数据管理:PD 维护整个 TiDB 集群的元数据信息,包括 TiDB Server 节点的列表、状态、配置等。这些信息用于确保 PD 能够准确地知道哪些 TiDB Server 正在运行,以及它们的网络地址、角色(如普通 TiDB Server、TiFlash 服务等)等属性。
  • 调度决策:PD 根据收集到的集群状态信息进行智能调度,如负载均衡、故障转移等。如果发现某个 TiDB Server 负载过高或出现故障,PD 会触发相应的调度策略,如将部分 SQL 查询重定向到其他负载较低的 TiDB Server,或者在故障恢复后重新分配 Region 到恢复的节点上。
  • 配置推送:PD 可以向 TiDB Server 推送全局或局部的配置变更,如系统参数调整、新功能开关等。TiDB Server 会定期从 PD 获取并应用这些配置更新,确保整个集群的配置一致性。
  • 心跳检测与健康检查:TiDB Server 定期向 PD 发送心跳信息,报告自己的存活状态和负载情况。PD 通过接收和解析这些心跳消息来监控 TiDB Server 的健康状况。如果某个 TiDB Server 在一段时间内未发送心跳,PD 会认为该节点可能存在问题,并采取相应措施(如标记为下线、重新调度其负责的负载等)。
  • 全局事务协调:PD 分配全局唯一且递增的事务ID给 TiDB Server,用于协调分布式事务。TiDB Server 在发起事务时需要从 PD 获取 事务ID,确保事务的全局唯一性和时间顺序。

四、PD 集群主节点选取

        PD(Placement Driver)集群本身也是由多个 PD 节点组成,它们通过 Raft 协议形成一个共识组,共同维护集群的元数据和进行决策。在 PD 集群内部,主节点(Leader)的选取同样遵循 Raft 协议的选举机制。

        关于 Raft 选主请参考往期文章:Raft共识算法领导者选举流程揭秘-CSDN博客

        总结来说,TiDB 中 PD 集群选取主节点是通过 Raft 一致性协议的选举机制实现的。在选举过程中,候选节点争取大多数节点的投票,赢得选举的节点成为主节点,负责处理集群的元数据管理和调度决策。这种机制确保了 PD 集群在面临节点故障时能够快速恢复服务,维持集群的高可用性和数据一致性。

往期经典推荐:

深入浅出 TiDB MVCC:揭秘分布式数据库中的多版本并发控制-CSDN博客

TiDB内核解密:揭秘其底层KV存储引擎如何玩转键值对_tidb 的key value是如何做到的-CSDN博客

揭开Spring Bean生命周期的神秘面纱-CSDN博客

探析Drools规则引擎的工作原理_drools引擎执行过程?-CSDN博客

Raft日志复制技术及成员变更原来是这样的-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1588109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

应用实战|从头开始开发记账本2:基于模板快速开始

上期视频我们创建好了BaaS服务的后端应用。从这期视频开始,我们将从头开发一个互联网记账本应用。本期视频我们介绍一下如何使用模板快速开启我们的应用开发之旅。 应用实战|从头开始开发记账本2:基于模板快速开始 相关代码 本期视频我们介绍…

LigaAI x 极狐GitLab,共探 AI 时代研发提效新范式

近日,LigaAI 和极狐GitLab 宣布合作,双方将一起探索 AI 时代的研发效能新范式,提供 AI 赋能的一站式研发效能解决方案,让 AI 成为中国程序员和企业发展的新质生产力。 软件研发是一个涉及人员多、流程多、系统多的复杂工程&#…

三小时使用鸿蒙OS模仿羊了个羊,附源码

学习鸿蒙arkTS语言,决定直接通过实践的方式上手,而不是一点点进行观看视频再来实现。 结合羊了个羊的开发思路,准备好相应的卡片素材后进行开发。遇到了需要arkTS进行解决的问题,再去查看相应的文档。 首先需要准备卡片对应的图片…

ccf201509-3模板生成系统(list,map,字符串综合运用)

问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的。例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是: 而当用户为 Jerry 时…

【Spring Boot 源码学习】SpringApplication 的 run 方法核心流程介绍

《Spring Boot 源码学习系列》 SpringApplication 的 run 方法核心流程介绍 一、引言二、往期内容三、主要内容3.1 run 方法源码初识3.2 引导上下文 BootstrapContext3.3 系统属性【java.awt.headless】3.4 早期启动阶段3.5 准备和配置应用环境3.6 打印 Banner 信息3.7 新建应用…

一起学习python——基础篇(16)

今天继续说说python的网络请求方法——get方法和post方法。上一章已经简单说了一下get方法,现在说一下post方法如何进行网络请求。 假如服务端开发人员给你一个接口文档内容如下: Request(请求参数): 1、接口url为http://127.0.0.1:5005/a…

Mac 局域网内连接 MySQL

1. 前言 本文记录在 mac 局域网下实现数据库资源共享的问题 项目开发初期,都是在本地进行开发调试,数据库也在本地。那么和你配合开发的同事,就可能想要连接你 mac 电脑的数据库,连接过程中可能就会遇到问题。本文详细记录这些问…

MongoDB数据库转换为表格文件的Python实现

目录 一、引言 二、转换工具与库的选择 三、转换过程详解 安装必要的库 连接MongoDB数据库 查询并处理数据 将数据写入CSV文件 四、进阶技巧与注意事项 五、总结 一、引言 在当今大数据时代,数据的存储、处理与共享显得尤为重要。MongoDB作为一个面向文档…

centos7安装 on-my-zsh

如下👇 yum install -y zsh chsh -s /bin/zsh yum install -y git sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 重启即可生效啦~

cordova后台插件开发新手教程

typora-root-url: imags cordova后台插件开发新手教程 预安装环境:JDK11、Android studios、nodo.js 一、环境搭建 1.安装Cordova npm install -g cordova2.创建项目 cordova create 具体命令: cordova create 目录名 包名 项目名 执行结果终端&am…

7-23 币值转换

题目链接&#xff1a;7-23 币值转换 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码 1. 代码实现 #include <iostream> #include <string> using namespace std;string numStr[] { // 0-9对应的字符串&#xff08;字符串是方便string&#xff09;"a…

tensorflow.js 如何从 public 路径加载人脸特征点检测模型

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图tensorflow.js 使用 opencv.js 将人脸…

常用特征分箱算法

特征分箱是构建信用评分过程中最重要的一个环节。特征分箱是对连续变量离散化的一种简称&#xff0c;对于连续型变量&#xff0c;需要对其连续值进行拆分&#xff0c;并进行后续的分箱调整工作&#xff1b; 对于离散型变量&#xff0c;通常要根据每个离散值计算其坏样本占比或…

【unity】【C#】游戏音乐播放和发布

今天我们来认识一下有关 unity 音乐的一些知识 我们先创建 AudioClips 文件夹&#xff0c;这个文件夹通常就是 unity 中存放音乐的文件夹&#xff0c;然后拖进音乐文件进去 这里为大家提供了两个音乐&#xff0c;有需要可以自取 百度网盘&#xff1a;https://pan.baidu.com/s…

从库延迟案例分析

背景介绍 近来一套业务系统&#xff0c;从库一直处于延迟状态&#xff0c;无法追上主库&#xff0c;导致业务风险较大。从资源上看&#xff0c;从库的CPU、IO、网络使用率较低&#xff0c;不存在服务器压力过高导致回放慢的情况&#xff1b;从库开启了并行回放&#xff1b;在从…

一键提升Edge浏览器生产力

Edge作为微软的产品&#xff0c;其具体使用和特性在此不再赘述&#xff0c;其中对我个人而言较有吸引力的部分是其扩展部分。正是有了其丰富的扩展插件&#xff0c;其生产力才能一键跃升&#xff0c;今天让我们一起来探索几款有用&#xff08;有趣&#xff09;的扩展插件。 1.…

NASA数据集—— 亚洲夏季季风化学和气候影响项目(ACCLIP)Roscoe 激光雷达收集的云和气溶胶ADO遥感数据

ACCLIP WB-57 Aerosol and Cloud Remotely Sensed Data 简介 ACCLIP_AerosolCloud_AircraftRemoteSensing_WB57_Data 是亚洲夏季季风化学和气候影响项目&#xff08;ACCLIP&#xff09;期间从 Roscoe 激光雷达收集的云和气溶胶遥感数据。该产品的数据收集工作已经完成。 亚洲…

【汇编】_Visual Studio2019写32位汇编

目录 第一步&#xff1a;创建新项目 1. 空项目—下一步 2. 选择位置—填写项目名—创建 第二步&#xff1a;项目生成依赖项 1. 右击项目名—生成依赖项—生成自定义 2. 选中masm—确定 第三步&#xff1a;创建源文件 1. 源文件—添加—新建项 2. 选择C文件—创建新文件…

ActiveMQ + MQTT 集群搭建(虚机版本) + Springboot使用配置

文章目录 前言一、ActiveMQ、 MQTT是什么&#xff1f;1.ActiveMQ介绍2.MQTT介绍 二、集群搭建步骤1.下载apache-activemq-5.15.12-bin.tar.gz2.上传apache-activemq-5.15.12-bin.tar.gz到服务器并解压文件到文件夹clusters、master、slave三个文件夹下面形成三个节点&#xff0…

配置QtCreator能加载自定义插件的环境

配置对应环境 引言查看当前版本配置能够加载插件的环境 引言 生成的自定义插件能在QtCreator的设计器中加载&#xff0c;需要满足当前使用的QtCreator的编译时所需的Qt库和编译器。 查看当前版本 这里需要先查看自己使用的QtCreator的版本&#xff0c;即生成QtCreator时使用…