GlusterFS:统一命名空间(Unify)源码分析

来源:互联网 发布:nginx mysql php 编辑:程序博客网 时间:2024/05/22 02:53

1.概述

This xlator is one of the main translator in GlusterFS, which

actually does the clustering work of the file system. One need to

 understand that, unify assumes file to be existing in only one of

 the child node, and directories to be present on all the nodes.

     Now, unify has support for global namespace, which is used to keep a global view of fs's namespace tree. The stat for directories are taken

 just from the namespace, where as for files, just 'ia_ino' is taken from

 Namespace node, and other stat info is taken from the actual storage node.

 Also Namespace node helps to keep consistant inode for files across

 glusterfs (re-)mounts.

 

 

上面是切取自gluster的官方描述,已经说明了unify的作用,和实际表现形式。Unify实际上就是在一个节点维护全局的命名空间,在命名空间节点上,保存了整个环境的文件和文件夹,当然只是名字,实际上文件的内容是存储在实际存储节点上面的。当查询有哪些文件存在,文件的属性时从命名空间可以得到;要获得文件内容就从实际存储节点获得。创建文件文件夹,会先在namespace上创建,然后由在后台由namespace发出在存储节点相应路径下创建文件文件夹。当我们要查看文件,文件夹时,只会查询namespace相应目录。

Unify视图示意图

创建文件流程示意图

上图说明:比如我们要创建文件1.txt步骤为:

1)先在namespace上创建文件1.txt;

2)通过调度算法如rr在brick1上创建1.txt;

读写文件示意图

上图说明:

直接通过文件相关信息写到brick1上;

直接通过文件相关信息读取brick1上的文件;

该卷的在卷配置文件中大致配置如下:

 

2.功能验证

应用情景研究

1.将unify类型的卷配制成relipca,并没有报错

2.报错,cluster/unify类型不存在,确认在glusterd-volgen.c文件中没有该类型

type 'cluster/unify' is not valid or      not found on this machine

glusterfs 2.0版本是有该类型的卷为什么现在没有,unify目前又是如何起作用的呢???

3.源码分析

该部分,我们主要会分析unify的初始化函数,文件的创建(文件夹的创建与文件类似),文件的读写,文件文件夹的查询。

3.1.函数init分析

 Unify的init函数,除了对自身的一些参数合法性检查,还包括对参数的一些初始化,包括对调度算法的初始化;在unify中,调度算法主要决定在文件应该存储在哪个存储节点上,在调度算法源码分析部分,会对调度算法有详细的分析。

初始化函数流程图

 

3.2.函数unify_create分析

  首先在全局命名空间创建文件,然后通过后台在存储节点上创建文件。该函数主要分为一下几个步骤:

初始化对象local相关的参数,并且将该参数赋值给frame参数;

通过检查local->loc1.path该路径是否为空,如果为空,则直接返回;

在namespace上创建文件,代码如下:

 

   STACK_WIND (frame,

                    unify_ns_create_cbk,

                    NS(this), //在命名空间上创建文件

                    NS(this)->fops->create,

                    loc,

                    flags | O_EXCL,

                    mode,

                    fd);

代码说明:

1)NS(this),代表调用unify的namespace节点,在该节点上创建文件。

2)通过上面参数unify_ns_create_cbk,我们知道,在namespace创建成功后,会执行unify_ns_create_cbk函数

 

接下来我们进入unify_ns_create_cbk函数进行分析:

 

存储节点创建文件流程图

3.3.函数unify_writev分析

  在unify模式中,文件内容的写,是直接在存储节点上进行,与namespace节点无关。其主要流程如下:

初始化对象local相关的参数,并且将该参数赋值给frame参数;

从ctx获得fd(w文件描述符)存储的子节点对象索引号,并且获得子卷对象;

向子卷发送写请求,发送函数及其参数如下所示:

 STACK_WIND (frame,

                    unify_writev_cbk,

                    child,

                    child->fops->writev,

                    fd,

                    vector,

                    count,

                    off,

                    iobref);

3.4.函数unify_readv分析

  与unify_writev操作类似,读操作也是直接找到相应的文件存储的节点,然后读取出来,在此不再给出。

5.函数unify_opendir分析

 即打开文件操作,即想查看在某个文件夹下有哪些文件及其文件夹,该操作直接操作namespace卷opendir操作即可,关键代码:

 STACK_WIND (frame, unify_opendir_cbk,

                    NS(this), NS(this)->fops->opendir, loc, fd);

4.可配置选型

键名

类型

默认值

描述

namespace

GF_OPTION_TYPE_XLATOR

 

 

scheduler

GF_OPTION_TYPE_STR

{"alu", "rr", "random", "nufa", "switch"}

 

self-heal

GF_OPTION_TYPE_STR

{"foreground", "background", "off"}

 

optimist

GF_OPTION_TYPE_BOOL