非常感谢大家来到这次珠宝FS的一个分享这次的presentation是由我和我的同事圣勇然后来给大家做分享我们主要介绍一下珠宝FS对珠宝FS做一个比较全面的一个介绍吧 不光有Introduction然后还有一些比较深入到架构层面的一个介绍然后首先做一下自我介绍我是刘硕然来自于贝壳找房然后我目前是珠宝FS的Maintainer我曾经就职于华为 京东以及OPPO都是做存储以及分布式人间系统相关的一些工作然后我的同事圣勇也是来自贝壳然后目前是珠宝FS的核心成员以及贡献者之前也是曾经就职于华为做存储相关的一些工作然后今天介绍的主要内容主要分这么几个方面首先是简单的回顾一下珠宝FS这个项目就是对于对珠宝FS还不是很熟悉的同学我们会介绍一下珠宝FS这个项目具体是什么然后在生产中能够解决什么样的问题以及回顾一下这个珠宝FS的发展历程然后我们会介绍一下在这个生产使用过程中一些有意思的一些小技巧然后是不管是对于还未使用珠宝FS的同学还是对于已经在使用珠宝FS同学可能都会有一些启发这样子然后我们会深入到这个设计以及是底层架构这块然后对珠宝FS做一个介绍然后以及当初在设计的过程当中做了哪些Trade-off以及为什么做这些Design Decision的一个决策我们会在这一部分来做一个介绍然后我们会从生产中介绍一些case study然后给其他的同学一些参考就说珠宝FS其实是一个比较成熟的然后目前在这个生产环境已经用的比较广泛的一个分模式的一个存储系统然后我们会介绍一下这个目前正在做的一个feature主要是说这个feature当然还没有release但是说如果release的话其实是能够非常大的拓展珠宝FS的试用场景然后最后是介绍一下如果想对于那些对于珠宝FS有兴趣的同学不管是试用还是开发可以怎么样联系我们大家可以共同的做一些探讨首先第一部分就是我们先回顾一下珠宝FS这里有一个珠宝FS的一个简介这个简介我这里列出了一些关键词首先它是一个distributed file system and object store就是说它是一个分模式的文件系统和对象存储为什么说是这盒呢是因为珠宝FS是实现了底层一份数据然后我上面可以通过两种这个接口形式来进行访问也就是说你通过文件系统接口写入的数据也可以通过这个对象存储接口S3接口然后去访问然后通过S3接口写入的数据然后是可以通过这个文件系统接口来进行访问的然后这样的话就给了业务方很大的一个选择空间可以根据自己不同的业务特点然后选择适合的一个接口去做访问然后第二个关键词就是large scale这个是什么意思就是珠宝FS的一个定位就是因为它当初从设计开始的一个定位就是为了大规模的容器集选服务的也就是说所有的这种就是说跑在大规模容器集选里面的应用它需要有存储的一个解决方案然后珠宝FS其实是被他们来做服务的然后因为有large scale的定位所以说后面的很多设计的一个决策都是围绕大规模来做的比如说我会需要scalability然后包括多组户其实也是因为珠宝FS比较适合的场景就是说底层是一个大的一个集群然后上面通过多组户的方式然后给不同的业务方来进行使用就是说后面的话我的同事圣勇会对这方面就是很多设计的决策是怎么做出来的做一个介绍然后一个关键词就是general purpose storage就是说珠宝FS它其实因为它是为大规模容器集平台服务的然后这里面的应用肯定是就是五花八门它的需求也是五花八门的不光需要不光有大文件的顺序读书译写随机读随机写然后还有很多小文件的场景所以说珠宝FS其实是作为一个通用的存储来设计的不是为了单独某一个不是为了单独某一个某一种场景来设计的然后但是这就牵扯到下面一个特点就是optimized for small fails就是我们知道对于分布式存储来说大文件的顺序读写其实是一个相当于基本分数就说这一块大家做的其实都是不错的然后但是小文件的处理其实是一个难点然后初步FS在这方面做了很多的一个工作以及优化然后使得初步FS能够支撑海量小文件的一个场景但其实初步FS并不是为了小文件而设计的就它本质上是一个general purpose storage然后最后一个关键词我这边列的是就是叫withstand traffic peak就是要应对流量洪峰因为初byfs其实它是脱胎于京东商城的就说天然就带了这么一个属性要能够应对突发的一个大的流量就是比如说在每年两次的大速的时候你要能够应对突发的流量洪峰然后怎么做到这个其实这也跟之前的large scale是有关系的就是说这背后的逻辑其实都是一脉相承的什么意思呢就是说就举个例子比如说你现在有一桶水然后你即时比如说往里倒一碗水都可能会引起比较大的一个波动但是当你现在有一个池塘的水你即时往里去倒一桶水可能也掀不起什么波澜然后这就是那个其实就是初byfs的一个设计哲学就是也算就是要做到这一点是必须首先要large scale一定要有另外一个就是要做到这个scalability就是说集权整体的性能的上限是要能够随着节点数的增加而做而限性增长的只有能够达到这两点的话才能够做到比如说我刚才说的你有一个池塘的水然后你倒进去一桶水都显不出来什么波澜就是一个比喻这样然后我们来回顾一下就是初byfs的一个发展的这个历程就这个项目其实从2017年年初就开始启动了然后一直到这个2018年的6月份才第一次在京东生产网均上去应用所以其实大家可以看到其实还是做了很长的一个时间然后就是做了一个比较精细的一个设计也好然后规划也好包括实现上面都是做的比较细致的然后在这个2019年的3月份然后我们把这个初byfs开源到了github上面然后在4月份的时候就release了这个1.0的一个版本然后这个版本主要还是集中在这个分布纸文件系统对一块然后支持顺序读顺域写大文件的这个大小文件都是处理的比较好的就这个1.0的一个版本然后在6月份的时候是我们是给CNCF的Storage SIG做了一个技术的一个presentation就是我们希望是能够把这个初byfs捐赠给CNCF作为一个Sandbox的项目然后所以在这个6月份的时候是做了一个技术的这个分享然后并且在6月份的时候我们也有了第一个这个外部的用户然后在这个2019年7月份的时候就基于初byfs写的一篇paper就是发表在这个sigmod上面就说虽然它是industrial paper但是呢实际上通过这个评审的这个反馈来看还是需要有这个非常明确的一个创新点才能够发表这篇paper然后初byfs的设计刚才我也提到了就是说是跟其他的这个分布式存储至少是开源的分布式存储里面都是不一样的然后非常有特点然后也正是由于这些创新才给到了这个初byfs很多的一个能力然后能够适应非常广泛的一个应用场景所以这篇paper如果大家有兴趣的话其实是可以去读一下的虽然是已经19年发表了但是大的这个架构层面的东西都没有变然后因为我们这个本身也是为了大规模这个容器平台来设计然后本身跟CNCF的这个生态的这个关系然后我们再就开始做一些clownity有生态相关的一些东西就是在8月份的时候我们就released这个CSI的这个driver然后在这个11月份的时候我们又released这个初byfs HALM第一版的版本然后在12月份的时候我们就加入了这个CNCF然后作为一个Sandbox的项目然后在这个2020年4月份的时候发布了一个比较大的重要的一个大版本就是2.0这个版本在这个版本里面我们就是支持了Sandbox这个接口然后真正的把这个初byfs从一个分布式文件系统就是然后变成了一个分布式的文件系统和对象存储这样的一个概念然后目前最近的一个stable的版本是5月份released的是这个v2.4.0然后目前还有一个相对比较稳定的版本就是这个v2.4.1然后以及可能年底会要发布的这个v2.5的一个版本然后并且目前这个我们也在积极的推动这个初byfs进入这个复发阶段然后也在做这个也是已经到了这个滴滴review的一个尾声阶段了吧因为目前其实初byfs不管是从这个开发的这个开发者还是从这个外部用户的这个使用数量上其实都是已经有非常大的一个提升了然后这边呢主要就是介绍一下就是初byfs跟云元生这个生态里面做的相关的一些东西举个例子比如说这个像这个监控这一块就非常典型的云元生的一个架构每个阶点它都会去注册自己然后会去export一个exporter的这个这个这个接口然后会去使用这个普罗密修饰就定期的拉取这个一些metrics然后展示的话就是通过这个Graphana来进行一个展示就是一个比较典型的一个云元生的用普罗密修饰的一个架构吧算是然后另外就是像我们的这个Helma然后CSI这些呃这些代码其实都是可以在github上面找到的然后另外包括Graphana和普罗密修饰的一些配置其实也都是在github上都可以找到然后大家可以使用这个这个这个这个配置然后也可以根据需要自己去做一些定制的修改都是可以的然后下面我们就简单介绍一下就是呃出保Fs的一些有意思的一些小技巧吧不就是如果对于那个还没有接触出保Fs大家可能会问呃这出保Fs到底是个什么样子呢到底是怎么使用的呢然后对于呃大家如我只是想简单的去呃了解一下或者去做个demo的话我们是提供了这个单基板的这个Docker Compose的一个部署的方案就可以看到就是我们可以通过这个Docker目录下面的这个Rendocker.sh然后直接去呃启动一个容器启动一个集权就最小部署的一个集权用Docker Compose的方式来启动然后我们可以看到会去编译这个Solar Client然后以及这个Cli工具还有这个Lib SDK然后我们可以启动三个Master节点然后四个Metano的节点以及四个Datano的节点这都是呃相当最小化的部署吧并且我们也会启动这个ConsorGraphanaPromiscous这些节点启动完这个集权的部署以后我们会启动一个挂载了出保Fs Client的一个容器这个容器里面就是呃已经挂载了出保Fs的Fuse Client然后挂载完以后是什么样子呢就是大家可以看到通过这个Linux的DFM是能够看到这个出保Fs的挂载点的这是什么意思呢就是说你完全可以像操作就是本地目录一样去对这个出保Fs进行一个读写的或者说其他的呃就是其他一些操作包括Change Mode呀然后包括其他的一些嗯就文件系统相关的一些操作都是可以呃通过对这个挂载点的一个操作来进行的然后我们刚才说出保Fs它是一个分布式文件系统和对象存储然后这里面就有一个呃跟对象存储这个语异的一个转化的一个呃一个话题吧嗯然后出保Fs这边的这个Cluster Name其实可以对应到这个对象存储里面这个Region然后这边的这个Volume就可以对应到这个嗯对象存储里面的Bucket然后这边的一个目录加文件其实就是对应到这个某一个对象然后我们可以看到呃右边这张图比如说我现在跟目录下面有A这个目录然后B点Text那么你通过这个呃然后这个Volume呢是新建好的一个Volume叫Example那么如果通过S3结构访问的话那就是相当于是访问Example这个Bucket然后这个A呃slashB.txt这个Object这是一个呃语异上面的一个Matchup然后呃什么意思呢就是说本质上出保Fs底层还是一个呃文件系统然后直播上面会暴露出这个S3的一个结构这样做的呃有好处也有烈是吧好处就是说它的原数据操作的这个Overhead非常的小呃因为我们知道这个对象存储的一个比如说做一个Move其实开销还是蛮大呢但是对于文件系统来说这个Move的开销就非常小了就只是动一下原数据就ok所以说呃优势就是这个原数据的这个开销非常小然后劣势呢就是说跟原生的这个S3的语异肯定会有一些出入举个例子就是说还是上面那个例子就是呃比如说你有AslashB.txt这个Object以后那么在对象存储那边其实它就是存了一个key再加一个Object但是在出保这边呢其实它会有呃分分层了也就是说它会有A这个目录然后并且有B.txt这么一个文件这样的话呢如果你再想创建A这么一个对象的话那是不能了因为这个这个这个路径在我这边已经是一个呃文件夹了就这是跟那个原生的S3语异上的一些区别嘛啊这边是一个就比如说呃我们刚才看到通过文件系统接口我们已经写入这个LTPTest这个volume的一个呃几个文件了然后我们通过S3是如何访问的比如说我们先我们是使用的这个S3Common的这个就要么训练我们的这个工具当然用其他的但凡是呃可以访问S3接口的工具其实都是可以的然后比如说我们先把这个S3的这个config先配置好然后我们就可以用这个S3Common来去操作这个这个bucket比如说我们先Fs一下这个bucket我们可以看到那就把这些下面的这个对象就会列出来然后我们也可以做get这个操作呃还有一个比较有意思的小续修就是像我们在支撑这个呃机器学习的时候呃经常会遇到同一个文件夹下面有非常多的就是海量的文件比如说可能会超过1500万的文件然后这样一个量级的一个文件如果在同一个目录下面对于任何一个文件系统其实都是呃非常有挑战的就说非常有挑战的一个事情然后你基本上如果一个目录下面有这么多的文件你做LS基本上是不太可能把它全列出来了所以右方之前在碰到这种情况的时候都是会自己先寄一份列表就自己再把这个远处去寄一遍然后再把这些文件存到这个文件系统里面但是呢呃出版其实是可以提供一个比较有意思的一个接口吧就我可以直接从metano的上面去拉取这个这个副目录下面所有的这个目录像这么这么一个接口然后通过这个接口呢我们其实就可以就通过这个接口我们就可以把这个副目录下面所有的这个目录像就都一次性的导出来这个过程非常快呃1500万的文件可能也就十几二十秒时间就能全部的导出来然后呃就右方其实是呃就不需要自己再寄一份这个远处去这样子了这一个比较有意思的小技巧吧然后另外一个就是呃出版fs这边还支持一个紫目录的一个罐目录的一个挂载就是说除了通过这个volume来做这个全线的管控我们还提供这个involume的这个全线的管控就是一个隔离比如说还是像刚才那样就是我rtp这个volume下面我会有几个紫目录然后可能呃同一个业务方下面我有不同的小组然后呃完全可以去使用不同的目录然后他们之间互相呃是可以完全做到完全就是看不到的就比如说我这个volume下面有个d20这么一个目录然后我挂载的时候只要加一个这个subd20的这个配置选项我就可以把这个呃对方的挂载直接挂载到这个d20下面然后他看到的这个目录就直接是d20下面的这个内容就是d20之上的这些东西但是完全看不到的然后另外呢就是呃因为挂载的出版fs的这个fuse的客户端的之后呢其实是可以呃跟操作本地目录是一样的这样一个操作方式所以呢就会出点声出很多很有意思的一个访问方式吧呃比如说我们可以呃在机器上面先挂载这个出版fs的fuse client然后起一个nfs server把他export的出去然后其他的这个如果又遇到有这种网络隔离的这种呃用户的他就可以通过nfs的一个写意去呃去进行访问然后另外呢我们也可以比如说在他之上起一个ftp server这样的话就可以要不然就可以通过ftp的方式去访问然后另外我们可以可以比如说起一个mail的console就是用这nfs的这个mail的然后我们就可以通过网页的方式进行访问就是也是其他的丰富了这个用户的一个访问吧出版fs在设计上做到了控制面和数据面分离resource manager主要是负责对整个系统元数据的管理和控制而文件的元数据和数据则分布在metanode和data node上metanode会存储文件本身的元数据比如像inode或者灯锤这样一些文件相关的信息一个metanode是由多个metapartition组成而每一个metapartition上面又会记录着很多文件元数据信息在运行时这些文件元数据信息都是直接缓存在内存中的data node则是存储文件数据它也是由多个data partition组成而每一个data partition中间也会包含着非常多的文件分片控制面和数据面分离是有一些好处的它可以让我们添加新的meta或者是data node的时候变得更加的方便而resource manager也不会成为文件操作的瓶颈volume在出版FS中是作为一个逻辑的概念存在的它会把很多的metapartition和data partition聚合在一起为数据之间提供一定的隔离object node和client也是在volume的基础上分别为应用提供了对象存储和文件系统的访问方式client也可以按照应用的需求付出在不同的环境中为了能够提供一个统一的数据访问接口出版FS也提供SDK负责与出版FS服务端进行RPC重新fuse s3以及动天连接库都是在SDK的基础上进行的扩展SDK也可以方便不同形态的文件访问方式都可以很方便地提升到出版FS中来考虑到节点的可扩展性问题出版FS没有依赖于目录数的结构来对文件元素率进行登区出版FS在创建文件的时候会把文件的创建的动作分成两个RPC来共同完成也就是会分别单独的创建inode以及创建登区文件的inode是以inode号为所以分散到不同的metano的中而文件的登区则是以登区的信息为所以这样我们的灯锤和iNote就没有必要记录到同一个metanode上在这个技术上扩展metanode就会变得更加的容易为了减少文件分辨的数量触保FS将大文件和小文件区别对待大文件会占用独立的分辨也就是这里我们看到的extent file而小文件则会被聚合到单独的extent中当这些小文件变更或者是删除的时候处理extent就会变得相对来说复杂一点如果我们是采用传统的GC的方式来处理这些extent那么搬于数据就必然会影响文件访问的性能同时也会增加元数据的管理的复杂程度而触保FS没有采用GC的方式而是依赖于底层本地文件系统的punch hold的能力来对这些extent占用的空间进行释放相对来说这就比extent会更加的有一些优势触保FS所针对的场景是温和热数据访问居多的场景所以在性能和内存开销的权衡中触保FS就更倾向于用空间来换取时间所以在触保FS的metanode运行室会把文件的元数据都权量的换存到内存里面这样的话我们在访问文件数据的时候就可以避免不必要的存储戒指的IO开销而在实际的部署中也会通常将metanode和datanode进行混布这样的话就可以提升单个辅助器中内存存储戒指的利用率面对像云这样的一些使用场景通常顺序写会比覆盖写更为常见所以在触保FS中对于顺序写触保FS是选择了异地更新extent并且配合主从备份的这样一种方式来提升写的性能而对于覆盖写则是采用了原地更新extent然后加上raft同步的方式来减少文件元数据的碎片化程度虽然raft同步的开销会更大一些但是在这种顺序写多于覆盖写的前提下那么触保FS在设计的时候也是做了一些取舍就是舍弃了覆盖写覆盖写时候的一些性能选择元数据的可文固性在文件数据的可用性和移置性方面因为datanode也是采用了raft协议来同步覆盖写的这部分数据因此不同的datanode之间在某个时刻可能会出现数据不一致的情况所以当我们在使用触保FS访问数据的时候如果我们对数据有强理之性的要求就必须从datanode的leader的地方来访问数据如果我们对数据的使用是允许存在stale data这样的一些场景那么用户也可以去配置follower read这样的方式允许从datanode的follower出来访问数据这样可以提升数据访问的一些速度接下来我们会选择一些已经用在生产上的一些case study然后来给大家做一个参考就是能够用触保FS来解决什么问题首先作为一个general purpose storage那其实理论上只要是用到存储的一些场景其实都是可以使用触保FS的就比如说像一些点击流业务然后广告搜索推荐然后计学习平台ES然后harbored的经线仓库然后还有数据库的备份类似短视频这种其实都是可以用触保FS来作为同用的一个后段存储的然后我这边终点想这一回介绍的一个案例是来自于网易然后也非常感谢网易的同学提供的case study以及生产上面的最佳实践就说他们是会把触保FS作为elastic search的一个后段存储然后直接去使用就是说这样的首先他们是做了一个冷热ES节点的一个分离然后热的ES节点是使用本地的SSD四盘然后因为有很大的Io写入压力所以会使用SSD四盘然后另外就是他们的冷的ES节点就会用触保FS直接作为后段存储然后触保FS集权部署的时候使用了HD的四盘这样做有个好处就是说可以做到冷节点的ES节点的存储与计算分离因为我们知道冷的ES的实力其实并不需要占用太多的计算资源所以他们在设计一个架构的时候就会把冷的ES实力直接部署在触保FS的data node上面就是说给data node首先要预留出先行的资源然后会把ES的实力部署在data node上面然后另外就是剩下如果还有需要部署ES冷节点实力的话他们会部署在这种dopier服务器上面然后充分利用一下CPU和内存然后存储就完全由触保FS来统一进行管理然后冷节点使用触保FS的还有一个好处就是说有非常好的故障迁移的能力有时候实力挂掉了然后直接在一个节点启动实力就OK了不需要做数据的迁移然后他们在配置的时候也是做了很多的尝试然后最初总结出一个最佳实践就比如说如果当后端是使用触保FS的时候上面是可以就是减少replicateSARS的负本数的并且可以通过一些配置然后降低SARS Rebalance的概率然后因为下面其实已经是指示触保FS然后上面就可以降低一下或者说不需要做SARS Rebalance然后除此之外他们还做了很多一些其他的事情比如说他们会通过设置Lifecycle Management然后来增加ES迁移的频率这样的话可以避免集中迁移的时候造成突发的IO的流量然后另外就是除了对CPU内存IO做监控他们还会定期去跑ES的Bunchmark然后通过Bunchmark的结果来预测或者说来识别出来触保FS是否需要扩容因为之前也讲过触保FS是有随着节点数然后它这个能力是有一个线性增长的能力的所以说当性能达到平静的时候其实是可以通过增加触保FS的节点数然后来扩展能力的上限然后另外就是积极学习平台的这样的一个最佳实践我们这边选的是ESR这个业务就是语音识别因为语音识别这边比较多的是小文件的一个并发操作然后触保FS的小文件的处理能力其实是非常好的就说只要你上层的应用能够把并发做起来然后下面的触保FS其实是能够提供非常高的一个能力的上限的然后我们通过这个测试其实可以看到就是说用NFS加SSD的这样的一个性能其实是然后业务方原来是使用NFS加SSD然后来换成了触保FS加HDD的这样一个方案然后性能是提升了有非常大的提升然后当我们比如说把触保FS也换成SSD的时候虽然说性能是有一部分提升但是提升不大这什么意思呢就是说其实这个时候触保FS通过架构的一个设计就是把评计已经从四盘这边已经转移到了网卡这边就只要当你这个网卡达到了平静以后词盘这边就说网卡是先达到平静的然后才是四盘所以这样的话就完全可以使用这个HDD的四盘然后来替代这个SSD并且会有性能上的非常大的一个提升这样做到一个成本和性能上面的一个平衡选择触保FS在不同场景中的应用我们也希望触保FS能成为更多场景的一些选择目前触保FS已经提供了Fuse Client来满足应用的文件防律需求但是我们仍希望触保FS有能力在应用无需适配的情况下满足一些更低实验的需求所以我们为触保FS增加了绕过Fuse或者是绕过Colonel的能力在Linx中Linx的动态链接器提供了Preload的机制它允许我们在执行F文件之前来指定自定义的一些动态链接库这些Preload的库会优限于其他库进行加载我们如果在Preload的库中重新实现了Posix的接口函数那么在运行时就会覆盖标准库中的函数如果我们实现了文件操作的这些接口那么在运行时就可以绕过Fuse和系统调用来去直接和触保FS进行数据的访问为了实现文件操作我们就需要在Preload的库中提供对文件描述符表的一个管理文件描述符表是需要去记录虚定文件描述符和真实文件描述符的应受关系虚拟文件描述符主要是用在应用和Preload的库的交互中而真实文件描述符主要是用在Preload的库和真实文件系统的交互中同时我们在这个文件描述符表里面也是需要去标识每一个文件描述符它是否是属于触保FS在Preload库的初识化阶段我们就需要去准备好这个文件描述符表并且因为应用它会有一些已经打开的文件所以我们也需要对这些已经打开的文件去做一个一一的印设在文件操作的时候我们会将文件的路径和触保FS的挂载点路径进行一个比较从而来判断这个文件是否是属于触保FS根据这个判断我们就可以调用相应的接口来获得这个文件的真实的文件描述符并且在我们提供的文件描述符表里面进行一个印设从而得到一个虚拟文件描述符并且把虚拟的文件描述符返回给应用在这之后应用就可以直接用虚拟的文件描述符来调用我们Preload的库中实现的这些文件描述符来去选择合适的描述进行文件操作接下来就是如何联系我们其实是有几种方式首先肯定是github上面提一秀然后我们会定期去处理这个一秀然后如果大家有好的建议或者有任何疑问都可以通过在github上面提一秀的方式来去联系我们然后另外更直接的一个方式就是sincef官方的slack space然后里面有出发FS专属的channel然后也可以大家通过加入到这个channel里面然后跟我们有一个更直接的一个交流然后另外就是在中国的一个小伙伴其实可以加入到我们有一个出发FS的微信群然后也可以加入到这个微信群里面跟我们做一个交流然后最后非常感谢大家的这个聆听感谢大家