老司机带你探知存储伸缩之道

一、概要

腾讯分布式文件存储(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 有以下特点:

◆ 每个存储 Se t对外提供了独立的数据读写功能,数据上传之后,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 存储系统的业务保驾护航。

原文链接:

编辑于

王炎的专栏

1 篇文章1 人订阅

我来说两句

1 条评论
登录 后参与评论

相关文章

来自专栏架构师之路

58怎么玩数据库架构(upyun架构与运维大会速记)

大家好,我是58沈剑,今天我分享的主题是《58怎么玩数据库架构》,我的PPT页数非常少,讨论的问题非常的聚焦。 一、数据库的基本概念 基本概念就一页PPT,让大...

3679
来自专栏杨建荣的学习笔记

数据库无响应问题的紧急处理和分析 (r10笔记第42天)

黄金周里处理了一起紧急的问题,在外面幸亏有同事帮忙协助,等我赶回家去,赶紧继续处理。 首先问题是在晚饭时间左右开始发生,但是过了没多久又恢复了,所以这个问题暂时...

31512
来自专栏DevOps时代的专栏

维护了这么久的服务器,你真的认识 Web 缓存体系?

前言 很高兴认识大家,之前做过很多分享,今天这次终于讲到正题了。因为之前一直讲自动化运维,其实做这么多年运维,自动化运维没干多少年。这几年很多公司各方面机器数量...

1948
来自专栏TEG云端专业号的专栏

老司机带你探知存储伸缩之道

一、概要 腾讯分布式文件存储(TFS)的数据量在短短数年时间里从0增加至EB级别,使用了几十万块磁盘,增长速度非常迅猛。另外,TFS承载的几乎都是互联网在线存储...

2756
来自专栏JAVA技术zhai

大话微服务架构的故障隔离及容错处理机制

8、限流器和负载开关(Rate Limiters and Load Shedders)

1002
来自专栏EAWorld

基于微服务的日志中心设计、实现与关键配置

日志向来都是运维以及开发人员最关心的问题。运维人员可以及时的通过相关日志信息发现系统隐患、系统故障并及时安排人员处理解决问题。开发人员解决问题离不开日志信息的协...

842
来自专栏韩伟的专栏

分布式本质论:高吞吐、高可用、可扩展

大量用户访问同一个互联网业务,所造成的问题并不简单。从表面上看,要能满足很多用户来自互联网的请求,最基本的需求就是所谓性能需求:用户反应网页打开很慢,或者网游中...

9590
来自专栏13blog.site

大型网站技术架构(三)--架构模式

前言 模式:每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作。 网站架构模式:...

2749
来自专栏魏琼东

DotNET企业架构应用实践-数据库表记录的唯一性设计的设计兼议主键设定原则

简要介绍          在我们进行数据库设计的时候,大家都会考虑到数据表主键的设计,而可能没有人去关注记录唯一性字段设计,或者说,很多开发人员把这两种混合在...

1725
来自专栏james大数据架构

零代码如何打造自己的实时监控预警系统

概要 为什么要做监控 线上发布了服务,怎么知道它一切正常,比如发布5台服务器,如何直观了解是否有请求进来,访问一切正常。 当年有一次将线上的库配置到了Beta,...

3326

扫码关注云+社区