【GlusterFS学习之四】:自动在volfile中生成需要的xlator

在上一篇文章中gluster xlator的设计中,讲到通过手动修改volfile来添加相应的xlator功能,但是实际上的需求是工程在建立好之后可以在创建卷的过程中自动在volfile中生成相应的xlator,本文将探讨这个问题。

一、volfile简介

本文主要讨论的是gluster的volfile,那么还是主要了解一下volfile的定义和意义,有两篇文章可以阅读:

http://www.gluster.org/community/documentation/index.php/Understanding_vol-file

http://blog.sina.com.cn/s/blog_6a4c492f0100qm6v.html

在此之后,我还想说一下自己的理解和认识。

volfile的删除:卷的删除操作会造成volfile的删除,也就是执行gluster volume stop img和gluster volume delete img之后。

volfile的生成:volfile是server端在创建卷的时候生成的,也就是执行gluster volume create img之后生成的。

volfile的加载:volfile的加载是在glusterfsd服务器进程执行的时候进行的,而glusterfsd是在volume start的时候启动的(create了volume之后):gluster volume start
img。

glusterfs,glusterd,glusterfsd,gluster的区别何在?还是想说一声自己的理解,望指正:

>glusterfs:client端挂载server端的卷以及在client端的相关操作

>glusterd:Gluster elastic volume management daemon。glusterd与卷管理有关系,而且代码集中在xlators/mgmt/glusterd/src下面。

>glusterfsd:start a glusterfs server,server端的进程启动。

>gluster:Gluster Concole Manager,to run the program and display gluster prompt

过程了解了,还是要深入到代码里面才能有更加深刻的认识,还是要不断的阅读源代码。

二、自动生成volfile添加内容

在了解了volfile之后,我们讨论其自动生成的问题。同样,我们是需要在glusterfs中加入audit功能,及加入audit xlator,前一篇已经讲过如何编写audit的代码了,那么加入到glusterfs的源代码中只需要修改一些简单的编译文件路径即可,在此不多说,主要还是讲volfile相关的函数,主要有三个:

>glusterd-volgen.c:生成volfile函数

>glusterd-volgen.h

>glusterd-volume-set.c:volfile的option设置相关

我们来看gluster-volgen.c里面生成xlator graph的函数server_graph_builder:

static int
server_graph_builder (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,
                      dict_t *set_dict, void *param)
{
        char                 *volname       = NULL;
        char                 *path          = NULL;
        int                   pump          = 0;
        xlator_t             *xl            = NULL;
        xlator_t             *txl           = NULL;
        xlator_t             *rbxl          = NULL;
        char      transt[16]                = {0,};
        char                 *ptranst       = NULL;
        char      volume_id[64]             = {0,};
        char      tstamp_file[PATH_MAX]     = {0,};
        int                   ret           = 0;
        char                 *xlator        = NULL;
        char                 *loglevel      = NULL;
        char                 *username      = NULL;
        char                 *password      = NULL;
        char     index_basepath[PATH_MAX]   = {0};
        char     key[1024]                  = {0};
        glusterd_brickinfo_t *brickinfo     = NULL;
        char changelog_basepath[PATH_MAX]   = {0,};
        gf_boolean_t          quota_enabled = _gf_true;
        gf_boolean_t          pgfid_feat    = _gf_false;
        char                 *value         = NULL;
        char                 *ssl_user      = NULL;

        brickinfo = param;
        path      = brickinfo->path;
        volname = volinfo->volname;
        get_vol_transport_type (volinfo, transt);

        ret = dict_get_str (set_dict, "xlator", &xlator);

        /* got a cli log level request */
        if (!ret) {
                ret = dict_get_str (set_dict, "loglevel", &loglevel);
                if (ret) {
                        gf_log ("glusterd", GF_LOG_ERROR, "could not get both"
                                " translator name and loglevel for log level request");
                        goto out;
                }
        }

        ret = glusterd_volinfo_get (volinfo, VKEY_FEATURES_QUOTA, &value);
        if (value) {
                ret = gf_string2boolean (value, "a_enabled);
                if (ret)
                        goto out;
        }

        xl = volgen_graph_add (graph, "storage/posix", volname);
        if (!xl)
                return -1;

        ret = xlator_set_option (xl, "directory", path);
        if (ret)
                return -1;

        ret = xlator_set_option (xl, "volume-id",
                                 uuid_utoa (volinfo->volume_id));
        if (ret)
                return -1;

        ret = check_and_add_debug_xl (graph, set_dict, volname,
                                      "posix");
        if (ret)
                return -1;

        xl = volgen_graph_add (graph, "features/access-control", volname);
        if (!xl)
                return -1;

        ret = check_and_add_debug_xl (graph, set_dict, volname, "acl");
        if (ret)
                return -1;

        xl = volgen_graph_add (graph, "features/locks", volname);
        if (!xl)
                return -1;

        ret = check_and_add_debug_xl (graph, set_dict, volname, "locks");
        if (ret)
                return -1;

        xl = volgen_graph_add (graph, "performance/io-threads", volname);
        if (!xl)
                return -1;

        ret = check_and_add_debug_xl (graph, set_dict, volname, "io-threads");
        if (ret)
                return -1;

        xl = volgen_graph_add (graph, "features/barrier", volname);
        if (!xl)
               return -1;

        xl = volgen_graph_add (graph, "features/quota", volname);
        if (!xl)
                return -1;
        ret = xlator_set_option (xl, "volume-uuid", volname);
        if (ret)
                return -1;

		/* add the audit xlator to the graph*/
        xl = volgen_graph_add(graph, "features/audit", volname);
        if(!xl)
                return -1;
			        ret = xlator_set_option (xl, "audit", "off");
        if (ret)
                return -1;

        /* Check for read-only volume option, and add it to the graph */
        if (dict_get_str_boolean (set_dict, "features.read-only", 0)){
                xl = volgen_graph_add (graph, "features/read-only", volname);
                if (!xl) {
                        ret = -1;
                        goto out;
                }
        }

        xl = volgen_graph_add_as (graph, "debug/io-stats", path);
        if (!xl)
                return -1;

        xl = volgen_graph_add (graph, "protocol/server", volname);
        if (!xl)
                return -1;
        ret = xlator_set_option (xl, "transport-type", transt);
        if (ret)
                return -1;
 out:
        return ret;
}

只是选择了主要的一部分代码来进行说明,可以看到server_graph_builder这个函数里面相关xlator的设置生成顺序和最后生成的volfile文件是一致的,主要就是两个函数将xlator添加到volfile中去:volgen_graph_add和xlator_set_option,一个是根据volname添加到graph中,另一个是则是设置相关的option。在代码的Line106~Line112中,添加了自己需要生成的xlator的代码,就完成了。当然还需要在glusterd-volgen.c这个文件中的get_server_xlator函数中加入相应代码:

static glusterd_server_xlator_t
get_server_xlator (char *xlator)
{
        glusterd_server_xlator_t subvol = GF_XLATOR_NONE;

        if (strcmp (xlator, "posix") == 0)
                subvol = GF_XLATOR_POSIX;
        if (strcmp (xlator, "acl") == 0)
                subvol = GF_XLATOR_ACL;
        if (strcmp (xlator, "locks") == 0)
                subvol = GF_XLATOR_LOCKS;
        if (strcmp (xlator, "io-threads") == 0)
                subvol = GF_XLATOR_IOT;
        if (strcmp (xlator, "index") == 0)
                subvol = GF_XLATOR_INDEX;
        if (strcmp (xlator, "marker") == 0)
                subvol = GF_XLATOR_MARKER;
        if (strcmp (xlator, "io-stats") == 0)
                subvol = GF_XLATOR_IO_STATS;
        if (strcmp (xlator, "bd") == 0)
                subvol = GF_XLATOR_BD;
	if (strcmp(xlator,"audit") == 0)
		subvol = GF_XLATOR_AUDIT;
        return subvol;
}

见Line22-Line23。至此,glusterd-volgen.c的代码添加修改完成。然后在glusterd-volgen.h头文件中添加宏:

#define VKEY_FEATURE_AUDTI "features.audit"

以及在glusterd_server_xlator_t结构体中加入:GF_XLATOR_AUDIT即可。

再看gluster-volume-set.c这个文件,它主要是对volfile中的xlator的option进行设置,在glusterd_volopt_map中添加代码:

{
    .key   = "features.audit",
    .voltype     = "features/audit",
    .op_version  = 1,
 },

最后修改一下audit.c中的volume_options:

 {
	 .key = {"audit"},
	 .type = GF_OPTION_TYPE_BOOL,
	 .default_value = "off",
 }

对Makefile进行简单的添加和修改之后就可以编译安装了,因为主要是操作server端,那么在server端进行。

首先先卸载:

make uninstall
make distclean

编译安装:

./configure
make && make install

然后是重新启动glusterd进程,停止卷,删除卷,创建卷,启动卷,查看volfile。

service glusterd restart
gluster volume stop img
gluster volume delete img
gluster volume create img replica 2 10.23.85.48:/data/gluster 10.23.85.49:/data/gluster
gluster volume start img

创建volume的时候遇到两个问题:

1./data/gluster已经是volume的一部分,删除即可。

2.Peer Rejected,重新启动所有server的glusterd即可(解决方法)。

我们可以看一下创建好的volfile:

有一点需要特别注意的是,之前修改过代码之后编译安装,不断的删除卷,创建卷,启动卷重复做了很多遍,但是volfile中没有生成想要的xlator内容,以为是在卸载过程中没有卸载干净的原因,其实际原因是没有重新启动glusterd进程,glusterd一直是老的进程(确切点说是尼玛半个月前启动的进程)。那么glusterd虽然在卸载编译之后更新了,但是我们没有重启glusterd服务,那么半个月前的老glusterd进程并不是修改过的源代码(也就是在glusterd-volgen.c中增加代码之前)编译得到的进程,因此,修改过的代码并没有起作用,那么无论我怎么创建create
volume卷,执行的都是老的glusterd-volgen.c的代码流程,因此没有改变,仅仅只要restart glusterd服务就好了,执行的就是修改过的代码的流程,主要还是自己对问题理解不够深刻,对代码不够敏感。

下面我们再来看gluster volume set对问题的影响。我们设置了一个option,也就是开关,来控制这个xlator是否起作用,默认情况是off,那么我们就看看off和on之后的区别。

在默认off情况下(也就是没有进行启用audit操作),我们在客户端挂载运行,并在挂载点创建文件:aa,bb,cc,dd和文件夹:AA,BB,CC,DD,再进行删除aa和AA:

touch aa bb cc dd
mkdir AA BB CC DD

可以看到server端的日志:

我们将audit功能启用:

gluster volume set img features.audit on

可以看到option值由off变成了on,说明启动了audit功能,那么现在重新启动glusterfsd,再进行删除文件bb和文件夹BB的操作,观察server端的日志情况。

可以清晰的看到,在开启audit功能之后,成功的实现了审查到了删除文件和文件夹的操作。

Author:忆之独秀

Email:[email protected]

注明出处:http://blog.csdn.net/lavorange/article/details/45246175

时间: 2024-08-05 17:10:50

【GlusterFS学习之四】:自动在volfile中生成需要的xlator的相关文章

OpenStack 入门学习之四:icehouse版本中Heat的简单介绍

Heat简介 Heat是OpenStack的负责编排计划的主要项目.它可以基于模板来实现云环境中资源的初始化,依赖关系处理,部署等基本操作,也可以解决自动收缩,负载均衡等高级特性.目前Heat自身的模板格式(HOT)正在不停的改进,同时也支持AWS CloudFormation 模板(CFN),HOT的目标是在不远的将来可以完全的替代CFN. Heat提供了一个OpenStack的原生REST API和CloudFormation兼容的查询API. Heat的工作原理 Heat主要是基于模板文件

php学习之道:php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类

1. web service普及: Webservice soap wsdl区别之个人见解 Web Service实现业务诉求:  Web Service是真正"办事"的那个,提供一种办事接口的统称. WSDL提供"能办的事的文档说明":  对要提供的服务的一种描述格式.我想帮你的忙,但是我要告诉你我都能干什么,以及干这些事情需要的参数类型. SOAP提供"请求"的规范:  向服务接口传递请求的格式,包括方法和参数等.你想让人家办事,总得告诉人家

【学习笔记】Java中生成对象的5中方法

概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.reflect.Constructor类的newInstance()实例方法. 4.调用对象的clone()方法. 5.运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法. 一.使用new关键字 这是最常见也是最简单的创建对象的方式了.通过这种方式

puppet学习之四 编写模块

puppet学习之四 编写模块 这里不赘述编写的语法,只是简单记录下一个模块编写的简单流程 [[email protected] ~]# cd /etc/puppet/modules/ [[email protected] modules]# mkdir puppet [[email protected] modules]# cd puppet/ [[email protected] puppet]# mkdir files manifests templates #创建模块目录结构 [[ema

EntityFramework_MVC4中EF5 新手入门教程之四 ---4.在EF中创建更复杂的数据模型

在以前的教程你曾与一个简单的数据模型,由三个实体组成.在本教程中,您将添加更多的实体和关系,并通过指定格式. 验证和数据库映射规则,您将自定义数据模型.你会看到自定义的数据模型的两种方式: 通过添加属性,实体类并通过将代码添加到数据库上下文类. 当您完成时,实体类将已完成的数据模型中,如下图所示: 通过使用属性进行自定义的数据模型 在本节中,您会看到如何通过使用指定的格式,验证和数据库映射规则的属性来自定义数据模型.然后在以下各节,您将创建的几个完整的School数据模型,通过添加属性的类已创建

cocos2d-x学习之自动内存管理

一.自动内存管理 1)概述 C++语言默认是没有提供自动内存管理的.使用者需要自己分配,自己释放.在cocos2d-x里提供了一个自动内存管理的方案.主要是通过CCObject来提供的,用户只要继承了CCObject,就可以通过调用autorelease()来告诉系统进行自动内存管理. 一般用法就是:    CCLayer* pLayer = CreateLayer(s_nActionIdx);    pLayer->autorelease(); 2)自动内存管理的实现 自动内存管理的实现原理大

Android FM模块学习之四源码解析(二)

上一章我们了解了FM主activity:FMRadio.java,若没查看的,请打开链接Android FM模块学习之四源码解析(一) 查看fmradio.java源码注释.接下来我们来看看FM重要的一个类:FMRadioService.java 由上一章我们已经知道,打开FM时,在OnStart函数中会bindToService来开启服务, public boolean bindToService(Context context, ServiceConnection callback) { L

Maven学习笔记之——仓库(中)

Maven学习笔记之--仓库(中) 1.    远程仓库的配置 当出现默认的中央仓库无法满足我们的需求或者连接不上的时候.我们可以通过POM文件来指定远程仓库. <repositories> <repository> <id>jboss-maven2-release-repository</id> <name>JBoss Repository</name> <url>http://repository.jboss.org/

Linux中生成密钥的两种方法

Linux中生成密钥的两种方法 SSH服务支持一种安全认证机制,即密钥认证.所谓的密钥认证,实际上是使用一对加密字符串,一个称为公钥(publickey), 任何人都可以看到其内容,用于加密:另一个称为密钥(privatekey),只有拥有者才能看到,用于解密.通过公钥加密过的密文使用密钥可以轻松解密,但根据公钥来猜测密钥却十分困难. ssh的密钥认证就是使用了这一特性.服务器和客户端都各自拥有自己的公钥和密钥.如何使用密钥认证登录linux服务器呢? 在使用密钥认证远程登入linux之前,我们