Skip to content

PD Server 组件

角色定位

PD (Placement Driver) Server 是 TiDB 分布式数据库的集群管理中心,负责整个集群的元数据管理、资源调度和负载均衡。它是 TiDB 架构中的大脑,协调和管理 TiKV 集群,确保数据的均衡分布和高可用性。

核心功能

  • 元数据管理:存储和管理集群的元数据信息
  • Region 调度:负责 Region 的分布和调度
  • Store 管理:监控和管理 TiKV 节点的状态
  • TSO 服务:提供全局唯一的时间戳生成服务
  • 负载均衡:平衡集群的负载,优化资源利用率
  • 热点调度:自动检测和处理热点数据
  • 数据均衡:确保数据在节点间均匀分布
  • 集群扩容缩容:处理集群的扩容和缩容操作

架构特点

  • Raft 一致性:基于 Raft 协议实现高可用性和强一致性
  • 无状态设计:PD Server 本身是无状态的,所有状态信息存储在 Raft 日志中
  • 水平扩展:支持通过增加节点线性扩展管理能力
  • 智能调度:基于多种调度策略,优化集群性能和可用性
  • 实时监控:实时监控集群状态,及时发现和处理问题
  • 云原生设计:支持容器化部署和 Kubernetes 管理

架构设计

内部模块

PD Server 内部包含多个核心模块,协同工作提供集群管理服务:

1. API 层

  • 功能:提供 HTTP 和 gRPC API 接口
  • HTTP API:用于管理和监控,如查看集群状态、配置调度策略等
  • gRPC API:用于与 TiKV 节点、TiDB 节点和其他 PD 节点通信
  • 认证授权:支持基本认证和 TLS 加密

2. 调度器层

  • 功能:实现各种调度策略,优化集群性能和可用性
  • Region 调度器:负责 Region 的分布和迁移
  • 热点调度器:检测和处理热点 Region
  • 副本调度器:管理 Region 副本的分布
  • 合并调度器:合并小 Region,减少元数据开销
  • 分裂调度器:处理 Region 分裂请求

3. TSO 模块

  • 功能:提供全局唯一的时间戳服务
  • Timestamp Oracle:生成全局唯一的时间戳
  • 物理时间与逻辑时间结合:保证时间戳的单调性和唯一性
  • 高可用设计:基于 Raft 协议,保证 TSO 服务的高可用性

4. 元数据管理模块

  • 功能:存储和管理集群的元数据
  • Store 元数据:存储 TiKV 节点的状态和信息
  • Region 元数据:存储 Region 的分布和状态信息
  • Cluster 元数据:存储集群的配置和状态信息
  • 持久化存储:将元数据持久化到本地存储

5. 监控模块

  • 功能:监控集群状态和性能
  • Store 监控:监控 TiKV 节点的资源使用情况
  • Region 监控:监控 Region 的分布和状态
  • 调度监控:监控调度操作的执行情况
  • 告警机制:当检测到异常时触发告警

6. Raft 模块

  • 功能:实现 Raft 共识算法,保证数据一致性
  • Leader 选举:处理 PD 集群的 Leader 选举
  • 日志复制:负责 Raft 日志的复制和提交
  • 成员变更:支持 PD 集群的动态扩容和缩容

核心工作流程

1. TSO 生成流程

TiDB Server → PD Leader → TSO 模块 → 生成时间戳 → TiDB Server

详细步骤

  1. TiDB Server 向 PD Leader 请求全局时间戳
  2. PD Leader 的 TSO 模块生成全局唯一的时间戳
  3. PD Leader 将时间戳返回给 TiDB Server
  4. TiDB Server 使用该时间戳标记事务

2. Region 调度流程

监控模块 → 检测到不平衡 → 生成调度任务 → 调度器 → 执行调度 → 更新元数据

详细步骤

  1. 监控模块实时监控集群状态
  2. 当检测到 Region 分布不平衡、热点或副本异常时,生成调度任务
  3. 调度器根据调度策略选择合适的调度任务
  4. 调度器向 TiKV 节点发送调度命令
  5. TiKV 节点执行调度操作(如迁移 Region、复制副本等)
  6. 执行完成后,更新集群元数据

3. 热点处理流程

监控模块 → 检测到热点 → 生成热点调度任务 → 热点调度器 → 迁移热点 Region → 分散热点

详细步骤

  1. 监控模块实时监控 Region 的访问情况
  2. 当检测到热点 Region 时,生成热点调度任务
  3. 热点调度器选择合适的目标节点
  4. 执行 Region 迁移,将热点 Region 分散到不同节点
  5. 监控热点是否缓解,如未缓解则继续调整

部署与配置

部署方式

1. 使用 TiUP 部署

部署命令

bash
# 编辑拓扑文件
vi topology.yaml

# 部署集群
tiup cluster deploy <cluster-name> <tidb-version> topology.yaml --user root -p

# 启动集群
tiup cluster start <cluster-name>

拓扑文件示例

yaml
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/tidb-deploy"
  data_dir: "/tidb-data"

server_configs:
  pd:
    log.level: "info"
    schedule.max-merge-region-size: 20
    schedule.max-merge-region-keys: 200000

pd_servers:
  - host: 10.0.0.6
    port: 2379
    client_port: 2380
  - host: 10.0.0.7
    port: 2379
    client_port: 2380
  - host: 10.0.0.8
    port: 2379
    client_port: 2380

2. 使用 TiDB Operator 部署

YAML 配置示例

yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbCluster
metadata:
  name: basic
spec:
  version: v7.5.0
  pd:
    replicas: 3
    template:
      spec:
        containers:
        - name: pd
          resources:
            requests:
              cpu: 1
              memory: 2Gi
            limits:
              cpu: 2
              memory: 4Gi
          storageClassName: local-storage
          volumeMounts:
          - name: pd-data
            mountPath: /var/lib/pd
    storage:
      volumeClaimTemplates:
      - metadata:
          name: pd-data
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 100Gi
          storageClassName: local-storage

核心配置参数

1. 基本配置

参数默认值说明
server.port2379PD Server 监听端口,用于内部通信
server.client-port2380PD Server 客户端端口,用于 TiDB 和 TiKV 连接
server.advertise-client-urls对外暴露的客户端 URL
server.advertise-peer-urls对外暴露的节点间通信 URL
server.data-dir"./data"数据存储目录

2. 调度配置

参数默认值说明
schedule.max-snapshot-count3每个 TiKV 节点同时处理的最大快照数量
schedule.max-pending-peer-count16每个 TiKV 节点的最大待处理副本数量
schedule.region-score-formula-versionv1Region 分数计算公式版本
schedule.max-merge-region-size20允许合并的最大 Region 大小(MB)
schedule.max-merge-region-keys200000允许合并的最大 Region 键数量
schedule.enable-cross-table-mergefalse是否允许跨表合并 Region

3. 热点配置

参数默认值说明
hot-region-schedule-limit4热点调度的并发任务数
hot-region-cache-hits-threshold3热点检测的缓存命中阈值
hot-region-schedule-policy"count"热点调度策略,可选值:"count"、"rate"
hot-region-write-rate-threshold1024写入热点的速率阈值(KB/s)
hot-region-read-rate-threshold8192读取热点的速率阈值(KB/s)

4. TSO 配置

参数默认值说明
pd-server.tso-save-interval"3s"TSO 保存间隔
pd-server.tso-update-physical-interval"50ms"物理时间更新间隔
pd-server.enable-local-tsofalse是否启用本地 TSO 服务

配置文件管理

  • 配置文件路径:默认位于 $DEPLOY_DIR/conf/pd.toml
  • 动态配置:大部分配置支持运行时修改,无需重启服务
  • 配置重载:使用 tiup cluster reload cluster-name -R pd 命令重载配置
  • 在线修改:通过 PD API 或 TiUP 在线修改配置

监控与运维

监控指标

PD Server 提供了丰富的监控指标,可通过 Prometheus 收集和 Grafana 可视化:

1. TSO 指标

  • pd_tso_total:生成的 TSO 总数
  • pd_tso_current_timestamp:当前 TSO 时间戳
  • pd_tso_wait_duration_seconds_bucket:TSO 请求等待时间分布
  • pd_tso_requests_total:TSO 请求总数

2. 调度指标

  • pd_scheduler_operator_total:调度操作总数
  • pd_scheduler_operator_finish_total:完成的调度操作数
  • pd_scheduler_operator_fail_total:失败的调度操作数
  • pd_scheduler_pending_operators:待处理的调度操作数
  • pd_scheduler_region_score:Region 分数分布

3. 集群指标

  • pd_cluster_region_count:集群中的 Region 总数
  • pd_cluster_store_count:集群中的 TiKV 节点数
  • pd_cluster_replication_status:集群复制状态
  • pd_cluster_health_score:集群健康分数

4. 热点指标

  • pd_hot_region_count:当前热点 Region 数量
  • pd_hot_region_write_bytes_total:热点 Region 写入字节数
  • pd_hot_region_read_bytes_total:热点 Region 读取字节数
  • pd_hot_region_schedule_total:热点调度操作总数

日志分析

1. 日志格式

文本格式

[2024/01/20 10:00:00.123 +08:00] [INFO] [server.go:1234] ["server is running"] [addr="0.0.0.0:2379"] [client-addr="0.0.0.0:2380"] [version="v7.5.0"]

JSON 格式

json
{
  "level": "info",
  "ts": "2024-01-20T10:00:00.123+08:00",
  "caller": "server.go:1234",
  "msg": "server is running",
  "addr": "0.0.0.0:2379",
  "client-addr": "0.0.0.0:2380",
  "version": "v7.5.0"
}

2. 关键日志分析

  • TSO 日志:记录 TSO 服务的运行状态和性能
  • 调度日志:记录调度操作的执行情况,如 Region 迁移、热点处理等
  • 集群日志:记录集群状态变化,如节点加入/退出、Region 分裂/合并等
  • 错误日志:记录系统错误和异常情况

常见运维操作

1. 查看 PD Server 状态

bash
# 使用 tiup 查看状态
tiup cluster display <cluster-name> | grep pd

# 查看进程状态
ps -ef | grep pd-server

# 查看端口监听
netstat -tlnp | grep 2379

# 使用 PD API 查看集群状态
curl http://<pd-ip>:2379/pd/api/v1/stores

2. 重启 PD Server

bash
# 重启单个 PD Server 节点
tiup cluster restart <cluster-name> -R pd[0]

# 重启所有 PD Server 节点
tiup cluster restart <cluster-name> -R pd

3. 升级 PD Server

bash
# 升级集群所有组件
tiup cluster upgrade <cluster-name> <new-version>

# 仅升级 PD Server 组件
tiup cluster upgrade <cluster-name> <new-version> -R pd

4. 扩容 PD Server

bash
# 编辑拓扑文件,添加新节点
vi topology.yaml

# 扩容集群
tiup cluster scale-out <cluster-name> topology.yaml

5. 缩容 PD Server

bash
# 编辑缩容配置文件
vi scale-in.yaml

# 缩容集群
tiup cluster scale-in <cluster-name> -N <pd-node-ip>:2379

调度策略

1. 副本调度

  • 功能:保证每个 Region 有足够的副本,且分布合理
  • 策略
    • 确保副本分布在不同节点
    • 优先将副本分布在不同可用区
    • 平衡每个节点的副本数量
    • 处理副本缺失或多余的情况

2. 热点调度

  • 功能:检测和处理热点 Region,分散负载
  • 策略
    • 监控 Region 的访问频率和流量
    • 当 Region 成为热点时,将其迁移到负载较低的节点
    • 支持基于访问次数和访问速率的检测
    • 可配置热点检测阈值和调度策略

3. 负载均衡

  • 功能:平衡集群的负载,优化资源利用率
  • 策略
    • 平衡每个节点的 Region 数量
    • 平衡每个节点的存储容量
    • 平衡每个节点的读写流量
    • 考虑节点的资源使用率

4. Region 合并

  • 功能:合并相邻的小 Region,减少元数据开销
  • 策略
    • 合并大小和键数量都较小的相邻 Region
    • 避免跨表合并(除非配置允许)
    • 控制合并速率,避免影响集群性能
    • 合并后 Region 大小不超过阈值

性能优化

1. 调度优化

  • 调整调度并发度

    toml
    # 增加调度并发度,提高调度速度
    schedule.max-snapshot-count = 5
    schedule.max-pending-peer-count = 32
  • 优化合并策略

    toml
    # 允许跨表合并,减少 Region 数量
    schedule.enable-cross-table-merge = true
    # 调整合并阈值,适应业务需求
    schedule.max-merge-region-size = 30
    schedule.max-merge-region-keys = 300000

2. 热点优化

  • 调整热点检测参数

    toml
    # 调整热点检测阈值,适应业务流量
    hot-region-write-rate-threshold = 2048
    hot-region-read-rate-threshold = 16384
    # 增加热点调度并发度
    hot-region-schedule-limit = 8
  • 选择合适的热点调度策略

    toml
    # 基于访问速率调度
    hot-region-schedule-policy = "rate"

3. TSO 优化

  • 调整 TSO 生成参数
    toml
    # 调整物理时间更新间隔,平衡精度和性能
    pd-server.tso-update-physical-interval = "100ms"

4. 集群规模优化

  • 增加 PD 节点数量:对于大规模集群(>100 个 TiKV 节点),建议部署 5 个 PD 节点
  • 调整 PD 内存配置:根据集群规模调整 PD 节点的内存大小,大规模集群建议 8GB 以上

高可用性与容灾

高可用性设计

  • 多节点部署:建议部署 3 个或 5 个 PD 节点,实现高可用性
  • Raft 共识算法:基于 Raft 协议,保证 PD 集群的强一致性和高可用性
  • 自动故障转移:节点故障时自动选举新 Leader,RTO < 30 秒
  • 跨 AZ 部署:将 PD 节点部署在不同可用区,提高容灾能力

容灾部署

  • 跨 Region 部署:将 PD 节点部署在不同地域,实现异地容灾
  • 备份恢复:定期备份 PD 数据,确保数据可恢复
  • 监控告警:设置合理的告警阈值,及时发现和处理问题

故障恢复

  • 节点故障:自动检测并处理节点故障,Raft 组重新选举 Leader
  • 数据损坏:通过 Raft 日志恢复损坏的数据
  • 集群恢复:支持从备份恢复整个 PD 集群

常见问题与排查

1. PD Leader 频繁切换

现象:PD Leader 频繁切换,影响集群稳定性

排查步骤

  • 检查网络延迟:确认节点间网络延迟是否正常
  • 检查系统负载:确认节点 CPU、内存、磁盘 I/O 是否过高
  • 检查 Raft 配置:确认 Raft 选举超时时间是否合适
  • 检查日志:查看 PD 日志中关于 Leader 选举的记录

解决方案

  • 优化网络环境,降低节点间延迟
  • 增加节点资源,降低系统负载
  • 调整 Raft 选举超时时间:
    toml
    server.election-timeout = "3s"
  • 检查并修复硬件故障

2. 调度速度慢

现象:集群负载不均衡,调度操作执行缓慢

排查步骤

  • 检查调度配置:确认调度并发度是否合适
  • 检查 TiKV 状态:确认 TiKV 节点是否健康,是否有大量待处理的快照
  • 检查 PD 日志:查看调度操作的执行情况和失败原因
  • 检查集群规模:确认 PD 节点数量是否适应集群规模

解决方案

  • 增加调度并发度:
    toml
    schedule.max-snapshot-count = 5
    schedule.max-pending-peer-count = 32
  • 修复不健康的 TiKV 节点
  • 增加 PD 节点数量(对于大规模集群)
  • 调整调度策略,优化调度优先级

3. 热点处理不及时

现象:集群中存在热点 Region,影响性能,但 PD 未及时处理

排查步骤

  • 检查热点配置:确认热点检测阈值是否合适
  • 检查热点调度器状态:确认热点调度器是否正常运行
  • 检查 PD 日志:查看热点检测和调度的执行情况
  • 检查业务流量:确认热点是否超过配置的阈值

解决方案

  • 调整热点检测阈值,适应业务流量:
    toml
    hot-region-write-rate-threshold = 2048
    hot-region-read-rate-threshold = 16384
  • 增加热点调度并发度:
    toml
    hot-region-schedule-limit = 8
  • 选择合适的热点调度策略:
    toml
    hot-region-schedule-policy = "rate"

4. TSO 服务异常

现象:TiDB 节点无法获取 TSO,导致事务无法执行

排查步骤

  • 检查 PD Leader 状态:确认 PD Leader 是否正常运行
  • 检查 TSO 模块日志:查看 TSO 服务的运行情况
  • 检查 PD 节点间通信:确认 PD 节点间通信是否正常
  • 检查 TiDB 与 PD 的连接:确认 TiDB 节点能够正常连接到 PD

解决方案

  • 修复或重启异常的 PD Leader 节点
  • 检查并修复 PD 节点间的网络连接问题
  • 调整 TSO 生成参数,适应业务需求
  • 增加 PD 节点数量,提高 TSO 服务的可用性

5. 集群扩容后数据均衡慢

现象:添加新 TiKV 节点后,数据迁移速度慢,新节点负载低

排查步骤

  • 检查调度配置:确认调度并发度是否合适
  • 检查新节点状态:确认新节点是否健康,资源是否充足
  • 检查 PD 日志:查看数据迁移的执行情况
  • 检查集群负载:确认集群是否处于高负载状态

解决方案

  • 增加调度并发度,提高数据迁移速度:
    toml
    schedule.max-snapshot-count = 5
    schedule.max-pending-peer-count = 32
  • 确保新节点资源充足,能够处理大量的快照和数据迁移
  • 在业务低峰期进行扩容操作
  • 调整调度策略,优先处理新节点的数据均衡

最佳实践

1. 部署建议

  • 生产环境:建议部署至少 3 个 PD 节点,实现高可用性
  • 资源配置:每个 PD 节点建议配置 4C 8GB 内存起,根据集群规模调整
  • 存储选择:使用 SSD 存储,提高数据读写性能
  • 网络配置:确保节点间网络延迟低,带宽充足
  • 跨 AZ 部署:将 PD 节点部署在不同可用区,提高容灾能力

2. 配置建议

  • 调度参数:根据集群规模和业务需求调整调度并发度和阈值
  • 热点参数:根据业务流量特点调整热点检测阈值和调度策略
  • 合并策略:根据业务场景决定是否允许跨表合并
  • 日志级别:生产环境建议设置为 "info",避免过多日志影响性能

3. 监控建议

  • 核心指标:监控 PD Leader 状态、TSO 生成、调度操作、热点情况等
  • 告警配置:设置合理的告警阈值,及时发现问题
  • 日志管理:定期清理日志,避免磁盘空间不足
  • 定期巡检:定期检查集群状态,发现并解决潜在问题

4. 维护建议

  • 定期备份:使用 pd-ctl 工具定期备份 PD 数据
  • 定期升级:及时升级到最新版本,获取性能优化和 bug 修复
  • 定期检查:使用 PD API 和 pd-ctl 定期检查集群状态
  • 文档记录:记录集群配置和维护操作,便于后续管理

常见问题(FAQ)

Q1: PD Server 与 ZooKeeper 是什么关系?

A1: PD Server 在 TiDB 集群中扮演着类似 ZooKeeper 的角色,但提供了更多针对 TiKV 集群的优化功能。与 ZooKeeper 相比,PD Server 具有更好的性能、更丰富的调度策略和更适合分布式存储的设计。

Q2: PD Server 如何实现高可用性?

A2: PD Server 基于 Raft 共识算法实现高可用性。多个 PD 节点组成一个 Raft 组,只有当多数节点确认日志后,才会提交并应用到状态机。当 Leader 节点故障时,会自动选举新 Leader,保证服务的连续性。

Q3: PD Server 的 TSO 服务是什么?

A3: TSO (Timestamp Oracle) 是 PD Server 提供的全局唯一时间戳服务。TiDB 利用 TSO 生成事务的全局唯一时间戳,保证分布式事务的外部一致性。TSO 结合了物理时间和逻辑时间,保证时间戳的单调性和唯一性。

Q4: 如何查看 PD Server 的版本?

A4: 可以通过以下方式查看 PD Server 版本:

  • 使用 tiup
    bash
    tiup cluster display <cluster-name> | grep Version
  • 查看日志:PD 启动日志中包含版本信息
  • 使用 PD API
    bash
    curl http://<pd-ip>:2379/pd/api/v1/version

Q5: PD Server 支持多大规模的集群?

A5: PD Server 支持大规模集群:

  • 可以管理数千个 TiKV 节点
  • 可以处理数百万个 Region
  • 已在生产环境中验证支持数万个 TiKV 节点的集群
  • 通过增加 PD 节点数量,可以进一步扩展管理能力

Q6: 如何调整 PD Server 的调度策略?

A6: 可以通过以下方式调整 PD Server 的调度策略:

  • 配置文件:在拓扑文件中配置调度参数,然后使用 TiUP 部署或重载配置
  • PD API:使用 HTTP API 动态调整调度策略
  • pd-ctl:使用 pd-ctl 命令行工具调整调度策略

Q7: PD Server 如何处理热点数据?

A7: PD Server 通过以下机制处理热点数据:

  • 实时监控每个 Region 的访问频率和流量
  • 当 Region 成为热点时,生成热点调度任务
  • 将热点 Region 迁移到负载较低的 TiKV 节点
  • 支持基于访问次数和访问速率的检测策略
  • 可配置热点检测阈值和调度并发度

Q8: PD Server 与 TiKV Server 是什么关系?

A8: PD Server 是 TiKV 集群的管理中心,负责:

  • 监控 TiKV 节点的状态和资源使用情况
  • 管理 Region 的分布和迁移
  • 处理 Region 的分裂和合并
  • 提供全局唯一的时间戳服务
  • 协调 TiKV 节点的扩容和缩容

Q9: 如何备份和恢复 PD Server 数据?

A9: 可以使用以下方式备份和恢复 PD Server 数据:

  • 备份:使用 pd-ctl 工具导出 PD 数据

    bash
    pd-ctl -u <pd-url> backup --file=pd-backup.json
  • 恢复:在新的 PD 集群中导入备份数据

    bash
    pd-ctl -u <new-pd-url> restore --file=pd-backup.json

Q10: PD Server 的性能如何?

A10: PD Server 的性能表现优异:

  • 单个 PD 节点可以处理数万次 TSO 请求每秒
  • 可以管理数千个 TiKV 节点和数百万个 Region
  • 调度操作的延迟低,能够快速响应集群变化
  • 通过水平扩展 PD 节点数量,可以进一步提升性能
  • 已在生产环境中验证支持大规模集群的稳定运行