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

1. KFS体系结构

KFS系统由三部分组成,分别是metaserver、chunkserver和client library:

  • 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代码。

作者: 大圆那些事 发表于 2011-08-22 23:52 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"