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

GlusterFS:统一命名空间(Unify)源码分析相关推荐

  1. Glusterfs之nfs模块源码分析(下)之NFS协议之RPC的实现和NFS协议内容

    一.网络文件系统概述 Sun Microsystems公司于1984年推出了一个在整个计算机工业中被广泛接受的远程文件存取机制,它被称为Sun的网络文件系统(Network File System), ...

  2. 【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

    上篇文章我介绍了如何在网关上实现客户端自定义限流功能,基本完成了关于网关的一些自定义扩展需求,后面几篇将介绍基于IdentityServer4(后面简称Ids4)的认证相关知识,在具体介绍ids4实现 ...

  3. MyBatis 源码分析 - 映射文件解析过程

    1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...

  4. thinkphp源码分析(一)—开门篇

    源码分析-开门篇 thinkphp生命周期 1.入口文件 用户发起的请求都会经过应用的入口文件,通常是 ==public/index.php==文件.当然,你也可以更改或者增加新的入口文件. 通常入口 ...

  5. 【spring源码分析】IOC容器初始化(二)

    前言:在[spring源码分析]IOC容器初始化(一)文末中已经提出loadBeanDefinitions(DefaultListableBeanFactory)的重要性,本文将以此为切入点继续分析. ...

  6. vuex 源码分析_Vuex框架原理与源码分析

    Vuex是一个专为Vue服务,用于管理页面数据状态.提供统一数据操作的生态系统.它集中于MVC模式中的Model层,规定所有的数据操作必须通过 action - mutation - state ch ...

  7. 逐行粒度的vuex源码分析

    vuex源码分析 了解vuex 什么是vuex vuex是一个为vue进行统一状态管理的状态管理器,主要分为state, getters, mutations, actions几个部分, vue组件基 ...

  8. yaf php源码,PHP-Yaf执行流程-源码分析

    介绍 Yaf框架是通过PHP扩展实现的一种PHP MVC开发框架,因为Yaf框架是PHP扩展实现的,所以性能非常高,而且通过阅读源码可以深入的了解框架内部实现细节和一些优秀的扩展开发技巧,但是学习Ya ...

  9. rdkafka线程过多_Kafka快速入门(十一)——RdKafka源码分析

    Kafka快速入门(十一)--RdKafka源码分析 一.RdKafka C源码分析 1.Kafka OP队列 RdKafka将与Kafka Broke的交互.内部实现的操作都封装成Operator结 ...

最新文章

  1. 用单片机测量流体流速的_流量计是测量液体、气体流量仪表原理安装
  2. 【星·企业】竞逐卫星互联网“新基建”,「九天微星」完成2.7亿元B 轮融资
  3. 我们该怎么成为技术尖子生
  4. 邮件里面的图怎么复制出来_如何从INS批量导出邮件开发新的客户,推广产品和找reviewer【小技巧】...
  5. 独立开发者:新手做2D手游该用哪些工具?
  6. bzero, memset ,setmem 区别【转】
  7. 【C++教程】01.基本概念
  8. es dsl多条件组合查询(转)
  9. 明年的现在我也想去“双选会”应聘!
  10. win10下安装Ubuntu18.4双系统(适合小白)
  11. 在CentOS中安装和部署nacos配置中心
  12. Idea中上传项目到Github
  13. 国内高速下载Google Drive资源
  14. 大觉寺到鹫峰线路_大觉寺—鹫峰—望京塔—羊台山—凤凰岭—七王坟徒步游记...
  15. ar5418无线网卡驱动
  16. 厚积薄发系列(C语言资料)
  17. 03_STM32新建工程
  18. 小程序 订阅消息 原来就是如此
  19. mysql主从配置duxi_Mysql主从同步配置
  20. 【解决】阿拉伯语等右向左排版文字CSS解决方案

热门文章

  1. 第五章——决策树笔记(《统计学习方法》-李航)
  2. ubuntu实现中文输入法_在Ubuntu 18.04中设置中文输入法
  3. 怎样检查笔记本电池使用情况?
  4. java实现通过url实现浏览器下载pdf文件
  5. 墨墨背单词--通过安装包提取它的所有离线单词
  6. 实例:函数定义来计算面积,体积
  7. troublemaker中文谐音_trouble maker歌词的中文译音
  8. Linux和开发版ping,主机、虚拟机、开发板之间的互ping——Bridged方式
  9. yolov7-pose:基于COCO-KeyPoint的yolov7-pose训练
  10. AGV调度、AGV调度系统、AGV小车调度、AGV小车调度系统、搬运小车调度、搬运小车调度系统、slam车调度、slam调度系统、调度、调度系统