8

历时四年,分布式文件系统 JuiceFS 正式开源

 3 years ago
source link: https://www.infoq.cn/article/LN7TrSx364aMgVds05Vo
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

JuiceFS 是为海量数据设计的分布式文件系统,使用对象存储来做数据持久化,避免重复造轮子,还能大大降低工程复杂度,让开发者专注解决元数据和访问协议部分的难题。

云原生分布式文件系统 JuiceFS 正式开源

1 月 11 日, Juicedata 果汁数据科技官方账号宣布 JuiceFS 正式开源 ,这是一个云原生分布式文件系统,经过了四年的持续迭代和累计几千万小时的线上考验。Davies(刘洪清,Juicedata 创始人、TGO 鲲鹏会会员)在文中表示:

JuiceFS 的创新架构更符合云原生的发展趋势,我们一开始就以 SaaS 的形式将它提供给公有云的客户,让客户分钟级就可以获得 PB 级企业文件存储服务。同时,我们也和行业优秀的对象存储厂商一起服务私有云客户。

GitHub 地址: https://github.com/juicedata/juicefs

2020 年 2 月份,Davies 曾在接受 TGO 采访时聊起了一路创办 Juicedata 的故事(可阅读: 《离开 Facebook 与百万美元后,他的技术故事才刚刚开始 | TGO 深焦》 )。Davies 在清华硕士毕业后即加入豆瓣成为早期员工,并研发了国内最早的开源 KV 存储 Beansdb 和 DPark ( Python clone of Spark );2013 年他加入 Facebook 总部负责 HDFS 方面的研发,2014 年加入 Databricks,帮助 Spark SQL 实现了上百倍的性能提升。2017 年,似乎是顺利成章,在大数据领域摸爬滚打了近十年的 Davies,开始了与几个伙伴的创业之旅。

“创业太艰难了,对一个团队的要求太全面了。你不能犯任何错误,要竭尽全力,然后要借助所有可能借助的力量,还要借助偶然的机遇才可能成功……(我)觉得这个事情是非常难的,还是不要创业。”

话虽如此,但创业似乎对 Davies 有种奇妙的吸引力。

在他长达 13 年的职业生涯中,居然有近 12 年身在创业企业。2016 年,正是在硅谷创业企业 Databricks 任职期间,他萌生了创业的想法。

时值 Davies 负责为 Databricks 的存储层提速,虽然 AWS 已有相关的存储方案,但问题很多,且迟迟无法解决。于是,他提议,自研新的存储方案,系统性地解决问题。

不过,在当时的 Databricks,从架构师到管理层,几乎全部认为风险太大,无人支持 Davies 的提议。Davies 说:“当时, CTO (注:Matei Zaharia,Apache Spark 作者)亲口对我说:‘存储这不是我们擅长的事情,能不碰尽量不要碰。’“

在 Databricks 否决 Davies 的技术方案后,大概 Matei Zaharia 也没有想到,这个中国来的工程师颇有“美式英雄主义”精神。他不但没有放弃,反而用业余时间单枪匹马地写了个原型出来。之后,Davies 回忆道:“我找了一些朋友的公司去试用,发现效果也可以,所以我在想既然有这么不错的东西,就不能埋没它。”

2017 年,Davies 在美国远程敲定了国内的投资和早期客户,叫上当时也在创业的苏锐,共同创立了 Juicedata,并将产品命名为 JuiceFS。

经过了四年的历练,整个团队最终决定将 JuiceFS 正式开源。Davies 表示:在创业之初,我们认为 SaaS 可以为用户提供最佳的体验,同时让我们更快地迭代产品,决定优先把 SaaS 做好。经过 4 年的持续迭代和积累,JuiceFS 已经在几十家科技企业的大数据、AI、容器平台、归档、备份等场景中形成最佳实践, SaaS 使用量也持续快速增长,并且在过去的 2020 年首次实现了盈亏平衡。我们相信找到了可持续发展的模式,有信心保障 JuiceFS 的长期运营。

此外,Davies 等人也发现闭源的基础软件会限制使用者对它的深度理解,不利于服务更多人,依靠 SaaS 产品的收入支撑和开源社区的力量或许可以让 JuiceFS 走得更远。

为什么我们需要新的文件系统?

文件系统是计算机中一个非常重要的组件,为存储设备提供一致的访问和管理方式。在不同的操作系统中,文件系统会有一些差别,但也有一些共性几十年都没怎么变化:

  • 数据是以文件的形式存在,提供 Open、Read、Write、Seek、Close 等API 进行访问;

  • 文件以树形目录进行组织,提供原子的重命名(Rename)操作改变文件或者目录的位置。

文件系统提供的访问和管理方法支撑了绝大部分的计算机应用,Unix 的“万物皆文件”的理念更是凸显了它的重要地位。文件系统的复杂性使得它的可扩展性未能跟得上互联网的高速发展,极大简化了的对象存储及时填补了空缺得以快速发展起来。因为对象存储缺乏树状结构也不支持原子重命名操作,跟文件系统有很大的差别,本文暂不讨论。

绝大多数文件系统都是单机的,在单机操作系统内为一个或者多个存储设备提供访问和管理。随着互联网的高速发展,单机文件系统面临很多的挑战:

  • 共享:无法同时为分布在多个机器中的应用提供访问,于是有了 NFS 协议,可以将单机文件系统通过网络的方式同时提供给多个机器访问。

  • 容量:无法提供足够空间来存储数据,数据只好分散在多个隔离的单机文件系统里。

  • 性能:无法满足某些应用需要非常高的读写性能要求,应用只好做逻辑拆分同时读写多个文件系统。

  • 可靠性:受限于单个机器的可靠性,机器故障可能导致数据丢失。

  • 可用性:受限于单个操作系统的可用性,故障或者重启等运维操作会导致不可用。

  • 随着互联网的高速发展,这些问题变得日益突出,涌现出了一些分布式文件系统来应对这些挑战。

如今,我们耳熟能详的分布式文件系统有 GlusterFS、CephFS、GFS 以及 HDFS 等,每种方案各有优劣(详细对比可阅读 《分布式文件系统架构对比》 一文),JuiceFS 与这些相比的差异性在于更加适合云原生的环境。

具体而言,GFS、HDFS 和 MooseFS 都是针对自建机房这种软硬件环境设计的,将数据的可靠性和节点可用性合在一起用多机多副本的方式解决。但是在公有云或者私有云的虚拟机里,块设备已经是具有三副本可靠性设计的虚拟块设备,如果再通过多机多副本的方式来做,会导致数据的成本居高不下(实际上是 9 个拷贝)。

于是,整个团队针对公有云,改进 HDFS 和 MooseFS 的架构,设计了 JuiceFS,架构如下图所示:

RfAfYn.jpg!mobile

JuiceFS 使用公有云中已有的对象存储来替换 DataNode 和 ChunkServer,实现一个完全弹性的 Serverless 的存储系统。公有云的对象存储已经很好地解决了大规模数据的安全高效存储,JuiceFS 只需要专注元数据的管理,也大大降低了元数据服务的复杂度(GFS 和 MooseFS 的 master 要同时解决元数据的存储和数据块的健康管理)。团队也对元数据部分做了很多改进,从一开始就实现了基于 Raft 的高可用。要真正提供一个高可用高性能的服务,元数据的管理和运维仍然是很有挑战的,元数据是以服务的形式提供给用户。因为 POSIX 文件系统 API 是应用最最广泛的 API,团队基于 FUSE 实现了高度 POSIX 兼容的客户端,用户可以通过一个命令行工具把 JuiceFS 挂载到 Linux 或者 macOS 中,像本地文件系统一样快速访问。

上图中右边虚线部分是负责数据存储和访问的部分,涉及用户的数据隐私,它们是完全在客户自己的账号和网络环境中,不会跟元数据服务接触。Juicedata 没有任何方法接触到客户的内容(元数据除外,请不要把敏感内容放到文件名里)。

feMNV3J.jpg!mobile

上图中蓝色项目主要是给大数据场景使用的,实现的是 POSIX 的子集,而绿色的则是 POSIX 兼容的文件系统。

他们中以 GFS 为代表的元数据和数据分离的系统设计能够有效平衡系统的复杂度,有效解决大规模数据的存储问题(通常也都是大文件),有更好的可扩展性。这个架构下支持元数据的分布式存储的 Colossus 和 WarmStorage 更是具有无限的可扩展能力。

JuiceFS 作为后来者,学习了 MooseFS 实现分布式 POSIX 文件系统的方式,也学习了 Facebook 的 WarmStorage 等元数据和数据彻底分开的思路,希望为公有云或者私有云等场景下提供最好的分布式存储体验。JuiceFS 通过将数据存储到对象存储的方式,有效避免了使用以上分布式文件系统时的双层冗余(块存储的冗余和分布式系统的多机冗余)导致的成本过高问题。JuiceFS 还支持所有的公有云,不用担心某个云服务锁定,还能平滑地在公有云或者区之间迁移数据。

为开源做好准备,架构再升级

借助对象存储的帮助,JuiceFS 已经大大降低了分布式文件系统的复杂度,元数据管理是它最核心的问题。JuiceFS 的 SaaS 使用的元数据引擎,是专为文件系统打造的数据库,整个团队已经积累了丰富的运维经验,仍然如履薄冰。如果开源的话,让社区用户自己运维仍然会是一个大的挑战和负担,一旦运维失误导致数据丢失,后果非常严重。

带着这个问题,团队将元数据服务改造为支持多引擎的插件式架构,可以利用已有的开源数据库实现元数据存储。这样可以更灵活地适应不同场景,根据场景的规模、性能和成本需求,选用不同的元数据实现。这是 JuiceFS 的架构再升级,为未来的发展翻开新的篇章。

至于为什么选用 Redis 作为第一个开源存储引擎,是因为该引擎:

  • 是全内存的,可以满足元数据的低延时和高 IOPS 要求;

  • 支持乐观事务,能够满足文件系统元数据操作的原子性要求;

  • 有丰富的数据结构,易于实现文件系统的诸多 API;

  • 有着非常广泛的社区和成熟的生态,运维 Redis 不会是一个问题;

  • 在各个云上都有托管的服务,在云上使用会更简单;

Y3qqUjN.jpg!mobile

未来,团队还会增加 SQL 数据库、TiKV 等支持事务的 KV 数据库支持。

未来规划

最近几年,数据库领域发生了一件有趣的事情:当 NoSQL 数据库在满足了数据的快速增长后,它在一致性、访问便捷性和管理能力方面的不足逐渐显露,把这些复杂性转嫁到了业务系统和运维上,开始被人诟病。同时, SQL 数据库也有了长足的进展,已经能够满足现在的数据规模需求,经过全面的对比分析后,大家又在回归 SQL 数据库,曾经的 NoSQL 运动也逐渐显出颓势。

估计类似的事情也会发生在非结构数据领域。对象存储在媒体文件等场景取得了巨大的成功,但当人们以为它就是未来的存储形态,开始推广到更大范围时,它牺牲掉的树形目录结构、可修改性、元数据性能、一致性等等,变成了一只只拦路虎,影响它在其他场景的使用效果。

团队坚信文件系统是最好的管理非结构化数据的方式,对象存储只适用于某些简单场景。分布式文件系统一直是基础软件中难啃的骨头,JuiceFS 通过对文件系统中元数据和数据的独立抽象,大大减低了系统复杂度,使得文件系统能够借助这些年来对象存储和分布式数据库的进展,管理超大规模的数据。同时,复杂度的降低可以让更多的开发者参与进来,未来更多的应用也会建立在文件系统接口之上。

团队将通过开源社区的相互协作,一方面为各个应用提供更好的存储支持,也会在底层存储引擎和对象存储上加深协作,一起推动文件存储的快速发展,打造未来数据生态的坚实底座。

消息来源:

https://mp.weixin.qq.com/s/asUFtorMB1pcOwhNvlDyKw


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK