下载地址(建议下载文档查看):https://download.zhoufengjie.cn/document/os/linuxos/www.zhoufengjie.cn-glusterfs-v1.0-20171016.pdf
1 Glusterfs介绍
Glusterfs是无中心的存储集群
GlusterFS总体架构与组成部分如图所示,它主要由存储服务器(BrickServer)、客户端以及NFS/Samba 存储网关组成。不难发现,GlusterFS 架构中没有元数据服务器组件,这是其最大的设计这点,对于提升整个系统的性能、可靠性和稳定性都有着决定性的意义。GlusterFS 支持TCP/IP 和InfiniBandRDMA 高速网络互联,客户端可通过原生Glusterfs 协议访问数据,其他没有运行GlusterFS客户端的终端可通过NFS/CIFS 标准协议通过存储网关访问数据。
GlusterFS是模块化堆栈式的架构设计,如下图所示。模块称为Translator,是GlusterFS提供的一种强大机制,借助这种良好定义的接口可以高效简便地扩展文件系统的功能。
1.服务端与客户端模块接口是兼容的,同一个translator可同时在两边加载。
2.GlusterFS中所有的功能都是通过translator实现,如Cluster, Storage,Performance, Protocol, Features等。
3.重点是GlusterFSClient端。
下图是GlusterFS数据访问的一个概要图:
1.首先是在客户端,用户通过glusterfs的mount point 来读写数据。
2.用户的这个操作被递交给本地linux系统的VFS来处理。
3.VFS将数据递交给FUSE内核文件系统,在启动glusterfs客户端以前,需要向系统注册一个实际的文件系统FUSE,如上图所示,该文件系统与ext3在同一个层次上面,ext3是对实际的磁片进行处理,而fuse文件系统则是将数据通过/dev/fuse这个设备文件递交给了glusterfs client端。所以,我们可以将fuse文件系统理解为一个代理。
4.数据被fuse递交给Glusterfs client 后,client对数据进行一些指定的处理(所谓的指定,是按照client配置文件来进行的一系列处理)
5.在glusterfsclient的处理末端,通过网路将数据递交给Glusterfs Server,并且将数据写入到服务器所控制的存储设备上
GlusterFS在技术实现上与传统存储系统或现有其他分布式文件系统有显著不同之处,主要体现在如下几个方面。
完全软件实现(SoftwareOnly)
GlusterFS认为存储是软件问题,不能够把用户局限于使用特定的供应商或硬件配置来解决。GlusterFS采用开放式设计,广泛支持工业标准的存储、网络和计算机设备,而非与定制化的专用硬件设备捆绑。对于商业客户,GlusterFS可以以虚拟装置的形式交付,也可以与虚拟机容器打包,或者是公有云中部署的映像。开源社区中,GlusterFS被大量部署在基于廉价闲置硬件的各种操作系统上,构成集中统一的虚拟存储资源池。简言之,GlusterFS是开放的全软件实现,完全独立于硬件和操作系统。
完整的存储操作系统栈(CompleteStorage Operating System Stack)
GlusterFS不仅提供了一个分布式文件系统,而且还提供了许多其他重要的分布式功能,比如分布式内存管理、I/O调度、软RAID和自我修复等。GlusterFS汲取了微内核架构的经验教训,借鉴了GNU/Hurd操作系统的设计思想,在用户空间实现了完整的存储操作系统栈。
用户空间实现(User Space)
与传统的文件系统不同,GlusterFS在用户空间实现,这使得其安装和升级特别简便。另外,这也极大降低了普通用户基于源码修改GlusterFS的门槛,仅仅需要通用的C程序设计技能,而不需要特别的内核编程经验。
模块化堆栈式架构(ModularStackable Architecture)
GlusterFS采用模块化、堆栈式的架构,可通过灵活的配置支持高度定制化的应用环境,比如大文件存储、海量小文件存储、云存储、多传输协议应用等。每个功能以模块形式实现,然后以积木方式进行简单的组合,即可实现复杂的功能。比如,Replicate模块可实现RAID1,Stripe模块可实现RAID0,通过两者的组合可实现RAID10和RAID01,同时获得高性能和高可性。
原始数据格式存储(DataStored in Native Formats)
GlusterFS无元数据服务设计(NoMetadata with the Elastic Hash Algorithm)以原始数据格式(如EXT3、EXT4、XFS、ZFS)储存数据,并实现多种数据自动修复机制。因此,系统极具弹性,即使离线情形下文件也可以通过其他标准工具进行访问。如果用户需要从GlusterFS中迁移数据,不需要作任何修改仍然可以完全使用这些数据。
对Scale-Out存储系统而言,最大的挑战之一就是记录数据逻辑与物理位置的映像关系,即数据元数据,可能还包括诸如属性和访问权限等信息。传统分布式存储系统使用集中式或分布式元数据服务来维护元数据,集中式元数据服务会导致单点故障和性能瓶颈问题,而分布式元数据服务存在性能负载和元数据同步一致性问题。特别是对于海量小文件的应用,元数据问题是个非常大的挑战。
GlusterFS独特地采用无元数据服务的设计,取而代之使用算法来定位文件,元数据和数据没有分离而是一起存储。集群中的所有存储系统服务器都可以智能地对文件数据分片进行定位,仅仅根据文件名和路径并运用算法即可,而不需要查询索引或者其他服务器。这使得数据访问完全并行化,从而实现真正的线性性能扩展。无元数据服务器极大提高了GlusterFS的性能、可靠性和稳定性。
分布卷(distributed volume):分布卷可以将某个文件随机的存储在卷内的一个brick内,通常用于扩展存储能力,不支持数据的冗余。除非底层的brick使用RAID等外部的冗余措施。工作模式如下:
复制卷(replicated volume):本卷在创建时可指定复本的数量,复本在存储时会在卷的不同brick上,因此有几个复本就必须提供至少多个brick。工作模式如下:
注意:在创建复本卷时,brick数量与复本个数必须相等;否则将会报错。
另外如果同一个节点提供了多个brick,也可以在同一个结点上创建复本卷,但这并不安全,因为一台设备挂掉,其上面的所有brick就无法访问了。
分片卷(striped volume):分片卷将单个文件分成小块(块大小支持配置,默认为128K),然后将小块存储在不同的brick上,以提升文件的访问性能。
stripe后的参数指明切片的分布位置个数
注意:brick的个数必须等于分布位置的个数
分布式复制卷(distribute replication volume): 此类型卷是基本复本卷的扩展,可以指定若干brick组成一个复本卷,另外若干brick组成另个复本卷。单个文件在复本卷内数据保持复制,不同文件在不同复本卷之间进行分布。
注意:
复本卷的组成依赖于指定brick的顺序
brick必须为复本数K的N倍,brick列表将以K个为一组,形成N个复本卷
分布式分片卷(distribute striped volume): 若创建的卷的节点提供的bricks个数为stripe个数N倍时,将创建此类型的卷。
注意:
切片卷的组成依赖于指定brick的顺序
brick必须为复本数K的N倍,brick列表将以K个为一组,形成N个切片卷
分片复制卷(striped replicated volume): 数据将进行切片,切片在复本卷内进行复制,在不同卷间进行分布。
exp1和exp2组成复本卷,exp3和exp4组成复本卷,两个复本卷组成分片卷。注意:brick数量必须和stripe个数N和repl参数M的积N*M相等。即对于brick列表,将以M为一组,形成N个切片卷。数据切片分布在N个切片卷上,在每个切片卷内部,切片数据复本M份。
分布式分片复制卷(distributed striped replicated volume)
注意:bricks数量为stripe个数N,和repl个数M的积N*M的整数倍
exp1 exp2 exp3 exp4组成一个分布卷,exp1和exp2组成一个stripe卷,exp3和exp4组成另一个stripe卷,1和2,3和4互为复本卷
exp4-exp8组成另一个分布卷,略。
Xlator=translator:glusterfs 模块的代名词
Brick :存储目录是Glusterfs 的基本存储单元,由可信存储池中服务器上对外
输出的目录表示。存储目录的格式由服务器和目录的绝对路径构成,具体如下:
SERVER:EXPORT.例如:myhostname:/exports/myexportdir/
Volume :卷是存储目录的逻辑组合。大部分gluster 管理操作是在卷上进行的。
Metadata:元数据关于数据的数据,用于描述文件、目录等的相关信息。
FUSE=Filesystem inUserspace: 是一个内核模块,允许用户创建自己的文件系统无需修改内核代码。
Glusterd : Glusterfs 后台进程,运行在所有Glusterfs 节点上。
DistributeVolume: 分布式卷
ReplicateVolume: 副本卷
StripeVolume: 条带卷
DistributeReplicate Volume: 分布式副本卷
DHT=Distribute HashTable
AFR=Automatic FileReplication
SAN = Storage AreaNetwork: 存储区域网络是一种高速网络或子网络,提供在计算机与存储之间的数据传输。
NAS = Network-attachedstorage:网络附属存储是一种将分布、独立的数据整合为大型、集中化管理的数据中心,以便于对不同主机和应用服务器进行访问的技术。
RPC =Remote ProcedureCall: 远程过程调用
XDR =eXtern DataRepresentation: RPC 传递数据的格式
CLI=Command LineInterface 控制台
argp=Argument Parser
UUID=University UnqiueIdentifier
SVC =service
CLNT =client
MGMT=management
cbks = Call Backs
ctx = context
lk = lock
attr = attribute
txn = transaction
rb = replace brick
worm = write once , readmany
2 GlusterFS搭建部署
GlusterFS的搭建部署
- 四台服务器,每两台服务器组成一个集群;
- 两个集群通过加密方式进行数据传输
- 两个集群之间进行集群间同步备份【模拟异地同步备份】
- 在两个集群里面,实现:分布式卷、复制卷、分布式复制卷、冷热分级存储
10.10.5.198 el6client.ngaa.com.cn el6client
10.10.5.201 gluster1.ngaa.com.cn gluster1
10.10.5.202 gluster2.ngaa.com.cn gluster2
10.10.5.203 gluster3.ngaa.com.cn gluster3
10.10.5.204 gluster4.ngaa.com.cn gluster4
四台CentOS7,一台CentOS6;所有主机关闭防火墙,SElinux【简单暴力】
systemctl stop firewalld
systemctl disable firewalld
sed -i ‘s/^SELINUX=.*/SELINUX=disabled/g’ /etc/selinux/config
reboot
修改hosts文件,能够互相解析;也可以通过ip地址进行通信,或者做好域名的解析;
四台CentOS7:
yum install centos-release-gluster -y
yum install -y glusterfs glusterfs-server glusterfs-fuse glusterfs-geo-replication
systemctl start glusterd
systemctl enable glusterd
小技巧:大家可以装上bash-completion,这个命令可以把参数进行深度补全
yum -y install bash-completion
然后重新登录一下终端;
在centos6上:
yum install glusterfs-fuse -y
Glusterfs的配置使用,先把集群做好,gluster1和gluster2做一个存储集群,gluster3和gluster4做一个存储集群;
在gluster1上面执行:gluster peer probe gluster2
在gluster3上面执行:gluster peer probe gluster4
上面两条命令把两个存储集群做好了;gluster1和gluster2构成的集群我们称做主集群;gluster3和gluster4构成的集群我们称做从集群;
我们在主集群上面做:datavol做分布式存储卷,tiervol做冷热点分级存储
在从集群上面做:safevol做datavol的数据备份;optvol,做数据镜像
datavol:做分布式存储卷【2X2G的brick】
tiervol:做分布式存储冷热点分级存储【4X2G的brick】
safevol:做复制卷【2X4G的brick】
optvol:做复制卷,并做数据镜像备份【2X4G的brick】
这里使用每台设备的独立的磁盘来做一个卷池,我们使用瘦模式即可;我们每个卷大小设置为2G;
pvcreate /dev/sdb
vgcreate vg_bricks /dev/sdb
lvcreate -L 20000M -T vg_bricks/brickspool
lvcreate -V 2G -T vg_bricks/brickspool -n data
lvcreate -V 2G -T vg_bricks/brickspool -n tierslow
lvcreate -V 2G -T vg_bricks/brickspool -n tierfast
mkfs.xfs /dev/vg_bricks/data
mkfs.xfs /dev/vg_bricks/tierslow
mkfs.xfs /dev/vg_bricks/tierfast
mkdir /storage/{data,tierslow,tierfast} -p
echo “/dev/vg_bricks/data /storage/data xfs defaults 0 0″ >> /etc/fstab
echo “/dev/vg_bricks/tierslow /storage/tierslow xfs defaults 0 0″ >> /etc/fstab
echo “/dev/vg_bricks/tierfast /storage/tierfast xfs defaults 0 0″ >> /etc/fstab
mount -a
pvcreate /dev/sdb
vgcreate vg_bricks /dev/sdb
lvcreate -L 20000M -T vg_bricks/brickspool
lvcreate -V 2G -T vg_bricks/brickspool -n data
lvcreate -V 2G -T vg_bricks/brickspool -n tierslow
lvcreate -V 2G -T vg_bricks/brickspool -n tierfast
mkfs.xfs /dev/vg_bricks/data
mkfs.xfs /dev/vg_bricks/tierslow
mkfs.xfs /dev/vg_bricks/tierfast
mkdir /storage/{data,tierslow,tierfast} -p
echo “/dev/vg_bricks/data /storage/data xfs defaults 0 0″ >> /etc/fstab
echo “/dev/vg_bricks/tierslow /storage/tierslow xfs defaults 0 0″ >> /etc/fstab
echo “/dev/vg_bricks/tierfast /storage/tierfast xfs defaults 0 0″ >> /etc/fstab
mount -a
pvcreate /dev/sdb
vgcreate vg_bricks /dev/sdb
lvcreate -L 20000M -T vg_bricks/brickspool
lvcreate -V 4G -T vg_bricks/brickspool -n safe
lvcreate -V 4G -T vg_bricks/brickspool -n opt
mkfs.xfs /dev/vg_bricks/safe
mkfs.xfs /dev/vg_bricks/opt
mkdir /storage/{safe,opt} -p
echo “/dev/vg_bricks/safe /storage/safe xfs defaults 0 0″ >> /etc/fstab
echo “/dev/vg_bricks/opt /storage/opt xfs defaults 0 0″ >> /etc/fstab
mount -a
pvcreate /dev/sdb
vgcreate vg_bricks /dev/sdb
lvcreate -L 20000M -T vg_bricks/brickspool
lvcreate -V 4G -T vg_bricks/brickspool -n safe
lvcreate -V 4G -T vg_bricks/brickspool -n opt
mkfs.xfs /dev/vg_bricks/safe
mkfs.xfs /dev/vg_bricks/opt
mkdir /storage/{safe,opt} -p
echo “/dev/vg_bricks/safe /storage/safe xfs defaults 0 0″ >> /etc/fstab
echo “/dev/vg_bricks/opt /storage/opt xfs defaults 0 0″ >> /etc/fstab
mount -a
集群1上做分布式卷,卷名称datavol
gluster volume create datavol gluster1:/storage/data/datavol_n1 gluster2:/storage/data/datavol_n2
gluster volume start datavol
集群2上做复制卷,卷名称safevol
gluster volume create safevol replica 2 gluster3:/storage/safe/safevol_n3 gluster4:/storage/safe/safevol_n4
gluster volume start safevol
在集群2上面建复制卷,卷名称为:optvol,并建快照备份计划任务,每天凌晨4点进行一次备份,备份内容留存最近备份的50份快照数据;
gluster volume set all cluster.enable-shared-storage enable
snap_scheduler.py init
snap_scheduler.py enable
snap_scheduler.py add snapvol-optvol “0 4 * * *” optvol
gluster snapshot config optvol snap-max-hard-limit 50
然后手动先创建一个备份:snapshot-optvol-default
gluster snapshot create snapshot-optvol-default optvol no-timestamp
查看快照列表:
[root@gluster3 ~]# gluster snapshot list
snapshot-optvol-default
创建一个卷tiervol使用比较老的盘【假设】,然后再增加比较快的盘做热点盘;
gluster volume create tiervol gluster1:/storage/tierslow/tierslowvol_n1 gluster2:/storage/tierslow/tierslowvol_n2
gluster volume start tiervol
gluster volume tier tiervol attach gluster1:/storage/tierfast/tierfastvol_n1 gluster2:/storage/tierfast/tierfastvol_n2
查看状态:
在el6client上,客户端挂载gluster存储:
datavol为glusterfs方式目录为:/storage/data
tiervol为nfs方式,目录为:/storage/tier
safevol为nfs方式,目录为:/storage/safe
optvol为glusterfs方式,目录为:/storage/opt
mkdir /storage-{data,safe,tier,opt} -p
yum install glusterfs-fuse -y
echo “gluster1:/datavol /storage-data glusterfs defaults,_netdev,acl 0 0″ >> /etc/fstab
echo “gluster1:/tiervol /storage-tier glusterfs defaults,_netdev,acl 0 0″ >> /etc/fstab
echo “gluster3:/optvol /storage-opt glusterfs defaults,_netdev,acl 0 0″ >> /etc/fstab
echo “gluster3:/safevol /storage-safe glusterfs defaults,_netdev,acl 0 0″ >> /etc/fstab
mount -a
把集群1的datavol的数据备份到集群2的safevol上,为了安全在safevol上面使用非root用户georep同步,georep用户属于repgrp组,日志记录允许repgrp组写日志;
在gluster3和gluster4上做配置:
groupadd repgrp
useradd georep -g repgrp
echo ngaa.com.cn | passwd –stdin georep
在gluster1上做配置:
ssh-keygen -f .ssh/id_rsa -N ”
ssh-copy-id georep@gluster3
ssh-copy-id georep@gluster4
这样就可以从gluster1免密钥登录gluster3和gluster4的georep账号了;
在gluster3和gluster4上配置:
mkdir -m 0711 /var/mountbroker-root
gluster system:: execute mountbroker opt mountbroker-root /var/mountbroker-root
gluster system:: execute mountbroker user georep safevol
gluster system:: execute mountbroker opt geo-replication-log-group repgrp
gluster system:: execute mountbroker opt rpc-auth-allow-insecure on
systemctl restart glusterd
在gluster1上配置:
gluster volume set all cluster.enable-shared-storage enable
gluster system:: execute gsec_create
gluster volume geo-replication datavol georep@gluster3::safevol create push-pem
在gluster3上使用密钥:
/usr/libexec/glusterfs/set_geo_rep_pem_keys.sh georep datavol safevol
在gluster1上启用同步并查看:
gluster volume geo-replication datavol georep@gluster3::safevol config use_meta_volume true
gluster volume geo-replication datavol georep@gluster3::safevol start
gluster volume geo-replication datavol georep@gluster3::safevol status
安全备份卷:safevol的权限控制:在客户/storage-safe目录下建一个persion的目录
这个目录所属权为:root用户admin组;
这个目录允许被:ngaa只读
这个目录允许被:sinocache读写
这个目录不允许被其它任何人访问【root用户和admin组的用户除外】
ngaa和sinocache用户不能访问persion目录外的任何内容
cd storage-opt
mkdir persion
useradd ngaa
setfacl -m u:ngaa:r-x persion
setfacl -m d:u:ngaa:r-x persion
useradd sinocache
setfacl -m u:sinocache:rwx persion
setfacl -m d:u:sinocache:rwx persion
chmod o-rwx persion
生产卷:optvol的容量控制
在客户端/storage-opt目录下创建vmdir,限制磁盘限额使用空间为:500M
在客户端执行:
mkdir /storage-opt/vmdir
在gluster3执行:
gluster volume quota optvol enable
gluster volume quota optvol limit-usage /vmdir 500MB
然后在客户端就可以看到效果了;
略
略