分布式文件系统KFS基础知识介绍

系统 1559 0

Kosmos distributed file system,简称KFS,是一个类GFS的分布式文件系统,被设计用于分布式的结构化存储。下面将对KFS的体系结构进行简单介绍,最后给出一个使用KFS C++ API的示例。

1. KFS体系结构

KFS和GFS的整体结构类似,图中所示为GFS的体系结构图(来自于Sanjay Ghemawat, Howard Gobioff, and Shun-Tak Leung的论文“The Google File System”):

分布式文件系统KFS基础知识介绍

 

KFS系统由三部分组成,分别是metaserver(相当于GFS master)、chunkserver(相当于GFS chunkserver)和client library(相当于GFS client):

  • metaserver:元数据服务器,使用B+树存储分布式文件系统的全局文件系统命名空间,一个KFS中仅有一个metaserver;
  • chunkserver: 一个大文件被切分成许多固定大小的文件块block,文件块block被以chunk的方式存储在独立的chunkserver上,每个 chunkserver上可能存不同文件的block,一个block会被存在不同的chunkserver上(默认为3份);在一个KFS中,有一系列 的chunkserver,chunkserver将chunk存储在底层的文件系统(如Linux的XFS、EXT2);
  • client library:提供文件系统访问的API,使应用可以通过接口操纵KFS;在将实际的应用和KFS集成起来时,需要在应用中包含KFS的客户端库文件。

下面以KFS client端对某一文件的访问为例,说明KFS的工作流程。假设该文件名为/kfs/testdata,分为以下几步完成:

  • client端以该路径名/kfs/testdata为参数,向metaserver发出请求;
  • metaserver将该文件对应的文件属性信息返回到client端;
  • client端将文件名和对应的文件偏移(file name, chunk index)为关键字发送给metaserver;
  • metaserver对所管理的各chunkserver进行分析,将拥有该偏移块的(chunk handle, chunk locations)返回给client端;
  • client端以(chunk handle, byte range)为关键字,向相应的chunkserver发送数据读写请求;
  • chunkserver返回对应数据区段的chunk data给client端;
  • client端得到chunk data。

2. KFS API调用

KFS 支持的客户端包括有C++、Java和Python,以C++为例,KFS客户端API调用的一般过程如下:首先,调用 getKfsClientFactory()->SetDefaultClient(serverHost, port)方法,获取一个KfsClient类型的指针;然后,通过这个KfsClient类型的指针,调用所需的文件系统的函数(如创建目录、删除目 录、创建文件、删除文件、获取文件信息等)。

下面给出一个示例,通过调用KFS的C++ API,得到文件的stat信息(该代码不能直接运行):

      
         1
      
      
        using
      
      
        namespace
      
      
         KFS;
        
2 using namespace KFS::tools;
3 KfsFileStat statInfo;
4 KfsClientPtr kfsClient = getKfsClientFactory() -> SetDefaultClient(serverHost, port);
5 if ( ! kfsClient) {
6 cout << " failed to initialize kfs client! " << endl;
7 exit( 0 );
8 }
9 if (verboseLogging) {
10 KFS::MsgLogger::SetLevel(log4cpp::Priority::DEBUG);
11 } else {
12 KFS::MsgLogger::SetLevel(log4cpp::Priority::WARN);
13 }
14 if (kfsClient -> Stat(kfsPath, statInfo) < 0 ) {
15 cout << " KFS path: " << kfsPath << " is non-existent! " << endl;
16 exit( - 1 );
17 }

有关其他文件系统访问接口的调用方法与上述示例类似,具体可参考kfs目录下examples子目录中的C++ example代码以及Java example代码。

分布式文件系统KFS基础知识介绍


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论