全局统一命名空间
Glusterfs采用了全局统一命名空间设计,将磁盘和内存资源聚集成一个单一的虚拟存储池进行管理,并在此命名空间中使用NFS/CIFS等标准协议来访问应用数据。与其他分布式文件系统有所不同的是,GlusterFS中没有专用的元数据服务器,而是独特地采用无元数据服务的设计,取而代之使用算法来定位文件,元数据和数据没有分离而是一起存储。这使得数据访问完全并行化,从而实现真正的线性性能扩展。无数据服务器极大提高了GlusterFS的性能、可靠性和稳定性。

GlusterFS是模块化堆栈式的架构设计,模块称为Translator。Translators是GlusterFS提供的一种强大文件系统功能扩展机制,这一设计思想借鉴于GNU/Hurd微内核操作系统。GlusterFS中所有的功能都通过Translator机制实现,借助这种良好定义的接口可以高效简便地扩展文件系统的功能。在Glusterfs中,每个translator都有自己的全局命名空间,并且使用自己的机制进行独立的维护和管理。

三种集群模式

Glusterfs是集群文件系统,主要有三种基本的集群模式,即分布式集群(Distributed cluster)、条带集群(Stripe cluster)、复制集群(Replica cluster)。这三种基本集群还可以采用类似堆积木的方式,构成更加复杂的复合集群,比如分布式条带集群(Distributed stripe cluster)、分布式复制集群(Distributed replica cluster)、RAID10集群(Stripe replica cluster)、分布式RAID10集群(Distributed stripe replica cluster)。

三种基本集群各由一个translator来实现,分别由自己独立的命名空间,如上图所示。对于分布式集群,文件通过HASH算法分散到集群节点上,每个节点上的命名空间均不重叠,所有集群共同构成完整的命名空间,访问时使用HASH算法进行查找定位。复制集群类似RAID1,所有节点命名空间均完全相同,每一个节点都可以表示完整的命名空间,访问时可以选择任意个节点。条带集群与RAID0相似,所有节点具有相同的命名空间,但对象属性会有所不同,文件被分成数据块以Round Robin方式分布到所有节点上,访问时需要联动所有节点来获得完整的名字信息。对于VFS的lookup, stat, readdir三个名字空间相关操作,三种集群处理方式如下。

(1)Distribued集群
  .lookup:采用hash算法选择节点,如果未命中且为目录则查询卷下所有节点,还未找到且设置search_unhashed则遍历所有节点;
  .stat:请求发向所有节点,如果是目录需要对属性进行聚合;
  .readdir:查询所有节点,并对文件目录信息及属性进行聚合;

(2)Stripe集群
  .lookup:所有节点都要被查询,进行属性聚合,检查gfid并进行自修复;
  .stat:查询所有节点,进行信息聚合;
  .readdir:查询首节点,属性信息需要聚合所有节点信息;

(3)Replica集群

  .lookup:请求发送到所有节点,首个成功响应即返回;
  .stat:查询选择的一个UP节点,如果失败则依次查询下一个节点;
  .readdir:与stat相同,选择一个UP节点进行查询,如果失败则依次查询下一个UP节点;

Distributed集群
这种集群又称弹性哈希卷,它使用算法进行数据定位,这是整个Glusterfs的架构基础和最大特点,集群中的任何服务器和客户端只需根据路径和文件名就可以对数据进行定位和读写访问,因此文件定位可独立并行化进行。Glusterfs中,不需要将元数据与数据进行分离,文件元数据记录在底层文件系统的inode以及扩展属性上。GlusterFS的哈希分布是以目录为基本单位的,文件的父目录利用扩展属性记录了子卷映射信息,子文件在父目录所属存储服务器中进行分布。由于文件目录事先保存了分布信息,因此新增节点不会影响现有文件存储分布,它将从此后的新创建目录开始参与存储分布调度。
.lookup:采用hash算法查找文件
 1)如果path为根目录,则选定第一个UP卷(dht_first_up_subvol)为目标卷;
 2)否则,以path为输入参数计算hash值(dht_hash_compute),从父目录扩展属性中获取哈希分布信息,然后查找定位目标卷;
 3)如果找到目标卷,则在目标卷中查找path;如果没有找到并且设置GF_DHT_LOOKUP_UNHASHED_ON/GF_DHT_LOOKUP_UNHASHED_AUTO,将搜索所有的卷;
 4)如果没有找到目标卷,并且path为目录,则在所有子卷中查找;

.mkdir:分布到所有子卷上,新增节点参加分布上,并分配hash range
 1)首先在目标卷hashed_subvol创建目录;
 2)向其他所有子卷发送请求创建目录;
 3)通过selfheal机制(dht_selfheal_new_directory)分配hash范围;

.create:分布到父目录所分布的子卷上,新增节点不参加分布
 1)计算文件名hash值,查找目标卷;若未找到则返回;
 2)如果目标卷空闲容量在预定水位以下,则创建文件并返回;
 3)查找空闲容量在预定水位以下子卷,在其上创建文件,并在目标卷上创建链接指向实际文件;

Stripe集群
名字空间由所有子卷共同组成,lookup时会将请求发送到全部节点上,属性获取需要聚合。若其中任一节点出问题,则namespace和数据将不可访问。
 . lookup:请求发送到所有节点,客户端进行聚合。当所有请求成功返回方才向上返回结果;
 . create/mkdir:请求发送到所有节点,所有节点namespace相同,但属性稍有不同;
 . readdir:向第一个节点请求所有目录项,属性需要查询所有节点进行聚合;
 . readv:根据stripe size及Round Robin算法,计算出数据所在的节点,然后并行发送请求,由客户端对数据重新进行组织;
  .writev:计算所写数据块所属节点及offset,所有写成功后方才向上返回;

Replica集群
所有节点具有相同的、全完全对等的名字空间,默认第一个节点作为主节点。请求通常发送到所有节点,所有成功返回后才向上作响应。
 . lookup:请求发送到所有up节点,有成功返回即响应;并处理是否需要进行sealheal,主要依据是xattr上记录的change log;
 . create/mkdir:以afr_transaction事务方式处理,请求发送到所有UP子节点上,所有成功返回后方才向上响应;
 . readdir:选择一个UP节点发请求,具有负载均衡作用,失败后则依次请求所有其他节点;
 . readv:open时打开所有UP节点,读时选择一个UP节点进行read,若失败则依次偿试所有其他节点;
 . writev:以afr_transaction事务方式处理,请求发送到所有UP子节点上,所有成功返回方才向上响应;

Glusterfs全局统一命名空间相关推荐

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

    1.概述 This xlator is one of the main translator in GlusterFS, which actually does the clustering work ...

  2. Spring中Controller层、Filter层、Interceptor层全局统一异常处理

    Controller层.Filter层.Interceptor层全局统一异常处理 SpringBoot为异常处理提供了很多优秀的方法,但是像我这种新手在处理异常时还是会觉得一头包,终于我痛定思痛,总结 ...

  3. apache dubbo 自定义全局统一的异常处理器

    项目使用过的是apache dubbo 2.7.1, 封装了自定义全局统一的异常处理器. 统一异常处理器 需要实现javax.ws.rs.ext.ExceptionMapper接口. import o ...

  4. 全局统一返回结果包装信息

    1.全局统一处理结果类 package com.atguigu.yygh.common.result;import io.swagger.annotations.ApiModel; import io ...

  5. SpringBoot定义全局统一业务异常,且处理filter里面的异常

    SpringBoot定义全局统一业务异常,且处理filter里面的异常 参考文章: (1)SpringBoot定义全局统一业务异常,且处理filter里面的异常 (2)https://www.cnbl ...

  6. CUDA编程: GPU与CPU之间使用全局统一内存的完整代码及编译

    CUDA编程: GPU与CPU之间使用全局统一内存的完整代码及编译 最近碰到一个应用场景,需要从GPU访问host上创建的,一个很大的布隆过滤器(准确说是改进后的布谷鸟过滤器).由于GPU卡上的显存有 ...

  7. Java全局统一返回处理

    新项目中不希望每次返回参数还要重新封装再返回,希望直接将查询数据或者返回数据统一定义进行返回,所以将新项目中的全局统一返回配置记录,备忘.同时分享给有需要的码友.(例:查询出来的对象集合直接返回,会统 ...

  8. Spring Boot电商项目17:用户模块六:注册接口开发之:使用【GlobalExceptionHandler】来全局统一处理异常;(涉及了@ControllerAdvice等注解)

    说明: (1)为什么写这篇博客?:在[Spring Boot电商项目15:用户模块四:注册接口开发:]中,在Service层中遇到了[用户名重复]的情况,然后Service层把这个情况做成了一个异常, ...

  9. 基于senparc实现的微信AccessToken接口全局统一获取

    在senparc中实现了AccessToken的全局获取方式,因微信项目涉及跨语言.跨团队,外包方式的合作,需要通过接口方式供合作方调用,现将使用webapi实现的接口分享给大家: 1.自定义一个对外 ...

最新文章

  1. 用于面包板的双列直插需要多宽?
  2. 刷算法的时候有没有必要自写测试用例?
  3. leetcode -python 三数之和原创
  4. Android实战处理带+号的电话号码在Arabic语言中的正确显示
  5. Git \Github使用文档(一)
  6. 气流与路易吉,阿戈,MLFlow,KubeFlow
  7. java的动态绑定是什么意思_Java的动态绑定机制
  8. Python语言importError:cannot import name ‘InvalidArgumentException‘报错的解决方法:
  9. 因子分析累计贡献率_spss教程:因子分析
  10. react 创建组件的两种方式
  11. java关于Exception(异常)的详解
  12. 计算机29首流行音乐叫什么,2018结婚用的歌曲排名 50首流行歌曲燃爆婚礼现场...
  13. 麦兜与春田花花幼稚园
  14. 如何拍出来好看的Vlog,必备小技能(六)?
  15. 公司监控显示无网络连接服务器,监控显示无网络视频什么原因
  16. html读秒倒计时,使用javascript做时间倒数读秒功能的实例
  17. android 4.0板卡接收视频源,在Digilent Nexys Video板卡上实现HDMI I/O视频处理系统的软件配置介绍...
  18. getpid()函数和getppid()函数
  19. 直流电机电压调速器设计
  20. HackBrowserData密码抓取

热门文章

  1. div html用法详解,div标签详解
  2. $watch和watch属性的使用
  3. python flask自定义404错误页面
  4. 一个软件测试员如何选择mac妙控板或妙控鼠标
  5. 【转载】那个裸辞的程序员,后来怎么样了?
  6. elasticsearch实现基于拼音搜索
  7. 用HTML编写的一个小调查表
  8. 基于 WeDataSphere Prophecis 与 KubeSphere 构建云原生机器学习平台
  9. 1503 Problem A 最简分式
  10. 美亚杯第二届(2016)-个人赛