王炎,2013年加入腾讯架构平台部,从事分布式存储平台的开发和运营。目前负责冷数据存储的相关研发工作,主要应对云存储数据快速增长场景下,持续完善分级存储系统,优化总体存储成本。
一、概要
腾讯分布式文件存储(TFS)的数据量在短短数年时间里从0增加至EB级别,使用了几十万块磁盘,增长速度非常迅猛。另外,TFS承载的几乎都是互联网在线存储业务,需要在保证业务正常访问的情况下经常性快速扩容。在这种情况下,存储系统的伸缩性显得尤为重要,扩容过程的高效、稳定就成为必须要解决的问题。
下面介绍TFS平台实现EB级存储伸缩的几个关键技术。
二、存储Set模型
在系统快速扩容的过程中,必须要解决的问题是:系统以何种方式进行扩容,扩容的时候如何保证扩容操作和流程简单、快速、可靠。TFS的数据层使用了存储Set来解决这些问题。
存储Set是TFS系统内部快速扩容的一个标准单位。TFS整体的系统架构采用了文件索引和文件数据内容分离存储的设计方式,整个数据集群划分为多个存储Set,各个存储Set独立运营,之间没有任何依赖。每次需要扩容的时候,只要增加存储Set到TFS存储系统中即可。
1、存储Set定义
存储Set内部自成存储集群。每个Set内部有控制节点(ChxMaster)和若干存储节点(Chxd)组成。其中ChxMaster节点负责整个子系统内部的集群控制、路由、数据调度等控制层逻辑;而Chxd则部署到各个存储服务器上,负责本地数据的存取,Set内部的数据复制与重建,底层磁盘管理等数据层的逻辑。
存储Set有以下特点:
◆ 每个存储Set对外提供了独立的数据读写功能,数据上传之后,ChxMaster会返回一个存储Set内部的Key供客户端后续访问。
◆ 存储Set内部的各个存储节点采用了同构设计,一个存储Set内部只有一种类型的存储服务器硬件,这样可以大大简化存储Set内部的负载均衡和空间管理。各个存储Set之间采用同样数量的硬件。比如典型3备份的存储Set都使用了30台存储服务器。
2、存储Set的使用优点
当集群规模变大之后,不可避免地会遇到人工操作失误、评估困难、资源调整、软硬件更新换代等问题。而TFS把数据集群拆分成各个标准化的存储Set之后,可以带来以下好处:
1)标准化部署
因为每次需要扩容的时候,只需要再多部署指定数量的存储Set。这种例行的扩容操作就很容易标准化下来。对于系统规格的评估也变得相对简单,可以简化为每个Set可以提供多少存储容量,以及对应的性能规格。这样人工操作失误导致事故的概率就大大降低,也很容易从系统层面自动进行校验,提前发现风险。
2)故障隔离
数据的复制、流动限制在存储Set内部,所以单个节点故障造成的影响只会限制在单个存储Set内部,不会影响到整个TFS系统。这样就可以起到很好的故障隔离效果,解决大规模集群下,错误扩散的问题。
3)单独的读写控制
因为各个存储Set各自相对独立,我们很容易在接入层对各个存储Set的写负载进行单独控制。在进行新的软件版本测试和灰度上线的时候,就可以逐步放量,比较容易控制节奏。
4)高效数据迁移
TFS系统已经运行好多年,几乎每年都会有机房裁撤和机器退役导致的数据迁移需求。存储Set模型固定之后就可以使用两个存储Set之间数据对拷的方式,而不用修改文件索引层,大大降低数据迁移的成本。
三、弹性小表
TFS的文件索引部分使用的是基于一致性哈希设计的分布式Key-Value系统(TSSD)。TSSD通过将哈希空间等分为N份,每份作为一个虚拟节点,在TFS系统中使用称为小表的逻辑结构来承载。在进行数据迁移和扩容的时候,小表是最小的调度单元。
TFS的索引系统无法像数据层那样分为各个Set,只能使用中心服务式的设计,在弹性方面要能够从3台服务器扩展到上千台。在云服务的场景下,除了常规的扩容之外,还需要解决多租户、以及成本优化等问题。
1、资源隔离
作为云存储的平台,TSSD需要支持多租户特性。在多个租户共享一个存储集群的时候,各个租户之间在容量和访问性能上难免会有冲突。
TSSD给底层的小表分配各自独立的物理存储空间,同时每个小表的IO性能也从存储引擎层面做了限制。通过将不同的小表分配给不同的租户的方式,解决了云平台多租户数据物理隔离的问题,并且为每个租户提供了基础性能保证。
2、按需分配
在进行容量配额管理的时候,从一开始就为每个小表指定好一段连续的物理存储空间是最简单的实现方式。但是在实际运营的过程中,往往会遇到容量预估不准确等问题。另外在进行扩容的时候,为了保证迁移粒度不至于过大,需要进行小表分裂。但是当分裂刚完成的时候,空间利用率又会有突然下降。这样每个小表都需要各自独立的预留空间,存储空间利用率很低。
为解决这个问题,我们对每个小表的存储空间采用按需分配的策略。只有当数据真实写入的时候,才从整个SSD线型空间上分配一个Block给这个小表。这样在进行小表分裂的时候,各个小表未使用的空间不必预先占用,从整体上提高了TSSD系统的存储利用率,并且又不会丧失在物理上资源隔离的优点。
四、TDisk系统
TFS系统使用了非常多的大容量廉价机械磁盘,同时这些磁盘是整个TFS系统中故障率最高的硬件部件。另外,在系统不断变迁的同时,不可避免会引入不同规格、不同供应商提供的各种硬件。如何高效使用这些硬件,并提供统一的错误处理,是整个存储系统保证稳定可靠必须要解决的问题。
TFS系统使用了TDisk作为底层磁盘的一个管理系统,将底层不稳定、异构的硬件介质屏蔽为相对统一、稳定的资源,在扩容的时候良好地支持各种存储类型的硬件。
1、盘符管理
Linux OS的盘符漂移一直以来都是分布式存储系统需要解决的一个问题。但是传统存储系统中,修改内核固定盘符的做法过于笨重,每当需要适配新内核版本的时候,盘符管理的部分也需要随着更新一次。并且添加新的硬件类型支持也不容易。
TDisk使用的是纯用户态处理的方式,使用udev机制,将现有系统的盘符重新映射,为上层软件提供必需的硬件槽位信息。这种做法没有OS内核版本的限制,对于硬件的兼容性也较好。在插拔硬盘的时候,即使不重启存储服务器,逻辑盘符也不会发生变动,也很大程度上降低了运维的压力,以及坏盘对系统带来的冲击。
!
2、IO栈定制
Linux默认的IO栈为了通用性考虑,比较复杂。目前开源的分布式存储系统普遍基于文件系统进行设计,整个链路过长,出问题的话定位起来也很困难。如果存储进程因为IO未响应卡住,必须重启服务器才可以解决,影响范围较大。
TDisk采用了定制的IO栈,绕过了PageCache等部分,并且提供了IO超时处理,防IO挂死等强化设计,使得整个底层IO路径更加简单可靠。
3、磁盘扫描
机械磁盘上的数据在长久存储之后,会因为磁盘坏道等原因造成部分数据丢失或损坏。但是如果没有业务访问来触发这个错误的话,很可能无法及时修复,造成数据可靠性降低,有数据丢失的风险。这个问题在数据规模越来越大,数据越来越“冷”的情况下显得尤为严重。
TDisk提供了磁盘定期扫描的功能来解决数据静默错误的问题。每个月会将磁盘上的数据完整扫描一遍,发现磁盘坏扇区,并针对这些区域进行自动修复。提升了TFS数据的可靠性,并避免整盘替换带来的系统冲击。
另外,磁盘扫描的时候,会对业务IO的性能表现造成影响,所以TDisk会实时监控业务访问的压力。当磁盘比较空闲的时候全速扫描,业务有压力的时候降低扫描的压力,如果业务压力过大则暂停。
五、总结
TFS存储系统通过Set模型、弹性小表、TDisk等关键的技术和设计,切实地解决了大规模存储系统在快速扩容时遇到的一系列问题,有效地支撑了TFS存储系统的高速发展,为所有使用TFS存储系统的业务保驾护航。
原文出自
原文链接https://www.qcloud.com/community/article/623868