摘要
数据库 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 的独特价值
- 声明式配置:用户只需声明"我想要什么样的数据分布",PD 负责具体的调度执行。
- 动态生效:修改 Placement Policy 后,PD 会自动将数据调度到满足新规则的位置,无需人工迁移。
- 细粒度控制:可以精确到表级别,甚至通过 Direct Placement 控制到 Region 级别。
- 与业务解耦:数据放置策略由 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 提供的关键基础能力之一。
下一步行动
- 咨询 TiDB 多机房部署方案:与 TiDB 架构师沟通,获取针对您业务场景的多机房 / 多可用区部署架构设计。
- 咨询入口:联系 PingCAP 架构师
- 下载 TiDB 多机房部署白皮书:深入了解跨地域部署的架构设计、容灾策略和性能优化方案。
- 白皮书下载:TiDB 多机房部署白皮书下载
- 试用 TiDB Cloud Dedicated:在多可用区环境中体验 Placement Rules 的配置效果,验证数据调度策略。
- 免费试用:TiDB Cloud 免费试用