目录
一.GFS分析
GFS文件系统的分析
- GFS全称为Google File System,为了满足Google迅速增长的数据处理要求,google设计并且实现了google文件系统(GFS)。Google文件系统是一个可扩展的分布式文件系统,用于大型的,分布式的,对大量数据进行访问的应用
- GFS应用于廉价的普通硬件上,但可以提供容错功能,它可以给大量的用户提供总体性能较高的服务,也可以提供·容错功能
- 谷歌三大法宝分别是“Google 文件系统”、“big table”、“mapreduce算法”。至今除了谷歌之外,在数据维护上没有那家公司开发文件系统这种十分底层的技术,有了自己的文件系统,谷歌就可以有效的组织庞大的数据,服务器和存储,并且用他们工作,因此,GFS的优势十分明显
GFS文件系统结构功能
- GFS文件系统为分布式结构,它是一个高度容错网络文件系统,主要chunksever由一个master和众多chunkserver(大块设备)构成的
- GFS的特点包括:扩展性和高性能、高可用性、全局统一命名空间、弹性卷管理、基于标准协议
- GFS的工作流程,如下图
- GFS通过弹性Hash算法地址空间的唯一性
GFS架构体系
- 一个GFS群集由一台master服务器(有备份),多台chunk服务器组成,客户端,架构上比较简单
- chunkserver:数据存储节点,文件被分割为固定大小的chunk,每个chunk被唯一标识,默认情况下chunk存储3个副本
- chunk:每个·文件至少存储为一个chunk,每个chunk以普通的Linux文件存储,chunk尺寸大小选择是一个关键的设计参数,默认为64MB,每个chunk有全局64位唯一标识符
- GFS文件系统是可以被多个用户同时访问,一般情况下,Application和chunkserver是可以在同一台机子上,主要的数据流量是通过Application和hunkserver之间,由于数据访问的是本地减少了Application和master之间的交互访问,减少了master的负荷量,提高了master的利用性能
- master中保存着三类元数据(metadata):文件名和块的名字空间、从文件到块的映射、副本位置。所有metadata都放在内存中。操作日志的引入可以更加简单、可靠地更新master的信息
- master作为GFS的控制和神经系统,副本为master的备份,chunk主要用和用户交换数据,网络中的主机瘫痪,不会对整个系统造成大的影响,替换上去的主机会自动重建数据。即使master的瘫痪,也会有shadow作为替补,并且shadow在一定的时候也会充当master来提供控制和数据交换。
GFS的卷类型
- 分布式卷:没有对文件进行分块处理,通过扩展文件属性保存HASH值,支持的底层文件系统有ext3,ext4、ZFS、XFS
特点:文件分布在不同的服务器,不具备冗余性;更容易和廉价地扩展卷的大小;单点故障会造成数据丢失;依赖底层的数据保护(依赖硬件设置)
- 条带卷:根据偏移量将文件分为N块(N个条带节点),轮询的存储在每个Brick server节点;存储大文件时,性能尤为突出;不具备冗余性,类似raid 0
特点:数据被分割为更小块分布到块服务器群中的条带区;分布减少了负载且更小的文件加速了存取的速度;没有数据冗余
- 复制卷:同一文件保存一份或多份副本;复制模式因为要保存副本,因此磁盘利用率较低,多个节点上的存储空间不一致,那么将按照木桶效应取最低值,作为该卷的总容量
特点:卷中所有的服务器均保存一完整的副本;卷的副本数量可由客户创建的时候决定;至少由两个块服务器或者更多服务器,具备冗余性
- 分布式条带卷:兼顾分布式和条带卷的功能;主要用于大文件访问处理,至少需要4台服务器
- 分布式复制卷:兼顾分布式卷和复制卷的功能;用于需要冗余的情况下
二.GFS群集部署
环境部署
- 开五台虚拟机,一台cilent,四台nodes,nodes增加四块磁盘,每块5G
角色 | IP地址 | 磁盘 |
node1 | 192.168.43.101 | 5GX4 |
node2 | 192.168.43.102 | 5GX4 |
node3 | 192.168.43.103 | 5GX4 |
node4 | 192.168.43.104 | 5GX4 |
client | 192.168.43.105 | 5GX4 |
- 修改主机名,添加磁盘
- 创建、格式化、挂载磁盘shell脚本,一键操作
vim disk.sh
#! /bin/bash
echo "the disks exist list:"
##grep出系统所带磁盘
fdisk -l |grep '磁盘 /dev/sd[a-z]'
echo "=================================================="
PS3="chose which disk you want to create:"
##选择需要创建的磁盘编号
select VAR in `ls /dev/sd*|grep -o 'sd[b-z]'|uniq` quit
do
case $VAR in
sda)
##本地磁盘就退出case语句
fdisk -l /dev/sda
break ;;
sd[b-z])
#create partitions
echo "n ##创建磁盘
p
w" | fdisk /dev/$VAR
#make filesystem
##格式化
mkfs.xfs -i size=512 /dev/${VAR}"1" &> /dev/null
#mount the system
mkdir -p /data/${VAR}"1" &> /dev/null
###永久挂载
echo -e "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0\n" >> /etc/fstab
###使得挂载生效
mount -a &> /dev/null
break ;;
quit)
break;;
*)
echo "wrong disk,please check again";;
esac
done
- 挂载完毕如下
[root@node1 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda2 xfs 20G 4.3G 16G 22% /
devtmpfs devtmpfs 474M 0 474M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm
tmpfs tmpfs 489M 7.2M 481M 2% /run
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda3 xfs 8.0G 37M 8.0G 1% /home
/dev/sda1 xfs 10G 158M 9.9G 2% /boot
tmpfs tmpfs 98M 12K 98M 1% /run/user/42
tmpfs tmpfs 98M 0 98M 0% /run/user/0
/dev/sdb1 xfs 5.0G 33M 5.0G 1% /data/sdb1
/dev/sdc1 xfs 5.0G 33M 5.0G 1% /data/sdc1
/dev/sdd1 xfs 5.0G 33M 5.0G 1% /data/sdd1
/dev/sde1 xfs 5.0G 33M 5.0G 1% /data/sde1
[root@node1 ~]#
[root@node2 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda2 xfs 10G 4.7G 5.4G 47% /
devtmpfs devtmpfs 474M 0 474M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm
tmpfs tmpfs 489M 7.1M 482M 2% /run
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda5 xfs 4.0G 37M 4.0G 1% /home
/dev/sda1 xfs 4.0G 158M 3.9G 4% /boot
tmpfs tmpfs 98M 28K 98M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
/dev/sdb1 xfs 5.0G 33M 5.0G 1% /data/sdb1
/dev/sdc1 xfs 5.0G 33M 5.0G 1% /data/sdc1
/dev/sdd1 xfs 5.0G 33M 5.0G 1% /data/sdd1
/dev/sde1 xfs 5.0G 33M 5.0G 1% /data/sde1
[root@node2 ~]#
[root@node3 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda2 xfs 20G 4.3G 16G 22% /
devtmpfs devtmpfs 474M 0 474M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm
tmpfs tmpfs 489M 7.2M 481M 2% /run
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda5 xfs 8.0G 37M 8.0G 1% /home
/dev/sda1 xfs 10G 158M 9.9G 2% /boot
tmpfs tmpfs 98M 12K 98M 1% /run/user/42
tmpfs tmpfs 98M 0 98M 0% /run/user/0
/dev/sdb1 xfs 5.0G 33M 5.0G 1% /data/sdb1
/dev/sdc1 xfs 5.0G 33M 5.0G 1% /data/sdc1
/dev/sdd1 xfs 5.0G 33M 5.0G 1% /data/sdd1
/dev/sde1 xfs 5.0G 33M 5.0G 1% /data/sde1
[root@node3 ~]#
[root@node4 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda2 xfs 20G 4.7G 16G 24% /
devtmpfs devtmpfs 471M 0 471M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 8.4M 478M 2% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda5 xfs 10G 39M 10G 1% /home
/dev/sda1 xfs 8.0G 164M 7.9G 2% /boot
tmpfs tmpfs 98M 12K 98M 1% /run/user/42
tmpfs tmpfs 98M 0 98M 0% /run/user/0
/dev/sdb1 xfs 5.0G 33M 5.0G 1% /data/sdb1
/dev/sdc1 xfs 5.0G 33M 5.0G 1% /data/sdc1
/dev/sdd1 xfs 5.0G 33M 5.0G 1% /data/sdd1
/dev/sde1 xfs 5.0G 33M 5.0G 1% /data/sde1
[root@node4 ~]#
node上的操作,建立关系
- 在四台node上映射主机名
vim /etc/hosts
192.168.43.101 node1
192.168.43.102 node2
192.168.43.103 node3
192.168.43.104 node4
- 在四台Node上,编写GFS的源,如下,以node1为例
[root@node1 ~]# cd /opt
[root@node1 opt]# rz
[root@node1 opt]# ls ##在/opt防止关于gfs的软件包
gfsrepo.zip rh
[root@node1 opt]# unzip gfsrepo.zip ##解压
[root@node1 opt]# vim /etc/yum
yum/ yum.conf yum.repos.d/
[root@node1 opt]# cd /etc/yum.repos.d/
[root@node1 yum.repos.d]# mkdir bak ##将原来的源移动到新建的目录中
[root@node1 yum.repos.d]# mv Cent* bak/
[root@node1 yum.repos.d]# ls
bak
[root@node1 yum.repos.d]# vim local.repo
[GLFS]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1
[root@node1 yum.repos.d]#
- 在四台node上,安装GFS相关软件包
yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma ###安装
systemctl start glusterd.service ###启动
systemctl enable glusterd.service ###开机自启
systemctl status glusterd.service ###查看状态
- 设置时间同步,四台node都需要设置,以node1为例,关闭防火墙和SElinux功能
ntpdate ntp1.aliyun.com
systemctl stop firewalld
setenforce 0
- 添加存储信任池,只要在一台主机上添加其他三台节点即可,本实验在node1上操作
[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 status
Number of Peers: 3
Hostname: node2
Uuid: 557eddc0-5dfb-4dd6-a124-a192b528ecb2
State: Peer in Cluster (Connected)
Hostname: node3
Uuid: 847bde80-22fd-49dc-bbd8-47970c3ff3e6
State: Peer in Cluster (Connected)
Hostname: node4
Uuid: 122e7693-f3b8-437f-a128-1c7b79001b23
State: Peer in Cluster (Connected)
[root@node1 ~]#
GFS卷的创建,只需要在node1中创建管理即可
- 创建分布式卷
###利用node1和node2上的两块磁盘创建,dis-vol为磁盘名,force表示强制
[root@node1 ~]# gluster volume create dis-vol node1:/data/sdb1 node2:/data/sdb1 force
volume create: dis-vol: success: please start the volume to access data
##启动dis-vol卷
[root@node1 ~]# gluster volume start dis-vol
volume start: dis-vol: success
##查看该卷的状态
[root@node1 ~]# gluster volume info dis-vol
Volume Name: dis-vol
Type: Distribute
Volume ID: a78f9362-8fa0-4e7b-a071-766d7e27355a
Status: Started
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdb1
Brick2: node2:/data/sdb1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
[root@node1 ~]#
- 创建条带卷
[root@node1 ~]# gluster volume create stripe-vol stripe 2 node1:/data/sdc1 node2:/data/sdc1 force
volume create: stripe-vol: success: please start the volume to access data
[root@node1 ~]# gluster volume start stripe-vol
volume start: stripe-vol: success
[root@node1 ~]# gluster volume info stripe-vol
Volume Name: stripe-vol
Type: Stripe
Volume ID: 3c365fca-1e83-4f3f-8d4c-e73bf10c40ed
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdc1
Brick2: node2:/data/sdc1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
[root@node1 ~]#
- 创建复制卷
[root@node1 ~]# gluster volume create rep-vol replica 2 node3:/data/sdb1 node4:/data/sdb1 force
volume create: rep-vol: success: please start the volume to access data
[root@node1 ~]#
[root@node1 ~]# gluster volume start rep-vol
volume start: rep-vol: success
[root@node1 ~]# gluster volume info rep-vol
Volume Name: rep-vol
Type: Replicate
Volume ID: cf8e95ca-671e-4f7c-be0a-f0d20233ce9f
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node3:/data/sdb1
Brick2: node4:/data/sdb1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
[root@node1 ~]#
- 创建分布式条带卷(至少4个节点)
[root@node1 ~]# gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
volume create: dis-stripe: success: please start the volume to access data
[root@node1 ~]#
[root@node1 ~]# gluster volume start dis-stripe
volume start: dis-stripe: success
[root@node1 ~]# gluster volume info dis-stripe
Volume Name: dis-stripe
Type: Distributed-Stripe
Volume ID: 7366292b-2f30-443a-ba54-4ffd212577e5
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdd1
Brick2: node2:/data/sdd1
Brick3: node3:/data/sdd1
Brick4: node4:/data/sdd1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
- 创建分布式复制卷(至少4个节点)
[root@node1 ~]# gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
volume create: dis-rep: success: please start the volume to access data
[root@node1 ~]#
[root@node1 ~]# gluster volume start dis-rep
volume start: dis-rep: success
[root@node1 ~]# gluster volume info dis-rep
Volume Name: dis-rep
Type: Distributed-Replicate
Volume ID: f0629dd9-af5a-46fa-b9ca-30cd21948d86
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/data/sde1
Brick2: node2:/data/sde1
Brick3: node3:/data/sde1
Brick4: node4:/data/sde1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
[root@node1 ~]#
配置客户端
- 配置GFS源,安装相关软件包
[root@client ~]# cd /opt
[root@client opt]# rz
[root@client opt]# ls
gfsrepo.zip rh
[root@client opt]# unzip gfsrepo.zip
[root@client opt]# vim /etc/yum.repos.d/GLFS.repo
[GLFS]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1
[root@client opt]# cd
[root@client ~]# yum -y install glusterfs glusterfs-fuse
- 做地址映射
[root@client ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.43.101 node1
192.168.43.102 node2
192.168.43.103 node3
192.168.43.104 node4
- 创建临时挂载点,关闭安全性功能
[root@client ~]# mkdir -p /text/dis
##挂载分布式卷
[root@client ~]# mount.glusterfs node1:dis-vol /text/dis
[root@client ~]# mkdir -p /text/strip
##挂载条带卷
[root@client ~]# mount.glusterfs node1:stripe-vol /text/strip
[root@client ~]# mkdir /text/rep
##挂载复制卷
[root@client ~]# mount.glusterfs node3:rep-vol /text/rep/
[root@client ~]# mkdir /text/dis-str
##挂载分布式条带卷
[root@client ~]# mount.glusterfs node2:dis-stripe /text/dis-str/
[root@client ~]# mkdir /text/dis-rep
##挂载分布式复制卷
[root@client ~]# mount.glusterfs node4:dis-rep /text/dis-rep/
[root@client ~]# systemctl stop firewalld
[root@client ~]# setenforce 0
[root@client ~]#
- 查看挂载信息
[root@client ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda2 xfs 10G 3.8G 6.3G 38% /
devtmpfs devtmpfs 474M 0 474M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm
tmpfs tmpfs 489M 7.2M 482M 2% /run
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda5 xfs 4.0G 37M 4.0G 1% /home
/dev/sda1 xfs 4.0G 158M 3.9G 4% /boot
tmpfs tmpfs 98M 4.0K 98M 1% /run/user/42
tmpfs tmpfs 98M 20K 98M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
node1:dis-vol fuse.glusterfs 10G 167M 9.9G 2% /text/dis
node1:stripe-vol fuse.glusterfs 10G 167M 9.9G 2% /text/strip
node3:rep-vol fuse.glusterfs 5.0G 84M 5.0G 2% /text/rep
node2:dis-stripe fuse.glusterfs 20G 334M 20G 2% /text/dis-str
node4:dis-rep fuse.glusterfs 10G 167M 9.9G 2% /text/dis-rep
[root@client ~]#
测试GFS卷的功能
- 创建5个40M的文件
[root@client ~]# dd if=/dev/zero of=/demo1.log bs=1M count=40
记录了40+0 的读入
记录了40+0 的写出
41943040字节(42 MB)已复制,0.119366 秒,351 MB/秒
[root@client ~]# dd if=/dev/zero of=/demo2.log bs=1M count=40
记录了40+0 的读入
记录了40+0 的写出
41943040字节(42 MB)已复制,0.145625 秒,288 MB/秒
[root@client ~]# dd if=/dev/zero of=/demo3.log bs=1M count=40
记录了40+0 的读入
记录了40+0 的写出
41943040字节(42 MB)已复制,0.103901 秒,404 MB/秒
[root@client ~]# dd if=/dev/zero of=/demo4.log bs=1M count=40
记录了40+0 的读入
记录了40+0 的写出
41943040字节(42 MB)已复制,0.123886 秒,339 MB/秒
[root@client ~]# dd if=/dev/zero of=/demo5.log bs=1M count=40
记录了40+0 的读入
记录了40+0 的写出
41943040字节(42 MB)已复制,0.0815509 秒,514 MB/秒
[root@client ~]#
- 把创建的文件复制到不同卷上
[root@client ~]# cp /demo* /text/dis
[root@client ~]# cp /demo* /text/strip
[root@client ~]# cp /demo* /text/rep/
[root@client ~]# cp /demo* /text/dis-str
[root@client ~]# cp /demo* /text/dis-rep
- 查看四个节点上不同卷的文件情况
分布式卷
条带卷
复制卷
分布式条带卷
分布式复制卷
模拟故障,测试其功能
其他维护命令
1、查看GlusterFS卷
[root@node1 ~]# gluster volume list
2、查看所有卷的信息
[root@node1 ~]# gluster volume info
3.查看所有卷状态
[root@node1 ~]# gluster volume status
4. ####停止一个卷
[root@node1 ~]# gluster volume stop dis-stripe
5. 删除一个卷
[root@node1 ~]# gluster volume delete dis-stripe
6.黑白名单
[root@node1 ~]# gluster volume set dis-rep auth.allow 192.168.32.* ##设置192.168.30.0网段的所有IP地址 都能访问dis-rep卷(分布式复制卷)
volume set: success