现有分布式文件系统不足
- 当整个数据中心失效时,无法提供跨越远距离的连续的文件操作;
- 使用的文件元数据管理方式不具有可扩展性。假定单个文件尺寸非常大大,
而文件个数和目录个数相对较小。降低了文件内容同步的开销;
分布式文件系统管理文件元数据方式
- 独立的文件元数据管理机制:GFS,HDFS, Lustre,Gluster,Ursa Minor,Farsite,XtreemFS
- 共享虚拟磁盘
Calvin
Calvin是一个分布式数据库系统,CalvinFS基于它实现文件的元数据管理。
- Log层
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;
- 向文件元数据写入偏移;
写文件数据
示例操作包含两部分:对/home/calvin目录文件元数据的操作和对/home/calvin/fly.py文件元数据的操作。
假设对/home/calvin目录元数据的操作在P0完成,对/home/calvin/fly.py元数据的操作在Q0完成。
P0
|
Q0
|
---|---|
检查父目录权限 | 检查文件权限,如果失败终止任务 |
父目录权限检查成功,向Q0发送消息 | 等待父目录权限检查结果 |
Q0返回成功,更新父目录元数据内容 | P0返回成功,执行如下操作:创建文件元数据,调整文件元数据尺寸,更新文件元数据内容 |
同一事务的操作各个数据中心按照如上方式重复进行,保证元数据的一致性。