基于openEuler搭建Glusterfs集群实验
1、GFS的简介
GFS是一个可扩展、开源的分布式文件系统(可以很好的体现出弹性伸缩的特点),用于大型的、分布式的、对大量数据进行访问的应用,在传统的解决方案中,GFS 能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。没有元数据服务器组件,这有助于提升整个系统的性能、可靠性和稳定性。
GFS由三个组件组成:
- 存储服务器(Brick Server)
- 客户端(不在本地)(且,有客户端,也会有服务端,这点类似于NFS,但是更为复杂)
- 存储网关(NFS/Samaba)
无元数据服务器:
元数据是核心,描述对象的信息,影响其属性;例如NFS,存放数据本身,是一个典型的元数据服务器可能存在单点故障,故要求服务器性能较高,服务器一旦出现故障就会导致数据丢失;反过来看,所以无元数据服务不会有单点故障。那么数据存放在哪里呢?会借用分布式的原则,分散存储,不会有一个统一的数据服务器。
2、GFS的工作原理
2.1、工作流程
(1)客户端或应用程序通过 GlusterFS 的挂载点访问数据;
(2)linux系统内核通过 VFS API 虚拟接口收到请求并处理;
(3)VFS 将数据递交给 FUSE 内核文件系统,这是一个伪文件系统,这个伪文件系统主要用来转存,它提供一个虚拟接口,映射出来/dev/fuse这样一个虚拟路径,并向系统注册一个实际的文件系统 FUSE,而 FUSE 文件系统则是将数据通过 /dev/fuse 设备文件递交给了 GlusterFS client 端。可以将 FUSE 文件系统理解为一个代理
(4)GlusterFS client 会实时监听/dev/fuse下的数据,一旦数据更新,会把数据拿过来,client 根据配置文件的配置对数据进行处理
(5)经过 GlusterFS client 处理后,通过网络将数据传递至远端的 GlusterFS Server,server会先转存到本地的vfs虚拟文件系统中,然后再通过vfs转存到EXT3上。EXT3指的是各个block块中的EXT3文件系统中。
服务器详解:
- Application:客户端或应用程序通过GlusterFSync的挂载点访问数据
- VFS:linux系统内核通过VFS的API 收到请求并处理
- FUSE:VFS将数据递交给FUSE内核文件系统,fuse文件系统则是将数据通过/dev/fuse设备文件递交给了GlusterFS
- GlusterFS Client :通过网络将数据传递至远端的GlusterFS Server, 并且写入到服务器存储设备上
2.2、后端存储如何定位文件
通过弹性HASH算法,弹性 HASH 算法是 Davies-Meyer 算法的具体实现,通过 HASH 算法可以得到一个 32 位的整数范围的 hash 值,假设逻辑卷中有 N 个存储单位 Brick,则 32 位的整数范围将被划分为 N 个连续的子空间,每个空间对应一个 Brick。当用户或应用程序访问某一个命名空间时,通过对该命名空间计算 HASH 值,根据该 HASH 值所对应的 32 位整数空间定位数据所在的 Brick
3、GFS的卷类型
GlusterFS 支持七种卷, 即分布式卷、条带卷、复制卷、分布式条带卷、分布式复制卷、条带复制卷和分布式条带复制卷, 这七种卷可以满足不同应用对高性能、高可用的需求。
- 分布式卷( Di stribute volume ) : 文件通过HASH 算法分布到所有Brick Server 上,这种卷是Glusterf 的基础; 以文件为单位根据HASH 算法散列到不同的Brick , 其实只是扩大了磁盘空间, 如果有一块磁盘损坏, 数据也将丢失, 属千文件级的RAIDO ,不具有容错能力。
- 条带卷( Stripe volume ) : 类似RAID0 , 文件被分成数据块并以轮询的方式分布到多个Brick Server 上, 文件存储以数据块为单位, 支持大文件存储, 文件越大, 读取效率越高。
- 复制卷(Replica volume ) : 将文件同步到多个Brick 上, 使其具备多个文件副本,属于文件级RAID 1, 具有容错能力。因为数据分散在多个Brick 中, 所以读性能得到很大提升, 但写性能下降。
- 分布式条带卷( Distri bute Stripe volume) : Brick Server 数扯是条带数( 数据块分布的Brick 数址)的倍数, 兼具分布式卷和条带卷的特点。
- 分布式复制卷(Distribute Replica volume ) : Brick Server 数量是镜像数(数据副本数量)的倍数, 兼具分布式卷和复制卷的特点。
- 条带复制卷(Stripe Replica volume ) : 类似RAID 10 , 同时具有条带卷和复制卷的特点。
- 分布式条带复制卷(Distribute Stripe Replicavolume ) : 三种基本卷的复合卷, 通常用于类Map Reduce 应用。
4、GFS的部署
4.1、环境准备
主机名 | IP | 身份 |
openEuler-1 | 192.168.121.10 | 节点1(提供两块6G硬盘) |
openEuler-2 | 192.168.121.11 | 节点2(提供两块6G硬盘) |
openEuler-3 | 192.168.121.12 | 节点3(提供两块6G硬盘) |
openEuler-4 | 192.168.121.13 | client |
4.2、磁盘分区
[root@openEuler-1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 6G 0 disk
└─sda1 8:1 0 6G 0 part /exp/vda1
sdb 8:16 0 6G 0 disk
└─sdb1 8:17 0 6G 0 part /exp/vdb1
sr0 11:0 1 3.8G 0 rom
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 19G 0 part├─openeuler_192-root 253:0 0 17G 0 lvm /└─openeuler_192-swap 253:1 0 2G 0 lvm [SWAP]# fdisk将添加两块硬盘每个划分一个分区,即/dev/sda1和/dev/sdb1
[root@openEuler-1 ~]# fdisk /dev/sda
[root@openEuler-1 ~]# fdisk /dev/sdb# 对创建出来的磁盘进行格式化
[root@openEuler-1 ~]# mkfs.xfs /dev/sda1
[root@openEuler-1 ~]# mkfs.xfs /dev/sdb1# 节点2、3重复上面操作
4.3、磁盘挂载
# 创建挂载点
[root@openEuler-1 ~]# mkdir -p /exp/vd{a,b}1# 配置永久挂载磁盘分区
[root@openEuler-1 ~]# echo "/dev/sda1 /exp/vda1 xfs defaults 0 0" >> /etc/fstab
[root@openEuler-1 ~]# echo "/dev/sdb1 /exp/vdb1 xfs defaults 0 0" >> /etc/fstab# 对创建出来的分区格式化
[root@openEuler-1 ~]# mkfs.xfs /dev/sda1
meta-data=/dev/sda1 isize=512 agcount=4, agsize=393152 blks= sectsz=512 attr=2, projid32bit=1= crc=1 finobt=1, sparse=1, rmapbt=0= reflink=1 bigtime=1 inobtcount=0
data = bsize=4096 blocks=1572608, imaxpct=25= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@openEuler-1 ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=393152 blks= sectsz=512 attr=2, projid32bit=1= crc=1 finobt=1, sparse=1, rmapbt=0= reflink=1 bigtime=1 inobtcount=0
data = bsize=4096 blocks=1572608, imaxpct=25= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0# 挂载
[root@openEuler-1 ~]# mount -a[root@openEuler-1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 714M 0 714M 0% /dev/shm
tmpfs 286M 7.9M 278M 3% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/openeuler_192-root 17G 2.8G 13G 18% /
tmpfs 714M 0 714M 0% /tmp
/dev/nvme0n1p1 974M 168M 739M 19% /boot
/dev/sda1 6.0G 76M 6.0G 2% /exp/vda1
/dev/sdb1 6.0G 76M 6.0G 2% /exp/vdb1
4.4、配置host解析
# 各节点更改对应主机名,这里以node-1为例
[root@openEuler-1 ~]# hostnamectl set-hostname node-1# 配置主机解析
[root@openEuler-1 ~]# vim /etc/hosts
192.168.93.10 node-1
192.168.93.11 node-2
192.168.93.12 node-3# 节点2、3重复上面操作
4.5、安装GlusterFS服务端软件包
[root@openEuler-1 ~]# yum install glusterfs-server -y
[root@openEuler-1 ~]# systemctl enable --now glusterd.service# 节点2、3重复上面操作
4.6、配置GlusterFS存储信任池
# 在node1节点上,添加其它信任池节点
[root@openEuler-1 ~]# gluster peer probe node-2
peer probe: success
[root@openEuler-1 ~]# gluster peer probe node-3
peer probe: success# 查看信任池状态
[root@openEuler-1 ~]# gluster peer status
Number of Peers: 2Hostname: node-2
Uuid: 7d5ca3fa-28a4-47df-87b0-7ebb7d8bc34c
State: Peer in Cluster (Connected)Hostname: node-3
Uuid: 87bb7acc-fad4-4329-b249-e9068ba7d8bc
State: Peer in Cluster (Connected)# 查看信任池列表
[root@openEuler-1 ~]# gluster pool list
UUID Hostname State
7d5ca3fa-28a4-47df-87b0-7ebb7d8bc34c node-2 Connected
87bb7acc-fad4-4329-b249-e9068ba7d8bc node-3 Connected
12928d84-46a6-465b-adff-2c4fe31a9070 localhost Connected
4.7、创建测试卷(复制卷)
[root@openEuler-1 ~]# gluster volume create gv-rep replic 3 node-1:/exp/vda1/brick node-2:/exp/vda1/brick node-3:/exp/vda1/brick
volume create: gv-rep: success: please start the volume to access data
[root@openEuler-1 ~]# gluster volume start gv-rep
volume start: gv-rep: success
5、客户端测试
5.1、安装GlusterFS客户端软件包
# 安装软件包
[root@openEuler-4 ~]# yum install glusterfs-fuse -y# 配置hosts解析
[root@openEuler-4 ~]# vim /etc/hosts
192.168.93.10 node-1
192.168.93.11 node-2
192.168.93.12 node-3
5.2、客户端挂载
# 创建挂载点
[root@openEuler-4 ~]# mkdir /mnt/test1# 挂载复制卷
[root@openEuler-4 ~]# mount.glusterfs node-1:/gv-rep /mnt/test1/
5.3、测试
# 客户端批量创建文件
[root@openEuler-4 test1]# touch file{1..10}
[root@openEuler-4 test1]# ls
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9# 在节点上查看(节点1、2、3一致)
[root@openEuler-1 ~]# ls /exp/vda1/brick/
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9