外观
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详细步骤:
- TiDB Server 向 PD Leader 请求全局时间戳
- PD Leader 的 TSO 模块生成全局唯一的时间戳
- PD Leader 将时间戳返回给 TiDB Server
- TiDB Server 使用该时间戳标记事务
2. Region 调度流程
监控模块 → 检测到不平衡 → 生成调度任务 → 调度器 → 执行调度 → 更新元数据详细步骤:
- 监控模块实时监控集群状态
- 当检测到 Region 分布不平衡、热点或副本异常时,生成调度任务
- 调度器根据调度策略选择合适的调度任务
- 调度器向 TiKV 节点发送调度命令
- TiKV 节点执行调度操作(如迁移 Region、复制副本等)
- 执行完成后,更新集群元数据
3. 热点处理流程
监控模块 → 检测到热点 → 生成热点调度任务 → 热点调度器 → 迁移热点 Region → 分散热点详细步骤:
- 监控模块实时监控 Region 的访问情况
- 当检测到热点 Region 时,生成热点调度任务
- 热点调度器选择合适的目标节点
- 执行 Region 迁移,将热点 Region 分散到不同节点
- 监控热点是否缓解,如未缓解则继续调整
部署与配置
部署方式
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: 23802. 使用 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.port | 2379 | PD Server 监听端口,用于内部通信 |
server.client-port | 2380 | PD Server 客户端端口,用于 TiDB 和 TiKV 连接 |
server.advertise-client-urls | 空 | 对外暴露的客户端 URL |
server.advertise-peer-urls | 空 | 对外暴露的节点间通信 URL |
server.data-dir | "./data" | 数据存储目录 |
2. 调度配置
| 参数 | 默认值 | 说明 |
|---|---|---|
schedule.max-snapshot-count | 3 | 每个 TiKV 节点同时处理的最大快照数量 |
schedule.max-pending-peer-count | 16 | 每个 TiKV 节点的最大待处理副本数量 |
schedule.region-score-formula-version | v1 | Region 分数计算公式版本 |
schedule.max-merge-region-size | 20 | 允许合并的最大 Region 大小(MB) |
schedule.max-merge-region-keys | 200000 | 允许合并的最大 Region 键数量 |
schedule.enable-cross-table-merge | false | 是否允许跨表合并 Region |
3. 热点配置
| 参数 | 默认值 | 说明 |
|---|---|---|
hot-region-schedule-limit | 4 | 热点调度的并发任务数 |
hot-region-cache-hits-threshold | 3 | 热点检测的缓存命中阈值 |
hot-region-schedule-policy | "count" | 热点调度策略,可选值:"count"、"rate" |
hot-region-write-rate-threshold | 1024 | 写入热点的速率阈值(KB/s) |
hot-region-read-rate-threshold | 8192 | 读取热点的速率阈值(KB/s) |
4. TSO 配置
| 参数 | 默认值 | 说明 |
|---|---|---|
pd-server.tso-save-interval | "3s" | TSO 保存间隔 |
pd-server.tso-update-physical-interval | "50ms" | 物理时间更新间隔 |
pd-server.enable-local-tso | false | 是否启用本地 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/stores2. 重启 PD Server
bash
# 重启单个 PD Server 节点
tiup cluster restart <cluster-name> -R pd[0]
# 重启所有 PD Server 节点
tiup cluster restart <cluster-name> -R pd3. 升级 PD Server
bash
# 升级集群所有组件
tiup cluster upgrade <cluster-name> <new-version>
# 仅升级 PD Server 组件
tiup cluster upgrade <cluster-name> <new-version> -R pd4. 扩容 PD Server
bash
# 编辑拓扑文件,添加新节点
vi topology.yaml
# 扩容集群
tiup cluster scale-out <cluster-name> topology.yaml5. 缩容 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 数据bashpd-ctl -u <pd-url> backup --file=pd-backup.json恢复:在新的 PD 集群中导入备份数据
bashpd-ctl -u <new-pd-url> restore --file=pd-backup.json
Q10: PD Server 的性能如何?
A10: PD Server 的性能表现优异:
- 单个 PD 节点可以处理数万次 TSO 请求每秒
- 可以管理数千个 TiKV 节点和数百万个 Region
- 调度操作的延迟低,能够快速响应集群变化
- 通过水平扩展 PD 节点数量,可以进一步提升性能
- 已在生产环境中验证支持大规模集群的稳定运行
