结论先行
TiDB6.0正式提供了数据放置框架(PlacementRulesinSQL)功能,用户通过SQL配置数据在TiKV集群中的放置位置,可以对数据进行直接的管理,满足不同的业务场景需要。如:
1.冷热分离存储,降低存储成本
TiDB6.0正式支持数据冷热存储分离,可以降低SSD使用成本。使用TiDB6.0的数据放置功能,可以在同一个集群实现海量数据的冷热存储,将新的热数据存入SSD,历史冷数据存入HDD,降低历史归档数据存储成本。
将热数据从ssd迁移到hdd,每小时可归档约万行,总体来看效率还是比较高的
将冷数据从hdd迁移到ssd,每小时可迁移约万行,大约是从ssd迁移到hdd速度的2倍
分离存储过程,ssd和hdd用于归档的IO消耗都在10%以内,集群访问QPS表现平稳,对业务访问的影响较小
在补写冷数据场景,每小时写入约万行到hdd,数据可正确地直接写入hdd,不会经过ssd
2.业务底层物理隔离,实现同一集群不同存储
通过放置规则管理将不同数据库下的数据调度到不同的硬件节点上,实现业务间数据的物理资源隔离,避免因资源争抢,硬件故障等问题造成的相互干扰
通过账号权限管理避免跨业务数据访问,提升数据质量和数据安全。
3.合并MySQL业务,降低运维压力,提升管理效率
使用少数TiDB集群替换大量的MySQL实例,根据不同业务底层设置不同的物理存储隔离需求,让数据库数量大大减少,原本的升级、备份、参数设置等日常运维工作将大幅缩减,在资源隔离和性价比上达到平衡,大幅减少DBA日常的运维管理成本。
我们的HTAP集群目前有一个数据归档需求,整个集群共约TB,考虑到成本和访问频率、性能等各方面需求,要求至少存储3个月共约80TB到ssd,TB存到hdd,现在基于我们的大数据冷热分离归档业务场景,本文重点探讨冷热数据归档存储的功能和特性,以方便下一步我们正式应用到生产环境。
TiDB集群通过PD节点(PlacementDriver组件)在系统内基于热点、存储容量等策略自动完成region的调度,从而实现集群数据均衡、分散存储在各个节点的目标,这些调度操作是集群的自身管理行为,对用户而已几乎是透明的,在之前的版本用户无法精确控制数据的存储方式和位置。
TiDB6.0正式提供了数据放置框架(PlacementRulesinSQL)功能,用户通过SQL配置数据在TiKV集群中的放置位置,可以对数据进行直接的管理,以满足不同的业务场景需要。用户可以将库、表和分区指定部署至不同的地域、机房、机柜、主机。还支持针对任意数据提供副本数、角色类型等维度的灵活调度管理能力,这使得在多业务共享集群、跨中心部署、冷热数据归档存储等场景下,TiDB得以提供更灵活更强大的数据管理能力。
该功能可以实现以下业务场景:
动态指定重要数据的副本数,提高业务可用性和数据可靠性
将最新数据存入SSD,白癜风存入HDD,降低归档数据存储成本
把热点数据的leader放到高性能的TiKV实例上,提供高效访问
不同业务共用一个集群,而底层按业务实现存储物理隔离,互不干扰,极大提升业务稳定性
合并大量不同业务的MySQL实例到统一集群,底层实现存储隔离,减少管理大量数据库的成本
原理简介
早期版本的Placementrule使用时需要通过pd-ctl工具设置和查看,操作繁琐且晦涩难懂。经过几个版本的迭代和优化,推出的PlacementRulesinSQL对用户更加友好,到了v6.0.0总体来说还是很方便理解和使用的,避免了使用pd-ctl工具配置的复杂性,大大降低使用门槛。
放置策略的实现依赖于TiKV集群label标签配置,需提前做好规划(设置TiKV的labels)。可通过showplacementlabels查看当前集群所有可用的标签。
mysqlshowplacementlabels;
+------+-----------------------------------------------------------------+
Key
Values
+------+-----------------------------------------------------------------+
disk
["ssd"]
host
["tikv1","tikv2","tikv3"]
rack
["r1"]
zone
["guangzhou"]
+------+-----------------------------------------------------------------+
4rowsinset(0.00sec)
使用时有基础用法和高级用法两种方式。
(1)基础放置策略
基础放置策略主要是控制Raftleader和followers的调度。
#创建放置策略
CREATEPLACEMENTPOLICYmyplacementpolicyPRIMARY_REGION="guangzhou"REGIONS="guangzhou,shenzhen";
#将规则绑定至表或分区表,这样指定了放置规则
CREATETABLEt1(aINT)PLACEMENTPOLICY=myplacementpolicy;
CREATETABLEt2(aINT);
ALTERTABLEt2PLACEMENTPOLICY=myplacementpolicy;
#查看放置规则的调度进度,所有绑定规则的对象都是异步调度的。
SHOWPLACEMENT;
#查看放置策略
SHOWCREATEPLACEMENTPOLICYmyplacementpolicy\G
select*frominformation_schema.placement_policies\G
#修改放置策略,修改后会传播到所有绑定此放置策略的对象
ALTERPLACEMENTPOLICYmyplacementpolicyFOLLOWERS=5;
#删除没有绑定任何对象的放置策略
DROPPLACEMENTPOLICYmyplacementpolicy;
(2)高级放置策略
基础放置策略主要是针对Raftleader、Raftfollowers的调度策略,如果需要更加灵活的方式,如不区分region角色将数据指定存储在hdd,需要使用高级放置策略。使用高级放置策略主要有两个步骤,首先创建策略,然后在库、表或分区上应用策略。
#创建策略,指定数据只存储在ssd
CREATEPLACEMENTPOLICYstoreonfastssdCONSTRAINTS="[+disk=ssd]";
#创建策略,指定数据只存储在hdd
CREATEPLACEMENTPOLICYstoreonhddCONSTRAINTS="[+disk=hdd]";
#在分区表应用高级放置策略,指定分区存储在hdd或者ssd上,未指定的分区由系统自动调度
CREATETABLEt1(idINT,nameVARCHAR(50),purchasedDATE)
PARTITIONBYRANGE(YEAR(purchased))(
PARTITIONp0VALUESLESSTHAN()PLACEMENTPOLICY=storeonhdd,
PARTITIONp1VALUESLESSTHAN(),
PARTITIONp2VALUESLESSTHAN(),
PARTITIONp3VALUESLESSTHAN(),
PARTITIONp4VALUESLESSTHANMAXVALUEPLACEMENTPOLICY=storeonfastssd
);
高级放置策略具体内容,请看