一、什么是GlusterFS
    glusterfs是一个横向扩展的分布式文件系统,就是把多台异构的存储服务器的存储空间整合起来给用户提供统一的命名空间。用户访问存储资源的方式有很多,可以通过NFS,SMB,HTTP协议等访问,还可以通过gluster本身提供的客户端访问。

二、典型部署拓扑图

GlusterFS基础知识_glusterfs


三、概念和算法

1、Trusted Storage Pool

一堆存储节点的集合
通过一个节点“邀请”其他节点创建,这里叫probe
成员可以动态加入,动态删除
添加命令如下:
node1# gluster peer probe node2
删除命令如下:

node1# gluster peer detach node3

GlusterFS基础知识_glusterfs_02

2、Bricks
Brick是一个节点和一个导出目录的集合,e.g. node1:/brick1
Brick是底层的RAID或磁盘经XFS或ext4文件系统格式化而来,所以继承了文件系统的限制
每个节点上的brick数是不限的
理想的状况是,一个集群的所有Brick大小都一样

GlusterFS基础知识_glusterfs_03

3、Volumes

Volume是brick的逻辑组合
创建时命名来识别
Volume是一个可挂载的目录
每个节点上的brick数是不变的,e.g.mount –t glusterfs www.std.com:test /mnt/gls
一个节点上的不同brick可以属于不同的卷
支持如下种类:
a) 分布式卷
b) 条带卷
c) 复制卷
d) 分布式复制卷
e) 条带复制卷

f) 分布式条带复制卷



3.1分布式卷
文件分布存在不同的brick里
目录在每个brick里都可见
单个brick失效会带来数据丢失

无需额外元数据服务器




分布式卷内部的hash分布如下:

GlusterFS基础知识_glusterfs_04

    gluster是没有元数据服务器的,它定位文件和寻址都是通过哈希算法,这里使用的叫Davies-Meyer hash algorithm,可寻址空间为2^32次方,即0-4294967296,例如这里有四个节点,那么0-1073741824为node1的可寻址空间,1073741825-214748348为node2的可寻址空间,以此类推。访问一个文件时,通过文件名计算出一个地址,例如2142011129,属于1073741825-214748348,则将它存在node2中。

3.2 复制卷
同步复制所有的目录和文件
节点故障时保持数据高可用
事务性操作,保持一致性
有changelog
副本数任意定

复制卷的读写如下图所示:

GlusterFS基础知识_glusterfs_05

3.3分布式复制卷
最常见的一种模式
读操作可以做到负载均衡

3.4 条带卷
文件切分成一个个的chunk,存放于不同的brick上
只建议在非常大的文件时使用(比硬盘大小还大)
Brick故障会导致数据丢失,建议和复制卷同时使用
Chunks are files with holes – this helps in maintaining offset consistency.


4、接入机制

FUSE based Native protocol
NFSv3
SMB
Libgfapi
ReST/HTTP
HDFS


4.1 FUSE based native access

    原生客户端接入时,请求某一文件时直接定位到该文件在那一台或几台节点上,向那几台节点发出请求,完成操作,如下图所示:

GlusterFS基础知识_glusterfs_06


4.2 NFS access

    NFS或SMB等其他协议接入就不那么简单了,首先要经过一层负载均衡服务,可能是RRDNS,还有HA服务,这些服务并不是gluster自带的,要自行部署,RRDNS就是在各个节点中找一台负载轻的把请求发过去,HA,可能用的ctdb或其他,是当它要发请求的那一台节点故障了,就把请求转移到另一台节点。总之,事先找到一台节点把请求发过去,这里是通过节点上的NFS服务器完成的请求,但是所请求的文件不一定在那台节点上,所以还要经过一步,就是在那台节点上再找这个文件在哪里,重新定位到有这个文件的节点,从而完成操作,对比原生客户端接入,可以看到这里要复杂的多,所以NFS访问性能并不理想。


GlusterFS基础知识_glusterfs_07

GlusterFS基础知识_glusterfs_08    


4.3 libgfapi
提供编程接口,通过这个接口写程序访问
减少了上下文切换
通过这个接口集成了qemu, samba, NFS Ganesha
同步和异步的接口都提供
实现各种语言的绑定

4.4 libgfapi v/sFUSE-FUSE access

GlusterFS基础知识_glusterfs_08    gluster是用户空间的文件系统,只能通过FUSE和内核交互,所以传下来的的命令都是先由内核虚拟文件系统VFS接受,FUSE注册的一个虚拟设备/dev/fuse知道这时候来了一个请求,就接受过来,不传到底层XFS或EXT4...文件系统了,有gluster在FUSE中注册的一系列读写程序来处理,完成这个请求,这一系列读写处理就是通过网络传出去,在节点的glusterfsd接收到请求后,完成操作,再将结果通过网络回传到客户端,如下图所示:

GlusterFS基础知识_glusterfs_10


4.5 libgfapi v/sFUSE-libgfapi access

    为什么gluster会提供api接口将应用集成到gluster内部呢,因为像外部的NFS,SMB那些,本身是不能跟gluster通信的,他们只能通过fuse,就是NFS液相FUSE传递信息,gluster也向fuse传递信息,他俩就通信了,这样很不方便,会经历内核这一层,这样一来就要消耗很多资源了,也会耗时间,而且没有必要,两个人在一起就好了是不是,fuse好多余。于是通过gluster自己封装的一个接口,将NFS,SMB什么的都集成起来,他们就在一起了,如下图所示,整个流程轻松了许多。


GlusterFS基础知识_glusterfs_11
GlusterFS基础知识_glusterfs_08


5、Customizable Translator Stack

   Translator相当于gluster中的功能模块,一个或多个translator加在一起完成一个功能,比如说cache的设置,线程数的设置,内置NFS的相关设置等,translator之间是堆栈形式一层一层组织的,并不是无序的。

GlusterFS基础知识_glusterfs_13


6、Ecosystem Integration(集成生态系统)

OpenStack:这个很有名了,可以理解为一套工具让你通过他享受公有云和私有云以及其他相关的各种服务
Samba:windows和unix之间实现资源共享
Ganesha:一个印度人写的用户空间的NFS,这个印度人起了个难读的名字,和印度一个长着大象鼻子的智慧神一样的,叫伽内什
oVirt:基于KVM(Kernel-based Virtual Machine) 的虚拟化存储管理软件
qemu:也是和虚拟化相关的

Hadoop:分布式并行计算的,是MapReduce生态圈的

 pcp:我也不知道是啥

Proxmox:Proxmox VE (Proxmox Virtual Environment) 是一个集成OPENVZ 支持KVM应用的环境
uWSGI:基于Python的Web项目部署方法,像php-cgi一样监听同一端口,进行统一管理和负载平衡

7、Use Cases - current

  •  Unstructured data storage

  • Archival

  • Disaster Recovery

  • Virtual Machine Image Store

  •  Cloud Storage for Service Providers

  •  Content Cloud

  • Big Data

  • Semi-structured & Structured data


转自:http://blog.csdn.net/uj_mosquito/article/details/41039879