目录
GlusterFS概述
- GlusterFS简介
- 开源的分布式文件系统
- 由存储服务器、客户端以及NFS/Samba存储网关组成
- Gluster简介
- 开源的分布式文件系统
- 由存储服务器、客户端以及NFS/Samba存储网关组成
- 无元数据服务器
- GlusterFS特点
- 扩展性和高性能
- 高可用性
- 全局统一命名空间
- 弹性卷管理
- 基于标准协议
- GkusterFS术语
- BRICK
- 指可信主机池中由主机提供的用于物理存储的专用分区,是GlusterFS中的基本存储单元,同时也是可信存储池中服务器上对外提供的存储目录。
- Volume
- 一个逻辑卷是一组Brick的集合。卷是数据存储的逻辑设备,类似于LVM中的逻辑卷。大部分Gluster管理操作是在卷上进行的
- FUSE
- 是一个内核模块,允许用户创建自己的文件系统,无须修改内核代码。--伪文件系统
- VFS
- 内核空间对用户空间提供的访问磁盘的接口。--虚拟端口
- Glusterd
- 后台管理进程:在存储集中每个节点上都要运行。
- BRICK
- 模块化堆栈式架构
- 模块化、堆栈式的架构
- 通过对模块的组合,实现复杂的功能
GlusterFS工作管理
- 客户端或应用程序通过GlusterFS的挂载点访问数据。
- linux系统内核通过VFS API收到1请求并处理
- VFS将数据递交给FUSE内核文件系统,并向系统注册一个实际的文件系统FUSE,而FUSE文件系统则是将数据通过/dev/fuse设备文件递交给了GlusterFS client端,可以将FUSE文件系统理解为一个代理。
- Gluster FS client收到数据后,client根据配置文件的配置对数据进行处理
- 经过GlusterFS client处理后,通过网络将数据传递远端的GlusterFS Server,并且将数据写入到服务器存储设置上。
GlusterFS工作流程
- 弹性HASH算法
- 通过HASH算法得到一个32位的整数
- 划分为N个连续的子空间,每个空间对应一个Brick
- 弹性HASH算法的优点
- 保证数据平均分布在每一个Brick中
- 解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈
GlusterFS的卷类型
- 分布式卷(文件通过hash算法分布到所有brick server上,这种卷是glusterfs的基础和最大特点;实只是扩大的磁盘空间,如果有一个磁盘坏了,对应的数据也会丢失,文件级RAID0,不具有容错能力。)
- 条带卷(类似RAID0,文件分成数据块以Round Robin方式分布到brick server上,并发粒度是数据块,支持超大文件,大文件性能高;条带卷,在6的版本以后不在支持)
- 复制卷(文件同步复制到多个brick上,文件级RAID1,具有容错能力,写性能下降,读性能提升)
- 分布式条带卷(brickserver数量是条带的倍数,兼具distrbute和stripe卷的特点)
- 分布式复制卷(brickserver数量是镜像数的倍数,兼具distribute和replica卷的特点,可以在2个或多个节点之间复制数据。)
- 条带复制卷(类似RAID10同时具有条带和复制卷的特点)
- 分布式条带复制卷(三种基本卷的复合卷通常用于类Map Reduce应用)
- 分散卷(是基于ErasureCodes(纠错码)的一种类型的Volume(3.6版本正式发布该特性),类似于RAID5/6--分散卷基于纠错码。存储大文件时,性能尤为突出通过配置Redundancy(冗余)级别提高可靠性,在保证较高的可靠性同时,可以提升物理存储空间的利用率。)
- 分布式分散卷(分布式分卷在分散的子卷上分发文件。分布式分散卷等效于分布式复制卷,但是使用分散子卷而不是复制子卷结合distibuted和dispersed的优点,HA+LB+可扩容,HA+LB+可扩容)
分布式卷
- 没有对文件进行分块处理
- 通过扩展文件属性保存HASH值
- 支持的底层文件系统有EXT3、EXT4、ZFS、XFS等
- 没有分块处理,文件只能存在一个server中,效率不提升
分布式卷的特点
- 文件分布在不同的服务器,不具备冗余性
- 更容易和廉价地扩展卷的大小
- 单点故障会造成数据丢失
- 依赖底层的数据保护
创建分布式卷
- 创建一个名为dis-volume的分布式卷,文件将根据HASH分布在server1:/dir1、server2:/dir2 server3:/dir3
# gluster volume create rep-volume replica 2 transport tcp server:/dir1 server2:/dir2
复制卷
- 同一文件保存一份或多分副本
- 因为要保存副本,所有磁盘利用率较低
- 若多个节点上的存储空间不一致,将按照木桶效应取最低节点的容量作为该卷的总容量
特点
- 卷中所有的服务器均保存一个完整的副本
- 卷的副本数量可由客户创建的时候决定
- 至少右两块Brik
- 具备冗余性
创建复制卷
- 创建名为rep-volume的复制卷,文件将同时存储两个副本,分别在Server1:/dir1和Server2:/dir2两个Brick中
# gluster volume create disp-volume disperse 3 redundancy 1 server1:/exp1 server2:/exp2 server3:/exp3
分散卷
- 是基于ErasureCodes(纠错码)的一种新类型的Volume(3.6版本正式发布该特性),类型于RAID5/6--分散卷基于纠错码。存储大文件时,性能尤为突出
- 通过配置Redundancy(冗余)级别提高可靠性,在保证较高的可靠性同时,可以提升物理存储空间的利用率。
特点
- redundancy(冗余)必须大于0,并且bricks的总数必须大于2*redundancy。
- dispersed卷必须至少包含3个bricks。
- 类似raid5/raid6,可以防止单点故障(HA),提升IO性能(LB)。
创建分散卷
- 创建一个冗余级别为1,(2+1)的三节点分散卷:
# gluster volume create disp-volume disperse 3 redundancy 1 server1:/exp1 server2:/exp2 server3:/exp3
分布式复制卷
- 分布式复制卷
- 兼顾分布式卷和复制卷的功能
- 用于需要冗余的情况
- 创建分布式复制卷
- 创建名为dis-rep的分布式条带卷,配置分布式复制卷时,卷中Brick所包含的存储服务器必须是复制数的倍数(>=2倍)
# gluster volume create dist-rep replica 2 transport server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4
分布式分散卷
- 分布式分散卷
- 分布式分散卷在分散的子卷上分发文件
- 分布式分散卷等效于分布式复制卷,但是使用分散子卷而不是复制子卷
- 结合distibuted和dispersed的优点,HA+LB可扩容,HA+LB+可扩容
- 六节点分布式分散卷,冗余级别为1,2 x (2+1)=6:
# gluster volume create dist-disp disperse 3 redundancy 1 \
server1:/exp1 server2:/exp2 server3:exp3 \
server4:/exp4 server5:/exp5 server6:/exp6
实验案例
给每个服务器添加五块硬盘,为了区分大小五块硬盘可以给不同的数量3.4.5.6.7
操作系统 | IP 地址 | 挂载硬盘 |
CentOS7.9 | 192.168.10.101 | 硬盘:3、4、5、6、7 |
CentOS7.9 | 192.168.10.102 | 硬盘:3、4、5、6、7 |
CentOS7.9 | 192.168.10.103 | 硬盘:3、4、5、6、7 |
CentOS7.9 | 192.168.10.104 | 硬盘:3、4、5、6、7 |
CentOS7.9 | 192.168.10.105 | 硬盘:3、4、5、6、7 |
CentOS7.9 | 192.168.10.106 | 硬盘:3、4、5、6、7 |
添加磁盘
在每个主机添加五块硬盘为node节点添加相应数量和大小的磁盘,设置内存大小,新加硬盘需要重启一下reboot
修改每一个主机的名称
重启所有主机
[root@node1 ~]# reboot
101
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# bash
102
[root@localhost ~]# hostnamectl set-hostname node2
[root@localhost ~]# bash
103
[root@localhost ~]# hostnamectl set-hostname node3
[root@localhost ~]# bash
104
[root@localhost ~]# hostnamectl set-hostname node4
[root@localhost ~]# bash
105
[root@localhost ~]# hostnamectl set-hostname node5
[root@localhost ~]# bash
106
[root@localhost ~]# hostnamectl set-hostname node6
[root@localhost ~]# bash
设置域名解析
同步六台主机设置域名解析,为每块磁盘分区
[root@node1 ~]# vim /etc/hosts
192.168.10.101 node1
192.168.10.102 node2
192.168.10.103 node3
192.168.10.104 node4
192.168.10.105 node5
192.168.10.106 node6
[root@node1 ~]# fdisk /dev/sdb
[root@node1 ~]# fdisk /dev/sdc
[root@node1 ~]# fdisk /dev/sdd
[root@node1 ~]# fdisk /dev/sde
[root@node1 ~]# fdisk /dev/sdf
n #创建新的分区
w #保存
为每个节点格式化分区
[root@node1 ~]# mkfs -t ext4 /dev/sdb1
[root@node1 ~]# mkfs -t ext4 /dev/sdc1
[root@node1 ~]# mkfs -t ext4 /dev/sdd1
[root@node1 ~]# mkfs -t ext4 /dev/sde1
[root@node1 ~]# mkfs -t ext4 /dev/sdf1
创建挂载点
[root@node1 ~]# mkdir /b3
[root@node1 ~]# mkdir /c4
[root@node1 ~]# mkdir /d5
[root@node1 ~]# mkdir /e6
[root@node1 ~]# mkdir /f7
挂载磁盘
[root@node1 ~]# mount /dev/sdb1 /b3
[root@node1 ~]# mount /dev/sdc1 /c4
[root@node1 ~]# mount /dev/sdd1 /d5
[root@node1 ~]# mount /dev/sde1 /e6
[root@node1 ~]# mount /dev/sdf1 /f7
设置永久挂载
[root@node1 ~]# vim /etc/fstab
/dev/sdb1 /b3 ext4 defaults 0 0
/dev/sdc1 /c4 ext4 defaults 0 0
/dev/sdd1 /d5 ext4 defaults 0 0
/dev/sde1 /e6 ext4 defaults 0 0
/dev/sdf1 /f7 ext4 defaults 0 0
关闭防火墙
关闭防火墙设置永久关闭
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# setenforce 0
[root@node1 ~]# systemctl disable firewalld
部署yum仓库
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
[root@node1 ~]# yum repolist #显示当前系统上配置的所有软件仓库以及状态
在所有节点上安装gfs
安装依赖环境
在 CentOS 系统上安装一个软件包,该包添加了 GlusterFS 的 YUM 仓库配置,从而使系统能够从 GlusterFS 仓库中安装和更新 GlusterFS 相关的软件包。
[root@node1 ~]# yum -y install centos-release-gluster
[root@node1 ~]# cd /etc/yum.repos.d/
[root@node1 yum.repos.d]# vim CentOS-Gluster-9.repo
#mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=$releasever&repo=storage-gluster-9
#禁用该命令
baseurl=http://mirrors.aliyun.com/$contentdir/$releasever/storage/$basearch/gluster-9/
#清除仓库原数据
[root@node1 yum.repos.d]# yum clean all
[root@node1 yum.repos.d]# yum repolist #查看状态
允许设置和管理一个分布式存储集群。
[root@node1 yum.repos.d]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
- glusterfs: GlusterFS 的客户端工具。
- glusterfs-server: GlusterFS 的服务器端组件。
- glusterfs-fuse: 使用 FUSE(文件系统用户空间)实现的 GlusterFS 客户端。
- glusterfs-rdma: 用于 RDMA(远程直接内存访问)的 GlusterFS 组件,可以提供更高效的数据传输。
启动所有节点上的GFS
[root@node1 yum.repos.d]# systemctl start glusterd
[root@node1 yum.repos.d]# systemctl enable glusterd
添加节点
取消同步会话在任意一个主机去配置
添加节点来到101主机
[root@node1 ~]# gluster peer probe node1
peer probe: Probe on localhost not needed
[root@node1 ~]# gluster peer probe node2
peer probe: success
[root@node1 ~]# gluster peer probe node3
peer probe: success
[root@node1 ~]# gluster peer probe node4
peer probe: success
[root@node1 ~]# gluster peer probe node5
peer probe: success
[root@node1 ~]# gluster peer probe node6
peer probe: success
在每个节点上查看状态
只能查看到其他节点本节点看不到
[root@node1 ~]# gluster peer status
Number of Peers: 5
Hostname: node2
Uuid: 4622f6bb-dbf4-4830-baf0-14be73870675
State: Peer in Cluster (Connected)
Hostname: node3
Uuid: b5ab5520-8b29-4c1d-9e62-c99ec9e1b744
State: Peer in Cluster (Connected)
Hostname: node4
Uuid: 51b91f2d-98dd-48e0-b49c-2f99345ba7f1
State: Peer in Cluster (Connected)
Hostname: node5
Uuid: 23008c77-c360-4298-a4e9-edfcef9c9f00
State: Peer in Cluster (Connected)
Hostname: node6
Uuid: 3fd4a747-7858-4e20-ab1e-345a9698ad86
State: Peer in Cluster (Connected)
创建卷
创建分布式卷
创建默认的就是分布式卷,创建一个 的 GlusterFS 卷,它将数据分布到 node1 和 node2 节点上,每个节点的 force 选项确保即使在创建过程中出现一些问题或警告,卷也会被强制创建。
[root@node1 ~]# gluster volume create dist-volume node1:/e6 node2:/e6 force
[root@node1 ~]# gluster volume start dist-volume #启动卷
[root@node1 ~]# gluster volume info dist-volume #查看卷的状态跟配置信息
Volume Name: dist-volume
Type: Distribute
Volume ID: 7158d50e-b433-4826-8f9d-ed9b351cd796
Status: Started
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: node1:/e6
Brick2: node2:/e6
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
创建复制卷
[root@node1 ~]# gluster volume create rep-volume replica 2 node3:/d5 node4:/d5 force
[root@node1 ~]# gluster volume start rep-volume
[root@node1 ~]# gluster volume info rep-volume
Volume Name: rep-volume
Type: Replicate
Volume ID: 813d421a-d572-4a4d-89a7-c589b3235041
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node3:/d5
Brick2: node4:/d5
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
分散卷
[root@node1 ~]# gluster volume create disp-volume disperse 3 redundancy 1 node1:/b3 node2:/b3 node3:/b3 force
[root@node1 ~]# gluster volume start disp-volume
[root@node1 ~]# gluster volume info disp-volume
Volume Name: disp-volume
Type: Disperse
Volume ID: 48fcc28b-1c98-4946-b5d8-799c54a8453e
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x (2 + 1) = 3
Transport-type: tcp
Bricks:
Brick1: node1:/b3
Brick2: node2:/b3
Brick3: node3:/b3
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
分布式复制卷
[root@node1 ~]# gluster volume create dist-rep replica 2 node1:/c4 node2:/c4 node3:/c4 node4:/c4 force
[root@node1 ~]# gluster volume start dist-rep
[root@node1 ~]# gluster volume info dist-rep
Volume Name: dist-rep
Type: Distributed-Replicate
Volume ID: 2a8d0c93-4b06-4846-ae66-1ad9dcc65577
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/c4
Brick2: node2:/c4
Brick3: node3:/c4
Brick4: node4:/c4
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
分布式分散卷
[root@node1 ~]# gluster volume create dist-disp disperse 3 redundancy 1 node1:/f7 node2:/f7 node3:/f7 node4:/f7 node5:/f7 node6:/f7 force
[root@node1 ~]# gluster volume start dist-disp
[root@node1 ~]# gluster volume info dist-disp
Volume Name: dist-disp
Type: Distributed-Disperse
Volume ID: 6dc63279-ee96-46cc-aca8-bc5f11892656
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x (2 + 1) = 6
Transport-type: tcp
Bricks:
Brick1: node1:/f7
Brick2: node2:/f7
Brick3: node3:/f7
Brick4: node4:/f7
Brick5: node5:/f7
Brick6: node6:/f7
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
部署GFS客户端
安装客户端软件
随意拿一台主机当客户端
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# setenforce 0
[root@node1 ~]# yum -y install glusterfs glusterfs-fuse
创建挂载目录
[root@node1 ~]# mkdir -p /test/{dist,rep,disp,dist_and_rep,dist_and_disp}
创建hosts文件
[root@node1 ~]# vim /etc/hosts
192.168.10.101 node1
192.168.10.102 node2
192.168.10.103 node3
192.168.10.104 node4
192.168.10.105 node5
192.168.10.106 node6
挂载Gluster文件系统
[root@node1 ~]# mount -t glusterfs node1:dist-volume /test/dist
[root@node1 ~]# mount -t glusterfs node1:rep-volume /test/rep
[root@node1 ~]# mount -t glusterfs node1:disp-volume /test/disp
[root@node1 ~]# mount -t glusterfs node1:dist-rep /test/dist_and_rep/
[root@node1 ~]# mount -t glusterfs node1:dist-disp /test/dist_and_disp/
修改fstab配置文件
[root@node1 ~]# vim /etc/fstab
node1:dist-volume /test/dist glusterfs defaults,_netdev 0 0
在客户端测试Gluster文件系统
创建测试文件
[root@node1 ~]# dd if=/dev/zero of=aaa1.log bs=1M count=43
[root@node1 ~]# dd if=/dev/zero of=aaa2.log bs=1M count=43
[root@node1 ~]# dd if=/dev/zero of=aaa3.log bs=1M count=43
[root@node1 ~]# dd if=/dev/zero of=aaa4.log bs=1M count=43
[root@node1 ~]# dd if=/dev/zero of=aaa5.log bs=1M count=43
[root@node1 ~]# dd if=/dev/zero of=aaa6.log bs=1M count=43
[root@node1 ~]# dd if=/dev/zero of=aaa7.log bs=1M count=43
[root@node1 ~]# dd if=/dev/zero of=aaa8.log bs=1M count=43
卷中写入文件
[root@node1 ~]# cp aaa* /test/dist/
[root@node1 ~]# cp aaa* /test/rep/
[root@node1 ~]# cp aaa* /test/disp/
[root@node1 ~]# cp aaa* /test/dist_and_rep/
[root@node1 ~]# cp aaa* /test/dist_and_disp/
[root@node1 dist]# history #显示用户的命令历史。它列出了用户在当前会话中输入过的所有命令,以及在历史文件中保存的命令。
查看文件分布
来到102主机
[root@node2 e6]# cd /e6
[root@node2 e6]# ls
aaa1.log aaa5.log aaa6.log lost+found
来到103、104主机
[root@node3 ~]# cd /d5
[root@node3 d5]# ls
demo1.log demo2.log demo3.log demo4.log demo5.log demo6.log demo7.log demo8.log lost+found