一、实验背景
Gluster是一个大尺度文件系统,它是各种不同的存储服务器之上的组合,这些服务器由以太网或无限带宽技术Infiniband以及远程直接内存访问RDMA互相融汇,最终所形成的一个大的并行文件系统网络,包括云计算在内的多重应用,诸如:生物医药科学,文档存储。
glusterFS是一个开源的分布式文件系统,于2011年被红帽收购.它具有高扩展性、高性能、高可用性、可横向扩展的弹性特点,无元数据服务器设计使glusterFS没有单点故障隐患。gluster是由GNU托管的自由软件,证书是AGPL,Gluster公司是Gluster的首要商业赞助商,且提供商业产品以及基于Gluster的解决方案。
Gluster是Client/Server架构,服务器典型的布置在存储砖上,每一台服务器运行一个名为glusterfsd 的守护进程,将本地文件系统作为卷进行输出。
Gluster的客户端进程通过TCP/IP,InfiniBand或SDP一类客户协议连接到服务器,将远端卷组成一个大的所谓折叠式翻译器,最终的卷通过一种叫做FUSE的用户空间文件机制机载到客户机。有大量文件应用的I/O同样可以用libglusterfs 客户端库来直接连接服务器并内在的运行翻译器,而无需经过文件系统以及FUSE.大多数GlusterFS功能被实现为翻译器,包括了:
二、实验环境
操作系统:CentOS7.5 Mininmal
三、设置selinux和防火墙
在gfs01 gfs02 gfs03服务器上
关闭selinux
# setenforce 0
# sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config
开放相关服务端口
# systemctl start firewalld.service
# systemctl enable firewalld.service
# firewall-cmd --zone=public --add-port=24007-24008/tcp --permanent
# firewall-cmd --zone=public --add-port=24009/tcp --permanent
# firewall-cmd --zone=public --add-service=nfs --add-service=samba --add-service=samba-client --permanent
# firewall-cmd --zone=public --add-port=111/tcp --add-port=139/tcp --add-port=445/tcp --add-port=965/tcp --add-port=2049/tcp --add-port=38465-38469/tcp --add-port=631/tcp --add-port=111/udp --add-port=963/udp --add-port=49152-49251/tcp --permanent
# firewall-cmd --reload
四、安装glusterFS 服务端
在gfs01 gfs02 gfs03服务器上
设置host解析
# vim /etc/hosts
####################################
192.168.1.101 gfs01
192.168.1.103 gfs02
192.168.1.104 gfs03
#####################################
# ping gfs01
# ping gfs02
# ping gfs03
格式化挂载数据盘
# mkdir -p /opt/glusterfs
# mkfs.xfs -i size=512 /dev/sdb
# echo '/dev/sdb /opt/glusterfs xfs defaults 1 2' >> /etc/fstab
# mount -a
# lsblk
安装软件包
# yum -y install epel-release
# yum -y install centos-release-gluster
# rpm -ql centos-release-gluster
# cat /etc/yum.repos.d/CentOS-Gluster-6.repo
# yum list available --disablerepo="*" --enablerepo="centos-gluster6"
# yum list available --disablerepo="*" --enablerepo="centos-gluster6" | grep gluster
# yum -y install glusterfs glusterfs-server glusterfs-rdma
# rpm -ql glusterfs-server | grep "/etc"
# rpm -ql glusterfs-server | grep "/usr/lib/systemd"
# rpm -qc glusterfs-server
启动glusterFS服务
# systemctl start glusterd.service
# systemctl enable glusterd.service
# systemctl status glusterd.service
# systemctl status rpcbind
# cat /usr/lib/systemd/system/glusterd.service
在gfs01节点上,将gfs02 gfs03 两个节点加入到gluster集群
# gluster peer probe gfs01
# gluster peer probe gfs02
# gluster peer probe gfs02
分别在gfs01、gfs02、gfs03 查看集群peer状态
# gluster peer status
在gfs01、gfs02、gfs03 节点上,创建数据目录
# mkdir -p /opt/glusterfs/data
# gluster volume info
在gfs01节点上,创建GlusterFS磁盘
# gluster volume create models replica 3 gfs01:/opt/glusterfs/data gfs02:/opt/glusterfs/data gfs03:/opt/glusterfs/data force
注:replica 3 表明存储3个备份,后面指定服务器的存储目录
# gluster volume start models
在gfs01 gfs02 gfs03 节点上,查看volume状态
# gluster volume info
# ll /var/log/glusterfs
五、GlusterFS集群模式说明
GlusterFS分布式存储集群的模式只数据在集群中的存放结构,类似于磁盘阵列中的级别。
a)分布式卷(Distributed Volume),默认模式,DHT
又称哈希卷,近似于RAID0,文件没有分片,文件根据hash算法写入各个节点的硬盘上,优点是容量大,缺点是没冗余。
# gluster volume create test-volume server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
b)复制卷(Replicated Volume),复制模式,AFR
相当于raid1,复制的份数,决定集群的大小,通常与分布式卷或者条带卷组合使用,解决前两种存储卷的冗余缺陷。缺点是磁盘利用率低。复本卷在创建时可指定复本的数量,通常为2或者3,复本在存储时会在卷的不同brick上,因此有几个复本就必须提供至少多个brick,当其中一台服务器失效后,可以从另一台服务器读取数据,因此复制GlusterFS卷提高了数据可靠性的同事,还提供了数据冗余的功能。
# gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2
避免脑裂,加入仲裁:
# gluster volume create replica 3 arbiter 1 host1:brick1 host2:brick2 host3:brick3
c)分布式复制卷(Distributed Replicated Volume),最少需要4台服务器。
# gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
d)条带卷(Striped Volume)
相当于raid0,文件是分片均匀写在各个节点的硬盘上的,优点是分布式读写,性能整体较好。缺点是没冗余,分片随机读写可能会导致硬盘IOPS饱和。
# gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2
e)分布式条带卷(Distributed Striped Volume),最少需要4台服务器。
当单个文件的体型十分巨大,客户端数量更多时,条带卷已经无法满足需求,此时将分布式与条带化结合起来是一个比较好的选择。其性能与服务器数量有关。
# gluster volume create test-volume stripe 4 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8
六、glusterFS的性能调优
在gfs01服务器
开启 指定 volume 的配额: (models 为 volume 名称)
# gluster volume quota models enable
限制 models 中 / (既总目录) 最大使用 80GB 空间
# gluster volume quota models limit-usage / 99GB
设置 cache 大小(此处要根据实际情况,如果设置太大可能导致后面客户端挂载失败)
# gluster volume set models performance.cache-size 512MB
开启 异步,后台操作
# gluster volume set models performance.flush-behind on
设置 io 线程 32
# gluster volume set models performance.io-thread-count 32
设置 回写 (写数据时间,先写入缓存内,再写入硬盘)
# gluster volume set models performance.write-behind on
调优之后的volume信息
# gluster volume info
# gluster volume list
# gluster volume status models
七、安装配置glusterFS客户端
设置host解析
# vim /etc/hosts
####################################
192.168.1.101 gfs01
192.168.1.103 gfs02
192.168.1.104 gfs03
#####################################
# ping gfs01
# ping gfs02
# ping gfs03
挂载方式一:使用 glusterfs-fuse
安装客户端glusterfs-fuse软件包
# yum -y install epel-release
# yum -y install centos-release-gluster
# yum -y install glusterfs glusterfs-fuse
建立挂载点,挂载glusterFS
# mkdir -p /opt/gfsmount
# mount -t glusterfs gfs01:models /opt/gfsmount
或者直接用IP挂载
# mount -t glusterfs 192.168.1.101:/models /opt/gfsmount
# tail -f /var/log/glusterfs/opt-gfsmount.log
# df -hT
FUSE客户端允许使用GlusterFS循环式连接,使用一个节点的名称,内部机制允许该节点发生故障,并且客户端将转移到受信任存储池中的其他连接节点。
客户端测试文件写入
# time dd if=/dev/zero of=/opt/gfsmount/test bs=1024M count=1
# df -hT
设置客户端的开机挂载
选择1:将挂载写入到/etc/fstab 下
# echo "192.168.1.101:/models /opt/gfsmount glusterfs defaults,_netdev 0 0" >> /etc/fstab
# mount -a
# df -hT
选择2:将挂载服务注册成系统服务
# vim /etc/systemd/system/glusterfs-fuse.service
######################################################
[Unit]
Description=GlusterFS Fuse
After=network-online.target rpcbind.service
Requires=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/mount -t glusterfs 192.168.1.101:/models /opt/gfsmount
ExecStop=/usr/bin/umount -l /opt/gfsmount
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
######################################################
# systemctl daemon-reload
# systemctl start glusterfs-fuse.service
# systemctl enable glusterfs-fuse.service
# systemctl status glusterfs-fuse.service
高可用测试
将gfs01(192.168.1.101)关机,看客户端文件挂载状态
在gfs01(192.168.1.101)节点
# init 0
在gfs02 gfs03节点
# gluster volume status models
在gfsClient节点
# systemctl status glusterfs-fuse.service
# df -hT
虽然我们挂载的是 gfs01节点,当gfs01节点宕机时,客户端挂载不受影响,实现了高可用性!
挂载方式二:使用NFS
# yum -y install nfs-utils rpcbind
# mount -t nfs -o mountproto=tcp,vers=3 gfs01:/models /opt/gfsmount -vvv
或者直接用IP挂载
# mount -t nfs -o mountproto=tcp,vers=3 192.168.1.101:/models /opt/gfsmount -vvv
The gluster NFS server has been disabled by default for GlusterFS-3.8 upstream [1].
This is done to encourage users to use NFS-Ganesha for their NFS needs.If RHGS requires this, it can be enabled downstream.
[1]:https://github.com/gluster/glusterfs/blob/release-3.8/doc/release-notes/3.8.0.md#glusternfs-disabled-by-default
如果要使用NFS挂载,我们需要在glusterfs服务端安装NFS-Ganesha,也就是服务端应该是GlusterFS + NFS-Ganesha的组合。
安装NFS-Ganesha
在gfs01 gfs02 gfs03服务器上
# gluster volume get models nfs.disable
# gluster volume set vol_distributed nfs.disable on
# sysemctl stop nfs-server
# systemctl disable nfs-server
# yum -y install nfs-ganesha nfs-ganesha-gluster --disablerepo="*" --enablerepo="centos-gluster6"
# rpm -ql nfs-ganesha
配置NFS-Ganesha
在gfs01服务器上
# vim /etc/ganesha/ganesha.conf
#####################################################
# create new
NFS_CORE_PARAM {
# possible to mount with NFSv3 to NFSv4 Pseudo path
mount_path_pseudo = true;
# NFS protocol
Protocols = 3,4;
}
EXPORT_DEFAULTS {
# default access mode
Access_Type = RW;
}
EXPORT {
# uniq ID
Export_Id = 101;
# mount path of Gluster Volume
Path = "/models";
FSAL {
# any name
name = GLUSTER;
# hostname or IP address of this Node
hostname="192.168.1.101";
# Gluster volume name
volume="models";
}
# config for root Squash
Squash="No_root_squash";
# NFSv4 Pseudo path
Pseudo="/opt/glusterfs/data";
# allowed security options
SecType = "sys";
}
LOG {
# default log level
Default_Log_Level = WARN;
}
######################################################
在gfs02服务器上
# vim /etc/ganesha/ganesha.conf
#####################################################
# create new
NFS_CORE_PARAM {
# possible to mount with NFSv3 to NFSv4 Pseudo path
mount_path_pseudo = true;
# NFS protocol
Protocols = 3,4;
}
EXPORT_DEFAULTS {
# default access mode
Access_Type = RW;
}
EXPORT {
# uniq ID
Export_Id = 103;
# mount path of Gluster Volume
Path = "/models";
FSAL {
# any name
name = GLUSTER;
# hostname or IP address of this Node
hostname="192.168.1.103";
# Gluster volume name
volume="models";
}
# config for root Squash
Squash="No_root_squash";
# NFSv4 Pseudo path
Pseudo="/opt/glusterfs/data";
# allowed security options
SecType = "sys";
}
LOG {
# default log level
Default_Log_Level = WARN;
}
######################################################
在gfs03服务器上
# vim /etc/ganesha/ganesha.conf
#####################################################
# create new
NFS_CORE_PARAM {
# possible to mount with NFSv3 to NFSv4 Pseudo path
mount_path_pseudo = true;
# NFS protocol
Protocols = 3,4;
}
EXPORT_DEFAULTS {
# default access mode
Access_Type = RW;
}
EXPORT {
# uniq ID
Export_Id = 104;
# mount path of Gluster Volume
Path = "/models";
FSAL {
# any name
name = GLUSTER;
# hostname or IP address of this Node
hostname="192.168.1.104";
# Gluster volume name
volume="models";
}
# config for root Squash
Squash="No_root_squash";
# NFSv4 Pseudo path
Pseudo="/opt/glusterfs/data";
# allowed security options
SecType = "sys";
}
LOG {
# default log level
Default_Log_Level = WARN;
}
#####################################################
在gfs01 gfs02 gfs03服务器上
# showmount -e localhost
在gfsClient服务器上
# mount -t nfs gfs01:/opt/glusterfs/data /opt/gfsmount -vvv
或者直接用IP挂载
# mount -t nfs 192.168.1.101:/opt/glusterfs/data /opt/gfsmount -vvv
设置客户端的开机挂载
选择1:将挂载写入到/etc/fstab 下
# echo "192.168.1.101:/opt/glusterfs/data /opt/gfsmount nfs defaults,_netdev,mountproto=tcp 0 0" >> /etc/fstab
# mount -a
# df -hT
# mount -l | grep "/opt/glusterfs/data"
选择2:将挂载服务注册成系统服务
# vim /etc/systemd/system/glusterfs-nfs.service
######################################################
[Unit]
Description=GlusterFS NFS
After=network-online.target rpcbind.service
Requires=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/mount -t nfs 192.168.1.101:/opt/glusterfs/data /opt/gfsmount
ExecStop=/usr/bin/umount -l /opt/gfsmount
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
######################################################
# systemctl daemon-reload
# systemctl start glusterfs-nfs.service
# systemctl enable glusterfs-nfs.service
# systemctl status glusterfs-nfs.service
# mount -l | grep "/opt/glusterfs/data"
# df -hT
高可用测试
将gfs01(192.168.1.101)关机,看客户端文件挂载状态
在gfs01(192.168.1.101)节点
# init 0
在gfs02 gfs03节点
# gluster volume status models
在gfsClient节点
# systemctl status glusterfs-nfs.service
# df -hT
挂载的是 gfs01节点,当gfs01节点宕机时,客户端hang住了,存在使用的单点故障,需要手动切换挂载源!
关于使用FUSE和NFS的选择
NFS使用标准文件系统缓存,Native GlusterFS使用应用程序空间RAM,并且是必须定义的硬件编号。
FUSE客户端允许使用GlusterFS循环式连接, 在/ etc / fstab中使用一个节点的名称;,但是内部机制允许该节点发生故障,并且客户端将转移到受信任存储池中的其他连接节点。 性能比基于测试的NFS方法略慢,但不是那么大。 增益是自动HA客户端故障转移,这通常值得对性能产生影响。
总而言之,这取决于应用要求, 当系统上有足够的RAM并且性能不是很重要时,FUSE似乎是更好的选择。
八、参考
Installing GlusterFS - a Quick Start Guide
https://docs.gluster.org/en/latest/Quick-Start-Guide/Quickstart
Getting started with GlusterFS
https://gluster.readthedocs.io/en/latest/Administrator%20Guide/NFS-Ganesha%20GlusterFS%20Intergration
GlusterFS安装
https://www.rainbond.com/docs/v5.0/operation-manual/storage/GlusterFS/install.html
CentOS 7 上的 GlusterFS 存储群集
https://wiki.centos.org/zh/HowTos/GlusterFSonCentOS
分布式存储系统GlusterFS安装配置
https://blog.51cto.com/navyaijm/1258250
CentOS 7 安装 GlusterFS
https://www.cnblogs.com/jicki/p/5801712.html
CentOS7 安装GlusterFS
https://blog.csdn.net/wh211212/article/details/79412081
gluster/gluster-ansible
https://github.com/gluster/gluster-ansible
安装GlusterFS-一个快速开始指南
https://github.com/Broadroad/Glusterfs-cn/blob/master/%E5%AE%89%E8%A3%85GlusterFS-%E4%B8%80%E4%B8%AA%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%E6%8C%87%E5%8D%97.md
深入理解GlusterFS之数据均衡
https://blog.csdn.net/younger_china/article/details/85211186
谈谈GlusterFS的问题和不足,加深对GlusterFS系统的理解
https://blog.csdn.net/liuaigui/article/details/20941159
分布式文件系统
https://www.cnblogs.com/kevingrace/p/8709544.html
CentOS 7.x 下GlusterFS分布式存储集群环境部署
https://www.cnblogs.com/kevingrace/p/8743812.html
用户空间文件系统 Filesystem in Userspace
https://zh.wikipedia.org/wiki/FUSE
分布式存储GlusterFS实战,GlusterFS快速入门及概述
https://chegva.com/1745.html
https://mrlichangming.github.io/2018/10/27/GlusterFS%E4%BD%BF%E7%94%A8%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E5%91%BD%E4%BB%A4%E7%A7%AF%E7%B4%AF
gluster文档
https://github.com/maqingqing/TStor/wiki/%E6%96%87%E6%A1%A301%EF%BC%9Agluster%E7%9A%84%E8%BF%9B%E7%A8%8B%E4%B8%8E%E6%9C%AF%E8%AF%AD
How to Setup GlusterFS Storage on CentOS 7 / RHEL 7
https://www.linuxtechi.com/setup-glusterfs-storage-on-centos-7-rhel-7
Using NFS to Mount Red Hat Storage Volumes
https://access.redhat.com/documentation/en-US/Red_Hat_Storage/2.0/html/Administration_Guide/sect-Administration_Guide-GlusterFS_Client-NFS.html
Using NFS to Mount Volumes
https://gluster-documentations.readthedocs.io/en/latest/Administrator%20Guide/Setting%20Up%20Clients
Accessing Data - Setting Up GlusterFS Client
https://docs.gluster.org/en/latest/Administrator%20Guide/Setting%20Up%20Clients
Should I mount GlusterFS as NFS or FUSE?
https://serverfault.com/questions/796036/should-i-mount-glusterfs-as-nfs-or-fuse
gluster-set-auth.sh
https://gist.github.com/imamdigmi/fc5f2177b4124052006bdf5a11934b56
Get started with GlusterFS - considerations and installation
https://support.rackspace.com/how-to/getting-started-with-glusterfs-considerations-and-installation
GlusterFS 5 : GlusterFS + NFS-Ganesha
https://www.server-world.info/en/note?os=CentOS_7&p=glusterfs5&f=8
Configuring NFS-Ganesha over GlusterFS
https://docs.gluster.org/en/v3/Administrator%20Guide/NFS-Ganesha%20GlusterFS%20Integration
ganesha-config man page
https://www.mankier.com/8/ganesha-config