GlusterFS原理及配置
GlusterFS简介
概述
Glusterfs是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端.在传统的解决 方案中Glusterfs能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储
Glusterfs通过TCP/IP或InfiniBand RDMA网络链接将客户端的存储资块源聚集在一起,使用单一的全局命名空间来管理数据,磁盘和内存资源
Glusterfs基于堆叠的用户空间设计,可以为不同的工作负载提供高优的性能
特点
扩展性和高性能
GlusterFS利用双重特性来提供几TB至数PB的高扩展存储解决方案。Scale-Out架构允许通过简单地增加资源来提高存储容量和性能,磁盘、计算和I/O资源都可以独立增加,支持10GbE和InfiniBand等高速网络互联。Gluster弹性哈希(Elastic Hash)解除了GlusterFS对元数据服务器的需求,消除了单点故障和性能瓶颈,真正实现了并行化数据访问。
高可用性
GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。自我修复功能能够把数据恢复到正确的状态,而且修复是以增量的方式在后台执行,几乎不会产生性能负载。GlusterFS没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、ZFS)来存储文件,因此数据可以使用各种标准工具进行复制和访问。
全局统一命名空间
全局统一命名空间将磁盘和内存资源聚集成一个单一的虚拟存储池,对上层用户和应用屏蔽了底层的物理硬件。存储资源可以根据需要在虚拟存储池中进行弹性扩展,比如扩容或收缩。当存储虚拟机映像时,存储的虚拟映像文件没有数量限制,成千虚拟机均通过单一挂载点进行数据共享。虚拟机I/O可在命名空间内的所有服务器上自动进行负载均衡,消除了SAN环境中经常发生的访问热点和性能瓶颈问题。
弹性卷管理
数据储存在逻辑卷中,逻辑卷可以从虚拟化的物理存储池进行独立逻辑划分而得到。存储服务器可以在线进行增加和移除,不会导致应用中断。逻辑卷可以在所有配置服务器中增长和缩减,可以在不同服务器迁移进行容量均衡,或者增加和移除系统,这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用,从而可以适应工作负载条件变化或在线性能调优。
基于标准协议
Gluster存储服务支持NFS, CIFS, HTTP, FTP以及Gluster原生协议,完全与POSIX标准兼容。现有应用程序不需要作任何修改或使用专用API,就可以对Gluster中的数据进行访问。这在公有云环境中部署Gluster时非常有用,Gluster对云服务提供商专用API进行抽象,然后提供标准POSIX接口。
相关术语
Brick:
GFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如’SERVER:EXPORT’
Volume:
一组bricks的逻辑集合(卷)
FUSE:
Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。
VFS:
虚拟文件系统
Glusterd:
Gluster management daemon,要在trusted storage pool中所有的服务器上运行。
Node:
一个拥有若干brick的设备
Client:
挂载了GFS卷的设备
RDMA:
远程直接内存访问,支持不通过双方的OS进行直接内存访问。
RRDNS:
round robin DNS是一种通过DNS轮转返回不同的设备以进行负载均衡的方法
Self-heal:
用于后台运行检测复本卷中文件和目录的不一致性并解决这些不一致。
Split-brain:
脑裂
Volfile:
glusterfs进程的配置文件,通常位于/var/lib/glusterd/vols/volname
模块化堆栈式架构
模块化、堆栈式的架构。
通过对模块的组合,实现复杂的功能。
GlusterFS采用模块化、堆栈式的架构,可通过灵活的配置支持高度定制化的应用环境,比如大文件存储、海量小文件存储、云存储、多传输协议应用等。每个功能以模块形式实现,然后以积木方式进行简单的组合,即可实现复杂的功能。比如,Replicate模块可实现RAID1,Stripe模块可实现RAID0,通过两者的组合可实现RAID10和RAID01,同时获得高性能和高可靠性。
GlusterFS工作原理
弹性hash算法
通过hash算法得到一个32位的整数
划分为N个连续的子空间,每个空间对应一个Brick
弹性hash算法的优点
保证数据平均分布在每一个Brick中
解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈
工作流程
客户端或应用程序通过GlusterFS的挂载点访问数据,对于用户来说,集群系统的存在对用户是完全透明的,用户感觉不到是操作本地系统还是远端的集群系统。
用户的这个操作被递交给 本地linux系统的VFS来处理。
VFS将数据递交给FUSE内核文件系统, fuse文件系统则是将数据通过/dev/fuse设备文件递交给了GlusterFS client端,所以, 我们可以将 fuse文件系统理解为一个代理。
GlusterFS client 收到数据后,client根据配置文件的配置对数据进行处理。
通过网络将数据传递至远端的GlusterFS Server,并且将数据写入到服务器存储设备上。
GlusterFS的卷类型
分布式卷
没有对文件进行分块处理
通过扩展文件属性保存hash值
支持的底层文件系统有ext4、zfs、xfs等
特点
文件分布在不同的服务器,不具备冗余性
可以灵活的扩展卷的大小
单点故障会造成数据丢失
依赖底层的数据保护
创建分布式卷
创建一个名为dis-vol的分布式卷,文件将根据hash分布在node1:/data/sdb node2:/data/sdb中
gluster volume create dis-vol node1:/data/sdb node2:/data/sdb force
条带卷
根据偏移量将文件分成N块(N个条带节点),轮询的存储在每个Brick Server节点
存储大文件时,性能尤为突出
不具备冗余性,类似Raid0
特点
数据被分割成更小块分布到块服务器中的不同条带区
分布减少了负载且更小的文件加速了存取的速度
没有数据冗余
创建条带卷
创建了一个名为stripe-vol的条带卷,文件将被分块轮询的存储在node1:/data/sdc node2:/data/sdc中
gluster volume create stripe-vol stripe 2 transport tcp node1:/data/sdc node2:/data/sdc
(transport不指明时默认是RDMA)
复制卷
同一个文件保存一份或多份副本
因为要保存副本,所以磁盘利用率较低
若多个节点上的存储空间不一致,将按照木桶效应取最低节点的容量作为该卷的总容量
特点
卷中所有的服务器均保存一个完整的副本
卷的副本数量可由客户创建的时候决定
至少有两个块服务器或更多服务器
具备冗余性
创建复制卷
创建名为rep-vol的复制卷,文件将同时存储两个副本,分别在node3:/data/sdb node4:/data/sdb两个Brick中
gluster volume create rep-vol replica 2 node3:/data/sdb node4:/data/sdb force
分布式条带卷
兼顾分布式卷和条带卷的功能
主要用于大文件访问处理
最少需要4台服务器
创建分布式条带卷
创建了名为dis-stripe的分布式条带卷,配置分布式的条带卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)
gluster volume create dis-stripe stripe 2 node1:/data/sdd node2:/data/sdd node3:/data/sdd node4:/data/sdd force
分布式复制卷
兼顾分布式卷和复制卷的功能
用于需要冗余的情况
创建分布式复制卷
创建名为dis-rep的分布式条带卷,配置分布式复制卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)
gluster volume create dis-rep replica 2 node1:/data/sde node2:/data/sde node3:/data/sde node4:/data/sde force
GlusterFS部署
环境
机名 | IP |
---|---|
node1 | 192.168.1.10 |
node2 | 192.168.1.20 |
node3 | 192.168.1.30 |
node4 | 192.168.1.40 |
client | 192.168.1.50 |
过程
关闭所有的防火墙
在4台node上每台添加4个20G的磁盘,之后重启,分区,并挂载
vi /opt/fdisk.sh
#!/bin/bash
NEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq`
for VAR in $NEWDEV
do
echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$VAR &> /dev/null
mkfs.xfs /dev/${VAR}"1" &> /dev/null
mkdir -p /data/${VAR}"1" &> /dev/null
echo "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0" >> /etc/fstab
done
mount -a &> /dev/null
sh /opt/fdisk.sh
服务器及客户端添加映射,用输入到所有会话,之前有提过
vi /etc/hosts #添加
192.168.1.10 node1
192.168.1.20 node2
192.168.1.30 node3
198.168.1.40 node4
在4台服务器上添加gfsrepo压缩包,解压并编写yum
unzip gfsrepo.zip
cd /etc/yum.repos.d/
vi gfs.repo
[gfs]
name=gfs
baseurl=file:///root/gfsrepo
gpgcheck=0
enabled=1
yum clean all
yum makecache
yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
#glusterfs:软件 glusterfs-server:服务 glusterfs-fuse:文件系统 glusterfs-rdma:rdma协议
设置时间同步
ntpdate ntp1.aliyum.com
crontab -e
*/30 * * * * /usr/sbin/ntpdate.ntp1.aliyun.com
开启服务,并查看状态
systemctl start glusterd.service
systemctl enable glusterd.service
systemctl status glusterd.service
在node1上配置信任
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4
gluster peer status
卷类型
卷名称 | 卷类型 | Brick |
---|---|---|
dis-volume | 分布式卷 | node1(/data/sdb1)、node2(/data/sdb1) |
stripe-volume | 条带卷 | node1(/data/sdc1)、node2(/data/sdc1)) |
rep-volume | 复制卷 | node3(/data/sdb1)、node4(/data/sdb1) |
dis-stripe | 分布式条带卷 | node1(/data/sdd1)、node2(/data/sdd1)、node3(/data/sdd1)、node4(/data/sdd1) |
dis-rep | 分布式复制卷 | node1(/data/sde1)、node2(/data/sde1)、node3(/data/sde1)、node4(/data/sde1) |
创建分布式卷
gluster volume create dis-vol node1:/b1 node2:/b1 force
gluster volume start dis-volume #开启分布式卷
gluster volume info dis-volume #查看状态信息
gluster volume status dis-volume #查看状态信息
创建条带卷
gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force
gluster volume start stripe-volume
gluster volume info stripe-volume
gluster volume status stripe-volume
创建复制卷
gluster volume create rep-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force
gluster volume start rep-volume
gluster volume info rep-volume
创建分布式条带卷
gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
gluster volume start dis-stripe
gluster volume info dis-stripe
创建分布式复制卷
gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
gluster volume start dis-rep
volume start: dis-rep: success
gluster volume info dis-rep
查看创建的卷的列表
gluster volume list
客户机
和之前同样的步骤,上传gfsrepo安装包
yum -y install glusterfs glusterfs-fuse
创建添加挂载点
mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
mount.glusterfs node1:dis-volume /test/dis
mount.glusterfs node1:stripe-volume /test/stripe
mount.glusterfs node1:rep-volume /test/rep
mount.glusterfs node1:dis-stripe /test/dis_stripe
mount.glusterfs node1:dis-rep /test/dis_rep
df -Th
测试 Gluster 文件系统
cd /opt
dd if=/dev/zero of=/opt/demo1.log bs=1M count=40
dd if=/dev/zero of=/opt/demo2.log bs=1M count=40
dd if=/dev/zero of=/opt/demo3.log bs=1M count=40
dd if=/dev/zero of=/opt/demo4.log bs=1M count=40
dd if=/dev/zero of=/opt/demo5.log bs=1M count=40
复制5个文件到不同卷上
cp /demo* /test/dis
cp /demo* /test/stripe/
cp /demo* /test/rep/
cp /demo* /test/dis_stripe/
cp /demo* /test/dis_rep/
查看分布式卷
cd /data/sdb1
ll
其余卷可在各个node上查看。
破坏测试
挂起 node2 节点
再挂起 node4 节点
总结,凡是带复制数据,相比而言,数据比较安全,条带卷数据全部丢失,分布式卷丢失一部分。
GlusterFS常用命令
启动/关闭/查看glusterd服务
/etc/init.d/glusterd start
/etc/init.d/glusterd stop
/etc/init.d/glusterd status
开机自动启动glusterd服务
chkconfig glusterd on
为存储池添加/移除服务器节点
在其中一个节点上操作即可:
gluster peer probe <SERVER>
gluster peer detach <SERVER>
注意,移除节点时,需要提前将该节点上的Brick移除。
创建/启动/停止/删除卷
gluster volume create <NEW-VOLNAME>[stripe <COUNT> | replica <COUNT>] [transport [tcp | rdma | tcp,rdma]] <NEW-BRICK1> <NEW-BRICK2> <NEW-BRICK3> <NEW-BRICK4>...
gluster volume start <VOLNAME>
gluster volume stop <VOLNAME>
gluster volume delete <VOLNAME>
注意,删除卷的前提是先停止卷。
客户端以glusterfs方式挂载
mount.glusterfs <SERVER>:/<VOLNAME><MOUNTDIR>
mount -t glusterfs <SERVER>:/<VOLNAME><MOUNTDIR>
查看卷信息
gluster volume list #列出集群中的所有卷
gluster volume info [all] #查看集群中的卷信息
gluster volume status [all] #查看集群中的卷状态
设置卷的访问控制
gluster volume set dis-rep auth.reject 192.168.1.10 #仅拒绝
gluster volume set dis-rep auth.allow 192.168.1.* #仅允许,设置192.168.1.0网段的所有IP地址都能访问dis-rep卷(分布式复制卷)