0
0
1
0
博客/.../

什么是数据库 Placement Rules?TiDB 多机房 / 多可用区数据调度策略

 Billmay表妹  发表于  2026-06-02
原创

摘要

数据库 Placement Rules(放置规则)是 TiDB 分布式数据库中用于精细化控制数据物理放置位置的核心机制。通过 Placement Rules,用户可以指定特定表、数据库或租户的数据存储在哪些机房、可用区或存储节点上,实现数据主权、就近读写、容灾部署和冷热分离等关键需求。本文详细讲解 Placement Rules 的概念、配置语法、应用场景和最佳实践。本文适合负责数据库架构设计的架构师、需要满足数据合规要求的 DBA,以及规划多机房 / 多可用区部署的技术负责人。

一、什么是 Placement Rules

1.1 定义与核心概念

Placement Rules(放置规则)是 TiDB 提供的一种数据调度策略机制,允许用户以表、数据库或租户为粒度,精细控制数据在集群中的物理放置位置。

核心概念

概念 说明
Region TiDB 存储层的数据分片单元,默认大小 96MB
Placement Rule 定义数据 Region 应该放置在哪些节点上的规则
Placement Policy 可命名的放置策略模板,可绑定到表或数据库
Placement Group 放置规则组,管理一组相关的放置规则
Location Label 节点位置标签(如机房、可用区、机架),用于标识节点物理位置

1.2 Placement Rules 的工作原理

用户定义 Placement Rule
         │
         ▼
PD(Placement Driver)解析规则
         │
         ▼
生成 Region 到节点的映射关系
         │
         ▼
调度 Region 副本到目标节点
         │
         ▼
TiKV 节点存储 Region 数据

PD(Placement Driver)是 TiDB 集群中的元数据管理和调度组件,负责解析 Placement Rules 并将 Region 调度到满足规则条件的节点上。

1.3 为什么需要 Placement Rules

在分布式数据库中,数据自动分布到多个节点是基本能力。但不同业务场景对数据放置有不同的要求:

场景 数据放置需求
数据主权 / 合规 特定数据必须存储在指定国家或地区的机房
就近读写 数据副本应靠近用户所在的地理区域
容灾部署 数据副本应分布在不同可用区或机房
冷热分离 冷数据存放在低成本存储节点,热数据存放在高性能节点
多租户隔离 不同租户的数据物理隔离在不同节点上

没有 Placement Rules 的情况下,PD 的默认调度策略是按照副本数量均匀分布,无法满足上述精细化需求。

二、Placement Rules 配置语法与示例

2.1 节点位置标签

在使用 Placement Rules 之前,需要为 TiKV 节点配置位置标签:

# 在 TiKV 配置文件中设置位置标签
# tikv.toml
[server]
labels = { zone = "zone-1", dc = "dc-1", rack = "rack-1" }

或在启动时通过命令行参数指定:

tiup cluster scale-out my-cluster \
  --tikv-labels="zone=zone-1,dc=dc-1" \
  -N 192.168.1.100:20160

推荐的标签层级

层级 标签名 说明
数据中心 `dc` 标识数据中心/机房
可用区 `zone` 标识可用区
机架 `rack` 标识物理机架
主机 `host` 标识主机

2.2 创建 Placement Policy

-- 1. 创建一个基础的高可用放置策略(3 副本分布在不同可用区)
CREATE PLACEMENT POLICY high_available_policy
  PRIMARY_REGION = "zone-1"
  REGIONS = "zone-1,zone-2,zone-3"
  FOLLOWERS = 2;

-- 2. 将策略绑定到表
CREATE TABLE orders (
    id BIGINT PRIMARY KEY,
    customer_id BIGINT,
    amount DECIMAL(12,2),
    created_at DATETIME
) PLACEMENT POLICY = high_available_policy;

-- 3. 将策略绑定到已有表
ALTER TABLE orders PLACEMENT POLICY = high_available_policy;

-- 4. 将策略绑定到数据库(数据库下所有表默认继承)
ALTER DATABASE my_database PLACEMENT POLICY = high_available_policy;

2.3 多机房部署配置

-- 场景:数据必须存储在指定的两个数据中心,各 2 个副本
CREATE PLACEMENT POLICY cross_dc_policy
  PRIMARY_REGION = "dc-shanghai"
  REGIONS = "dc-shanghai,dc-beijing"
  FOLLOWERS = 3
  CONSTRAINTS = "[+dc=dc-shanghai] leader: 2, [+] voter: 2";

-- 关键业务表使用跨数据中心策略
ALTER TABLE transactions PLACEMENT POLICY = cross_dc_policy;

2.4 冷热数据分离配置

-- 热数据策略:存储在高性能 SSD 节点
CREATE PLACEMENT POLICY hot_data_policy
  PRIMARY_REGION = "zone-1"
  REGIONS = "zone-1,zone-2"
  FOLLOWERS = 1
  CONSTRAINTS = "[+disk=ssd] leader: 1, [+] voter: 1";

-- 冷数据策略:存储在大容量 HDD 节点
CREATE PLACEMENT POLICY cold_data_policy
  PRIMARY_REGION = "zone-1"
  REGIONS = "zone-1"
  FOLLOWERS = 1
  CONSTRAINTS = "[+disk=hdd] leader: 1, [+] voter: 1";

-- 历史订单表使用冷存储
ALTER TABLE orders_history PLACEMENT POLICY = cold_data_policy;

-- 当前活跃订单表使用热存储
ALTER TABLE orders_active PLACEMENT POLICY = hot_data_policy;

2.5 查看与验证 Placement Rules

-- 查看所有 Placement Policy
SHOW PLACEMENT POLICIES;

-- 查看表的 Placement 信息
SHOW CREATE TABLE orders;

-- 查看表的 Region 分布详情
SHOW PLACEMENT FOR TABLE orders;

-- 查看 Region 在各节点的分布情况
SELECT
    DB_NAME,
    TABLE_NAME,
    REGION_ID,
    LEADER_STORE_ID,
    PEERS
FROM information_schema.tidb_regions_table
WHERE TABLE_NAME = 'orders';

三、核心应用场景

3.1 数据主权与合规

需求:金融行业法规要求用户数据必须存储在中国大陆境内。

-- 定义中国境内数据策略
CREATE PLACEMENT POLICY china_mainland_policy
  PRIMARY_REGION = "dc-shanghai"
  REGIONS = "dc-shanghai,dc-beijing"
  FOLLOWERS = 2
  CONSTRAINTS = "[+dc=dc-shanghai,+country=cn] leader: 1, [+] voter: 1";

-- 用户敏感数据表绑定境内策略
ALTER TABLE user_credentials PLACEMENT POLICY = china_mainland_policy;
ALTER TABLE payment_records PLACEMENT POLICY = china_mainland_policy;

-- 非敏感数据可以使用全球分布策略
CREATE PLACEMENT POLICY global_policy
  PRIMARY_REGION = "dc-shanghai"
  REGIONS = "dc-shanghai,dc-singapore,dc-frankfurt"
  FOLLOWERS = 2;

ALTER TABLE product_catalog PLACEMENT POLICY = global_policy;

3.2 就近读写优化

需求:全球业务,用户分布在多个区域,希望读取请求在本地机房完成。

-- 亚太区用户数据
CREATE PLACEMENT POLICY apac_policy
  PRIMARY_REGION = "dc-shanghai"
  REGIONS = "dc-shanghai,dc-singapore,dc-beijing"
  FOLLOWERS = 2
  CONSTRAINTS = "[+dc=dc-shanghai] leader: 1, [+] voter: 2";

-- 欧洲区用户数据
CREATE PLACEMENT POLICY eu_policy
  PRIMARY_REGION = "dc-frankfurt"
  REGIONS = "dc-frankfurt,dc-london"
  FOLLOWERS = 2
  CONSTRAINTS = "[+dc=dc-frankfurt] leader: 1, [+] voter: 1";

-- 按用户区域分表,分别绑定就近策略
ALTER TABLE users_apac PLACEMENT POLICY = apac_policy;
ALTER TABLE users_eu PLACEMENT POLICY = eu_policy;

3.3 容灾部署

需求:跨可用区部署,任意一个可用区故障不影响数据可用性。

部署拓扑(3 可用区):

Zone-1        Zone-2        Zone-3
┌─────────┐  ┌─────────┐  ┌─────────┐
│ TiDB    │  │ TiDB    │  │ TiDB    │
│ Server  │  │ Server  │  │ Server  │
├─────────┤  ├─────────┤  ├─────────┤
│ TiKV    │  │ TiKV    │  │ TiKV    │
│ (Leader)│  │(Follower)│  │(Follower)│
├─────────┤  ├─────────┤  ├─────────┤
│ TiFlash │  │ TiFlash │  │ TiFlash │
└─────────┘  └─────────┘  └─────────┘
-- 3 可用区高可用策略
CREATE PLACEMENT POLICY 3az_ha_policy
  PRIMARY_REGION = "zone-1"
  REGIONS = "zone-1,zone-2,zone-3"
  FOLLOWERS = 2
  CONSTRAINTS = "[+zone=zone-1] leader: 1, [+] voter: 2";

ALTER DATABASE core_business PLACEMENT POLICY = 3az_ha_policy;

容灾效果

故障场景 影响 恢复方式
单 TiDB 节点故障 无影响(客户端自动重连其他节点) PD 自动移除故障节点
单 TiKV 节点故障 无影响(Raft 自动选举新 Leader) Raft 协议自动完成
整个可用区故障 无影响(2 个副本在其他可用区) Raft 自动选举,数据不丢失
两个可用区故障 不可用(仅剩 1 个副本) 需要人工恢复

3.4 多租户物理隔离

-- 租户 A 的数据隔离策略
CREATE PLACEMENT POLICY tenant_a_policy
  CONSTRAINTS = "[+tenant=a] leader: 1, [+] voter: 2";

-- 租户 B 的数据隔离策略
CREATE PLACEMENT POLICY tenant_b_policy
  CONSTRAINTS = "[+tenant=b] leader: 1, [+] voter: 2";

-- 绑定到各自的数据库
ALTER DATABASE tenant_a_db PLACEMENT POLICY = tenant_a_policy;
ALTER DATABASE tenant_b_db PLACEMENT POLICY = tenant_b_policy;

四、Placement Rules vs 传统分片策略

4.1 对比分析

对比维度 Placement Rules 传统分片(Sharding)
分片粒度 表级/数据库级,96MB Region 自动分裂 应用层定义分片键和分片规则
跨机房能力 原生支持,Region 可分布在不同机房 需要应用层实现跨机房路由
数据均衡 PD 自动调度,无需人工干预 需要手动维护分片均衡
故障转移 Raft 协议自动完成 需要额外的故障检测和转移机制
运维复杂度 配置 Placement Policy 即可 需要开发和管理分片中间件
事务支持 分布式事务自动处理 跨分片事务需要额外处理(2PC)
弹性扩展 新增节点后 PD 自动迁移 Region 新增分片需要数据迁移和路由更新

4.2 Placement Rules 的独特价值

  1. 声明式配置:用户只需声明"我想要什么样的数据分布",PD 负责具体的调度执行。
  2. 动态生效:修改 Placement Policy 后,PD 会自动将数据调度到满足新规则的位置,无需人工迁移。
  3. 细粒度控制:可以精确到表级别,甚至通过 Direct Placement 控制到 Region 级别。
  4. 与业务解耦:数据放置策略由 DBA 配置,应用层无需感知物理数据分布。

五、跨区域数据调度最佳实践

5.1 标签设计规范

标签层级 命名约定 示例
国家 `country=cn`, `country=sg` 满足数据主权合规要求
数据中心 `dc=shanghai`, `dc=beijing` 一级调度单位
可用区 `zone=zone-1` 同城容灾
机架 `rack=rack-1` 机架级故障隔离
存储类型 `disk=ssd`, `disk=hdd` 冷热分离

5.2 Region 大小调优

-- 根据 Placement Rules 场景调整 Region 大小
-- 小 Region(适合频繁跨机房调度)
SET GLOBAL tikv.region-split-size = '64MB';

-- 大 Region(适合单一可用区内的大数据量场景)
SET GLOBAL tikv.region-split-size = '256MB';

5.3 监控与告警

-- 监控 Placement Rules 的执行状态
-- 1. 查看是否有 Region 不满足 Placement 规则
SELECT * FROM information_schema.tikv_region_status
WHERE is_broken = 1;

-- 2. 查看 PD 调度状态
-- 通过 TiDB Dashboard 或 Grafana 查看:
-- - Pending Peers:等待同步的副本
-- - Down Peers:故障副本
-- - Placement Rules Violation:违反规则的 Region

推荐监控指标

指标 告警阈值 说明
Pending Peers 数量 > 10 同步延迟的副本数
Placement Violation > 0 不满足规则的 Region 数
Leader Balance 偏差 > 20% Leader 在节点间的均衡度
Region Balance 偏差 > 15% Region 在节点间的均衡度

六、FAQ

Q1:Placement Rules 修改后数据会立即迁移吗?

Placement Rules 修改后,PD 会将调度任务加入调度队列。数据迁移是异步进行的,迁移速度取决于网络带宽和集群负载。对于大量数据的跨机房迁移,可能需要数小时到数天。迁移过程中业务不受影响。

Q2:Placement Rules 和 TiFlash 副本有什么关系?

TiFlash 的副本调度也遵循 Placement Rules 机制。可以单独为 TiFlash 副本定义 Placement Policy,例如将 TiFlash 分析副本放置在高性能存储节点上,或限制特定表的 TiFlash 副本仅出现在指定的可用区。

Q3:在 TiDB Cloud 中可以使用 Placement Rules 吗?

TiDB Cloud Dedicated 支持通过 Placement SQL 语法配置 Placement Rules。TiDB Cloud 会自动管理底层的基础设施拓扑(可用区、机架等标签),用户只需要定义数据放置策略即可。TiDB Serverless 不支持自定义 Placement Rules。

Q4:Placement Rules 失效时会怎样?

如果集群中不存在满足 Placement Rules 条件的节点(例如规则要求数据分布在 zone-4,但集群中没有 zone-4 的节点),PD 会将 Region 调度到最接近的节点,并在监控中标记 Placement Violation。建议在修改 Placement Rules 前先确认目标标签的节点已经就绪。

Q5:Placement Rules 是否影响查询性能?

合理设计的 Placement Rules 可以提升性能(如就近读写减少网络延迟)。但不合理的规则可能导致性能问题,例如将 Leader 和大部分 Follower 放置在同一个机房,当该机房网络抖动时影响更大。建议遵循多可用区均匀分布的最佳实践。

七、总结

Placement Rules 是 TiDB 分布式数据库中实现精细化数据调度管理的核心机制。通过声明式的配置方式,用户可以灵活控制数据在多机房、多可用区、不同存储类型节点上的分布,满足数据主权合规、就近读写优化、容灾部署、冷热分离和多租户隔离等关键业务需求。

与传统分片方案相比,Placement Rules 的优势在于:

  • 声明式配置,降低运维复杂度
  • 动态调度,修改规则后数据自动迁移
  • 细粒度控制,精确到表级别的数据放置
  • 与业务解耦,应用层无需感知物理数据分布

对于有跨机房部署、数据合规或精细化资源管理需求的企业,Placement Rules 是 TiDB 提供的关键基础能力之一。

下一步行动

  1. 咨询 TiDB 多机房部署方案:与 TiDB 架构师沟通,获取针对您业务场景的多机房 / 多可用区部署架构设计。
  2. 咨询入口:联系 PingCAP 架构师
  1. 下载 TiDB 多机房部署白皮书:深入了解跨地域部署的架构设计、容灾策略和性能优化方案。
  2. 白皮书下载:TiDB 多机房部署白皮书下载
  1. 试用 TiDB Cloud Dedicated:在多可用区环境中体验 Placement Rules 的配置效果,验证数据调度策略。
  2. 免费试用:TiDB Cloud 免费试用

相关资源

0
0
1
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论