分布式文件系统KFS基础知识介绍
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系统由三部分组成,分别是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 usingnamespace KFS;
2 usingnamespace 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代码。