CalvinFS笔记

现有分布式文件系统不足

  • 当整个数据中心失效时,无法提供跨越远距离的连续的文件操作;
  • 使用的文件元数据管理方式不具有可扩展性。假定单个文件尺寸非常大大,
    而文件个数和目录个数相对较小。降低了文件内容同步的开销;

分布式文件系统管理文件元数据方式

  • 独立的文件元数据管理机制:GFS,HDFS, Lustre,Gluster,Ursa Minor,Farsite,XtreemFS
  • 共享虚拟磁盘

Calvin

Calvin是一个分布式数据库系统,CalvinFS基于它实现文件的元数据管理。

  • Log层
Created with Raphaël 2.1.0ClientClientFront_End_ServerFront_End_ServerDistributed_Block_StoreDistributed_Block_StoreMeta_Log_ServerMeta_Log_Serverlog requestsbatched requestssufficiently replicatedbatch’s unique block idsuccesssuccess
  • Storage层
    Sorage层管理存储节点,提供两个基本功能:(1)文件数据读写接口;(2)决定文件读写请求映射到哪个节点

  • 调度器

每个存储节点拥有自己的调度器,调度器在事务(transaction)开始执行前检查事务包含的读写操作集,决定何时开始事务执行。一旦事务开始执行,不会再对事务进行进一步的检查。Calvin的事务执行采取一种类强两阶段封锁协议的协议。事务在执行前须原子的获得整个事务周期中需要的锁,锁的获取将按照事务在log中出现的顺序申请。

CalvinFS 架构

主要设计理念:

  • 常驻内存的文件元数据;
  • 可串行化和快照读写;
  • 可能存在的大量小文件;
  • 可扩展读写读吞量;
  • 容纳低速写;
  • Hash分割的元数据;
  • 单个文件操作的优化;
    Calvin 将文件内容存放在分布式非事务性存储快,用扩展的Calvin存放文件元数据。文件内容与文件元数据均分布在跨数据中心的存储块上。

CalvinFS 块存储

key words:

  • metadata entry format

非固定尺寸的内容不可变块

CalvinFS将文件内容存放在0个或多个块中,每个块的大小不固定。
每个块内容不可改变,向文件添加的内容,将会被写入新的块,并追加到文件末尾。
这种追加将在文件元数据中体现。
每个块都有一个唯一的ID

块存储于块分配

  • 每个块拥有一个ID,通过ID的hash值将块分配到bucket,每个bucket会被复制到特定数量的跨数据中心的块服务器。
  • bucket和块服务器间的映射关系保存在全局的Paxos副本中,该副本只有在硬件损坏,负载均衡,集群加入新机器时才会变化。
    每个节点缓存全局映射关系,每台机器可以通GUID的hash值查询特定bucket所在的副本服务器。缓存失效导致查找失败会引起缓存的更新和重试查询。
  • 一个副本服务器的失效会导致该服务器上数据的迁移。
  • 一个后台进程定时检查文件,压缩包含很多小尺寸块的文件。如果原始文件内容没有改变,压缩过的文件写入块服务器后,更新全局映射关系。当在压缩过程中文件
    的内容有改变时,写入块服务器的文件将被丢弃,并重启压缩过程。

CalvinFS 文件元数据管理

CalvinFS文件元数据内容以key-value的形式存储,key位该文件的绝对路径,value包含如下内容:

  • Entry Type:指明该元数据对应的是文件还是目录;
  • Permissions:文件本身的权限标识,以及从根节点到该文件路径上的目录的权限标识;
  • Contents:目录包含子目录于文件;文件包含文件内字节偏移于块ID之间的映射;

对文件元数据权限的更改可能

元数据存储层

CalvinFS的元数据存储层是Calvin的一个实例,提供如下文件系统接口:

  • Read(path);
  • Create{File,Dir}(path);
  • Resize(path, size);
  • Write(path, file offset, source, source offset, num_bytes);
  • Delete(path);
  • Edit permissions(path, permissions);

CalvinFS的文件系统接口提供与POSIX类似的操作方式,这些接口同时需要检查调用者的权限和ID。有些操作涉及到多个元数据的级联操作。

目录的递归操作

利用Calvin内置的OLLP分析元数据操作请求:
- Analyze模式:分析操作请求涉及到的所有的读写请求,收集涉及到的元数据项;
- Run模式:上一步确定的读写请求集合被作为注释添加到一个事务中,重检查读写集合,如果在Analyze和Run之间这个请求集合发生变化,PLLP放弃这个事务,并重启它。

Update周期

实例:创建一个新文件,向其中写入一个字符串

echo “import antigravity” >/home/calvin/fly.py

上述文件系统操作由三个单独的操作组成:

  • 创建文件/home/calvin/fly.py;
  • 将文件大小设置为18B;
  • 向文件元数据写入偏移;

写文件数据

Created with Raphaël 2.1.0ClientClientFront_EndFront_EndBlock_Store_ServersBlock_Store_ServersLog_Front_EndLog_Front_EndMeta_Data_ShardMeta_Data_Shardrequestrequest block IDglobal unique block IDhash ID to find bucketlocate backet->block serverblock creation requestquorum say yesbatched operation requestappend to current batch of logperoidly write to block store servermajority ACKwrite batch ID to paxos-replicated metalogforward each transaction requestsort transactionssuccesssuccess

Created with Raphaël 2.1.0PPQQpermission check, abort if not okpermission check, abort if not okresult okCreate file metadata entryResize file metadata entryUpdate file metadata entry’s contentsresult okUpdate parent directory metadata

示例操作包含两部分:对/home/calvin目录文件元数据的操作和对/home/calvin/fly.py文件元数据的操作。
假设对/home/calvin目录元数据的操作在P0完成,对/home/calvin/fly.py元数据的操作在Q0完成。

P0
Q0
检查父目录权限检查文件权限,如果失败终止任务
父目录权限检查成功,向Q0发送消息等待父目录权限检查结果
Q0返回成功,更新父目录元数据内容P0返回成功,执行如下操作:创建文件元数据,调整文件元数据尺寸,更新文件元数据内容

同一事务的操作各个数据中心按照如上方式重复进行,保证元数据的一致性。


Created with Raphaël 2.1.0Startperform local readsserve remote remote readscollect remote resultsexecute to completeEnd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值