写点什么

360 自研分布式海量小文件存储系统的设计与实现

  • 2019-07-02
  • 本文字数:2548 字

    阅读完需:约 8 分钟

360自研分布式海量小文件存储系统的设计与实现

背景

近年来,公司业务发展迅猛,为数众多的业务场景产生了大量的图片,文档,音频,视频等非结构化数据,尤其是随着移动互联网、AI、IoT 技术的成熟和应用市场的全面爆发,大量智能硬件设备将会生成更大规模的非结构化多媒体数据。如此大量的小文件如何存储,问题应运而生。传统存储厂商出售的存储服务价格昂贵,公有云厂商对具体业务场景的定制化改造略有欠缺,因此,我们决定自研小文件存储服务。

NebulasFs 简介

曾经关注小文件存储技术的同学可能阅读过 Facebook 发表的那篇关于海量小图片存储系统 Haystack 的论文(Finding a needle in Haystack: Facebook’s photo storage),Haystack 通过合并多个小文件成一个大文件、以减少文件数量的方式解决了普通文件系统在存储数量巨大的小文件时的问题:获取一次文件多次读取元数据信息、文件访问的“长尾”效应导致大量文件元数据不容易缓存等。基于在 Haystack 的论文中得到的借鉴和参考,我们研发了自己的分布式小文件存储系统——NebulasFs。它是一个分布式、高可用、高可靠、持久化小文件存储系统,可以存储数以百亿的小文件。

架构设计

从分布式角色上划分,可以分为 Master 和 Datanode 两个大的角色。


其中,Master 负责集群的元数据存储、集群管理、任务调度等工作,它的数据一致性目前由外部一致性工具(ETCD 等)实现。Master 是一个主多个备。Datanode 是面向用户的,它主要负责数据存储和用户请求的路由、分发。


Datanode 节点包括存储 Volume 文件和 Proxy 模块。如下图所示。



用户的请求可以请求任意一个 Datanode 节点,节点的 Proxy 模块会代理用户请求到正确的数据存储节点,并返回给用户结构。对于多个副本的写请求,Proxy 模块会按照副本的一致顺序并行写入直至全部成功后返回。对于读请求只读取第一个副本。

NebulasFs 功能

为了在存储容量、一致性、可用性等方面有更好的提升来满足海量小文件存储的需求,相对于 Haystack 论文,我们在接口服务、分布式架构方面做了更多的优化,主要体现在以下方面:

一、提供给用户使用的服务接口简单、轻量、通用

NebulasFs 提供给用户 Http Restful 接口,协议更简单,使用更方便,用户可以通过简单的 PUT,GET 等操作上传和下载文件。用户无需使用定制的客户端,更加轻量级。

二、用户请求全代理、自动路由

我们知道,Datanode 具有数据存储的功能,可是对于数量众多的 Datanode 来说,用户要想知道哪些数据存储在哪个 Datanode 上是需要先从 Master 拿到数据路由的元数据才知道,这增加了用户请求的复杂度。我们在 Datanode 上增加了请求代理、路由模块把用户的请求自动代理、路由到正确的 Datanode 上,使得用户一次请求既能获取数据。


三、多租户,提供租户资源隔离机制,避免相互影响

一个集群提供的服务可能有多个用户来使用,为了避免互相影响,NebulasFs 抽象出了资源池的概念,不同的资源池物理上是分布在不同的硬件之上,资源池在机器维度上不交叉,可以有效的做到资源的隔离。不同的用户可以分布在不同的资源池也可以共享资源池,这需要管理员提前做好规划。资源池类型是多样的,它的范围可能是跨数据中心的,也可能是跨机柜,也可能是在一个机柜之内的。根据不同的物理硬件性能和数据副本存储冗余需求,对不同类型的数据存储需求也需要提前规划。

四、可定制的数据多副本存储方案,数据无丢失、多种故障域组合

为了提供可用性,保证写入数据不丢失,文件数据一般都会做容灾存储大于 1 的副本数量,以便在发生不可恢复的硬件故障时保证数据可用性以及用作之后的自动补齐副本数量。不同重要级别的数据和不同级别故障类型决定了使用不同级别的存储方案。NebulasFs 预先定义了 5 个级别的故障域,分别是:数据中心、机柜列、机柜、机器、磁盘。要求可用性较高的数据存储时使用跨数据中心做容灾副本,以便在整个数据中心不可用时使用另外一个数据中心的数据。要求没那么高的数据可以在做容灾副本策略的时候选择跨机柜存储即可,使得即便在边沿交换机故障后也可用。



NebulasFs 故障域和资源隔离池之间的关系如下:



S 代表服务器,R-1, R-2 是属于数据中心 DC-1 的两个机柜,R-3, R42 是属于数据中心 DC-2 的两个机柜。Pool-1 是跨机柜故障域的资源隔离池,Pool-2 是跨数据中心故障域的资源池,Pool-3 是跨服务器故障域的资源池。


NebulasFs 故障域逻辑和物理概念对应如下:



其中上半部分是逻辑概念,下半部分是物理概念。用户及请求均与逻辑概念相关,管理运维涉及物理概念相关。一个用户可以对应一个或者多个 Collection, 一个 Collection 对应多个 Volume, 每个 Volume 是存储在 DataNode 上的文件(有几个副本就有几个文件)。一般一个 DataNode 对应服务器上的一块硬盘。一台服务器上有多个 DataNode。服务器(Server)的上层是机柜(Rack)、一排机柜(Row)和数据中心(DataCenter)。

五、自动化扩容和再平衡

扩容分为存储容量不足进行扩容和请求流量过载进行的扩容。由于容量不足的扩容后无需再平衡,只有请求流量大扩容后需要做数据再平衡。再平衡是按照容灾副本数等策略进行的,按照策略添加的 Datanode 会自动注册到 Master 上,Master 按照预定的规则进行协调再平衡。


两种扩容情况如下:



六、自动化副本修复补齐

一定规模的集群故障可能会变的比较频繁,在我们的系统中故障很大程度上意味着数据副本的丢失,人工补齐数据副本工作量较大,因此自动化补齐副本就成了一个比较重要的功能。自动化补齐副本是靠 Master 发现副本缺失和协调补齐的。在补齐的过程中数据副本都会变成只读。过程如下图:



整个自动化副本补齐如下图所示:



由于硬盘故障,数据节点 2 和 3 上的 Volume 3 和 6 副本丢失,自动补齐自动把这两个副本补齐到数据节点 4 和 5 上,并加入到集群中。

小结

到目前为止,NebulasFs 在内部已经使用了近一年的时间。除此之外 NebulasFs 还做为后端存储为另一个对象存储(AWS S3 协议)提供服务以存储大文件。


伴随着业务的不断接入,NebulasFs 也会不断完善,为业务增长提供更好的保障。


本文转载自公众号 360 云计算(ID:hulktalk)


原文链接


https://mp.weixin.qq.com/s?__biz=MzU4ODgyMDI0Mg==&mid=2247486588&idx=1&sn=1b63e9768980444aea29336a4a689ac7&chksm=fdd7b601caa03f172cba2cbcb8e1d0dc33705c7fee7ee1196baf38fdb2cc3599fc352388ced6&scene=27#wechat_redirect


2019-07-02 08:005963

评论

发布
暂无评论
发现更多内容

北京多部门联合整治违规应用:过度收集用户信息该重罚

石头IT视角

批量把Excel数据自动录入系统

木头

自动录入 批量录入 自动填表

☕【JVM技术探索】深入分析各种锁(锁膨胀)运作流程

码界西柚

JVM 锁升级 6月日更 锁分析

业务架构训练营第 0 期模块五作业

菠萝吹雪—Code

架构实战营

HashMap源码总结

wzh

Java map 数据结构与算法 HashMap底层原理 散列表

数组与链表

wzh

Java 数组 链表 ArrayList 数据结构与算法

机器数及特点

若尘

计算机组成原理 6月日更

银行业运维指标体系建设实战

云智慧AIOps社区

智能运维

Redis入门四:数据持久化

打工人!

redis redis持久化 6月日更

常见Java容器对比

wzh

Java collection hashmap set map

线性排序

wzh

Java 排序算法 计数排序 基数排序 桶排序

腾讯安全姬生利:《数据安全法》下,云上数据安全最佳实践

腾讯安全云鼎实验室

数据安全 云安全 数据安全法

5分钟速读之Rust权威指南(二十七)Rc<T>

wzx

rust

Reactive Spring实战 -- 响应式Kafka交互

binecy

kafka spring

小红书 x StarRocks:实现数据服务平台统一化,简化数据链路,提升高并发极速查询能力

StarRocks

数据库 数据分析 广告系统 小红书 StarRocks

58集团 x StarRocks:全面升级数据分析能力,满足多场景业务分析需求

StarRocks

数据库 数据分析 OLAP 58同城 StarRocks

JavaScript 数组操作必须熟练运用的 10 个方法

devpoint

JavaScript array reduce 6月日更

什么是OneData?阿里数据中台实施方法论解读

云祁

数据中台 数据仓库 OneData 维度建模

基于jira的需求交付效率统计

好孩子

Jira

RestTemplate打印日志的正确姿势

编号94530

spring 日志 log RestTemplate

推荐算法概述(十五)

Databri_AI

算法 倒排索引 推荐系统

ARTS - 日常打卡 6

pjw

云开发是啥?看看它在编程导航项目的实践

程序员鱼皮

Java JavaScript 大前端 后端 云开发

如何用视频云技术,搞一个爆红的 “反应视频” 项目?

阿里云CloudImagine

阿里云 RTC 英特尔 视频处理 视频制作

十年一剑智能眼镜的中场战事

脑极体

微信小程序开发(七)—— 版本管理的使用

空城机

微信小程序 大前端 6月日更

LinkedHashMap

wzh

Java 集合 LRU 数据结构与算法 LinkedHashMap

网络攻防学习笔记 Day52

穿过生命散发芬芳

网络攻防 6月日更

Kubernetes手记(19)- 容器资源限制

雪雷

k8s 6月日更

微服务架构下的静态数据通用缓存机制

xcbeyond

缓存 微服务 6月日更

领域驱动设计101 - 领域服务

luojiahu

领域驱动设计 DDD

360自研分布式海量小文件存储系统的设计与实现_数据库_冯培源_InfoQ精选文章