存储方式有:块存储、文件存储、对象存储
块存储(典型设备:磁盘阵列、硬盘):
- 可以通过Raid、等手段保护数据;组合多块硬盘,提高容量;写入数据时可以并行写入,提升读写速率;块存储多数的SAN架构组网,传输速度以及封装协议能使其传输速度和读写效率得到提升。
- SAN架构组网时需要额外购买光纤通道卡及光纤交换机,成本高;服务器不做集群情况下裸盘映射给主机就不可以给另一台主机使用,无法共享数据;不同操作系统格式化后不同文件系统之间文件不共享;
文件存储(典型设备:FTP、NFS服务器)(克服文件无法共享):
- 造价低(一台机器、普通以太网);方便文件共享
- 读写速度低,传输速度慢(以太网上传下载速度慢,所有读写都要一台服务器硬盘承受(较于阵列数量过少))
对象存储(典型设备:内置大容量硬盘的分布式服务器、GFS、Ceph、Fastdfs、阿里云(OSS)、AWS(S3)、私有云openstack(swift))(分布式存储、云)
- 提供大容量,多副本的安全机制,可以有多个快存储组成一个整体对外提供服务,对于用户而言就是一个整体,数据会按照对象存储的存储规则进行分片和多副本的存储
扩展性和高性能
GlusterFS利用双重特性来提供高容量存储解决方案。
高可用性
全局统一命名空间
弹性卷管理
基于标准协议
Brick(存储块)
指可信主机池中由主机提供的用于物理存储的专用分区,是GlusterFS中的基本存储单元,同时也是可信存储池中服务器上对外提供的存储目录。
存储目录的格式由服务器的目录的绝对路径构成,表示方法为 SERVER:EXPORT,如192.168.42.3:/data/mydir/。
Volume(逻辑卷)
一个逻辑卷是一组Brick的集合。卷是数据存储的逻辑设备,类似于LVM中的逻辑卷。大部分Gluster管理操作是在卷上进行的。
FUSE
是一个内核模块,允许用户创建自己的文件系统,无须修改内核代码。
VFS:
内核空间对用户空间提供的访问磁盘的接口。
Glusterd(后台管理进程):
在存储群集中的每个节点上都要运行。
GlusterFS采用模块化、堆栈式的架构。
通过对模块进行各种组合,即可实现复杂的功能。例如Replicate模块可实现 RAID1,Stripe模块可实现RAID0,通过两者的组合可实现 RAID10 和RAID01,同时获得更高的性能及可靠性。
GlusterFS支持七种卷,即分布式卷、条带卷、复制卷、分布式条带卷、分布式复制卷、条带复制卷和分布式条带复制卷。
分布式卷(Distribute volume)
文件通过HASH算法分布到所有Brick Server上,这种卷是GlusterFS 的默认卷:以文件为单位根据HASH算法散列到不同的Brick,其实只是扩大了磁盘空间,如果有一块磁盘损坏,数据也将丢失,属于文件级的RAID0,不具有容错能力。
在该模式下,并没有对文件进行分块处理,文件直接存储在某个Server节点上。
由于直接使用本地文件系统进行文件存储,所以存取效率并没有提高,反而会因为网络通信的原因而有所降低。
示例原理
File1和File2存放在Server1,而File3存放在Server2,文件都是随机存储,一个文件(如File1)要么在Server1上,要么在Server2上,不能分块同时存放在Server1和Server2上。
分布式卷具有如下特点:
创建一个名为dis-volume的分布式卷,文件将根据HASH分布在server1:/dir1、server2:/dir2和server3:/dir3中
gluster volume create dis-volume server1:/dir1 server2:/dir2
条带卷(Stripe volume)
类似RAID 0,文件被分成数据库并以轮询的方式分布到多个Brick Server上,文件存储以数据块为单位,支持大文件存储,文件越大,读取效率越高,但是不具备冗余性。
条带卷特点
创建一个名为stripe-volume的条带卷,文件将被分块轮询的存储在Server1:/dir1和Server2:/dir2两个Brick中
gluster volume create stripe-volume stripe 2 transport tcp server1:/dir1 server2:/dir2
复制卷(Replica volume):
将文件同步到多个Brick上,使其具备多个文件副本,属于文件级RAID1,具有容错能力。因为数据分散在多个Brick中,所以读性能得到很大提升,但写性能下降。
复制卷具备冗余性,即使一个节点损坏,也不影响数据的正常使用。但因为要保存副本,所以磁盘利用率较低。
示例原理
File1同时存在Server1和Server2,File2也是如此,相当于Server2中的文件是Server1中文件的副本。
复制卷特点
创建名为rep-volume的复制卷,文件将同时存储两个副本,分别在Server1:/dir1和Server2:/dir2两个Brick中
gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2
分布式条带卷(Distribute stripe volume)
Brick Server数量是条带数(数据块分布的 Brick 数量)的倍数,兼具分布式卷和条带卷的特点。主要用于大文件访问处理,创建一个分布式条带卷最少需要4台服务器。
示例原理
创建一个名为dis-stripe的分布式条带卷,配置分布式的条带卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)。Brick 的数量是4(Server1:/dir1、Server2:/dir2、Server3:/dir3和 Server4:/dir4),条带数为2(stripe 2)
gluster volume create dis-stripe stripe 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4
创建卷时,存储服务器的数量如果等于条带或复制数,那么创建的是条带卷或者复制卷;如果存储服务器的数量是条带或复制数的2倍甚至更多,那么将创建的是分布式条带卷或分布式复制卷。
分布式复制卷(Distribute Replica volume)
Brick Server 数量是镜像数(数据副本数量〉的倍数,兼具分布式卷和复制卷的特点。主要用于需要冗余的情况下。
示例原理
File1和File2通过分布式卷的功能分别定位到Server1和Server2。在存放File1时,File1根据复制卷的特性,将存在两个相同的副本,分别是Server1中的exp1目录和Server2中的exp2目录。在存放Fil1e2时,File2根据复制卷的特性,也将存在两个相同的副本,分别是Server3中的exp3目录和Server4中的 exp4目录。
创建一个名为dis-rep的分布式复制卷,配置分布式的复制卷时,卷中Brick所包含的存储服务器数必须是复制数的倍数(>=2倍)
Brick的数量是4(Server1:/dir1、Server2:/dir2、Server3:/dir3和Server4:/dir4),复制数为2(replica 2)
gluster volume create dis-rep replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4
条带复制卷(Stripe Replica volume)
类似RAID 10,同时具有条带卷和复制卷的特点。
分布式条带复制卷(Stripe Replica volume)
三种基本卷的复合卷,通常用于类Map Reduce应用。
节点 | IP地址 | 磁盘 | 挂载点 |
---|---|---|---|
Node1节点 | 192.168.42.3 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
Node2节点 | 192.168.42.4 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
Node3节点 | 192.168.42.5 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
Node4节点 | 192.168.42.6 | /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 | /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 |
客户端 | 192.168.42.7 |
关闭防火墙
systemctl stop firewalld
setenforce 0
磁盘分区,并挂载
vim /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
chmod +x /opt/fdisk.sh
cd /opt/
./fdisk.sh
修改主机名,配置/etc/hosts文件(每个节点)
以Node1节点为例
hostnamectl set-hostname node1
su
echo "192.168.42.3 node1" >> /etc/hosts
echo "192.168.42.4 node2" >> /etc/hosts
echo "192.168.42.5 node3" >> /etc/hosts
echo "192.168.42.6 node4" >> /etc/hosts
将gfsrepo软件上传到/opt目录下
cd /opt
unzip gfsrepo.zip
cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak
vim glfs.repo
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1
yum clean all && yum makecache
#yum -y install centos-release-gluster #如果采用官方YUM源安装,可以直接指向互联网仓库
yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
systemctl start glusterd.service
systemctl enable glusterd.service
systemctl status glusterd.service
只要在一台Node节点上添加其他节点即可
gluster peer probe node1
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4
在每个Node节点上查看集群状态
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-volume node1:/data/sdb1 node2:/data/sdb1 force
查看卷列表
gluster volume list
启动新建分布式卷
gluster volume start dis-volume
创建条带卷
指定类型为stripe,数值为2,且后面跟了2个Brick Server,所以创建的是条带卷
gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force
gluster volume start stripe-volume
gluster volume info stripe-volume
创建复制卷
指定类型为 replica,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是复制卷
gluster volume create rep-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force
gluster volume start rep-volume
gluster volume info rep-volume
创建分布式条带卷
指定类型为 stripe,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式条带卷
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
创建分布式复制卷
指定类型为 replica,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式复制卷
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
gluster volume info dis-rep
查看卷列表
gluster volume list
配置/etc/hosts文件
echo "192.168.42.3 node1" >> /etc/hosts
echo "192.168.42.4 node2" >> /etc/hosts
echo "192.168.42.5 node3" >> /etc/hosts
echo "192.168.42.6 node4" >> /etc/hosts
创建挂载的目录
mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
挂载Gluster文件系统
临时挂载
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 -h
永久挂载
vim /etc/fstab
node1:dis-volume /test/dis glusterfs defaults,_netdev 0 0
node1:stripe-volume /test/stripe glusterfs defaults,_netdev 0 0
node1:rep-volume /test/rep glusterfs defaults,_netdev 0 0
node1:dis-stripe /test/dis_stripe glusterfs defaults,_netdev 0 0
node1:dis-rep /test/dis_rep glusterfs defaults,_netdev 0 0
mount -a
在客户端中向卷中写入文件
cd /opt
dd if=/dev/zero of=/opt/demo1.txt bs=1M count=40
dd if=/dev/zero of=/opt/demo2.txt bs=1M count=40
dd if=/dev/zero of=/opt/demo3.txt bs=1M count=40
dd if=/dev/zero of=/opt/demo4.txt bs=1M count=40
dd if=/dev/zero of=/opt/demo5.txt bs=1M count=40
ls -lh /opt
cp demo* /test/dis
cp demo* /test/stripe
cp demo* /test/rep
cp demo* /test/dis_stripe
cp demo* /test/dis_rep
查看文件分布
查看卷对应的磁盘分区中的文件数据,验证结果
查看分布式文件分布
在node1:/dev/sdb1
ll -h /data/sdb1
在node2:/dev/sdb1
ll -h /data/sdb1
分布式只会将demo文件分开存储(五个文件不在同一磁盘分区),不会将数据分片和备份
查看条带卷文件分布
在node1:/dev/sdc1
ll -h /data/sdc1
在node2:/dev/sdc1
ll -h /data/sdc1
条带卷会将每个demo文件中的数据分存储(两个分区各有20M的文件),没有备份
查看复制卷文件分布
在node3:/dev/sdb1
ll -h /data/sdb1
在node4:/dev/sdb1
ll -h /data/sdb1
复制卷会将每个demo文件放入卷中的磁盘分区中(两分区的文件一样)
查看分布式条带卷分布
在node1:/dev/sdd1
ll -h /data/sdd1
在node2:/dev/sdd1
ll -h /data/sdd1
在node3:/dev/sdd1
ll -h /data/sdd1
在node4:/dev/sdd1
ll -h /data/sdd1
分布式条带卷中,带有分布式和条带卷的特点,即将数据分片,又将文件分开存储,没有备份
查看分布式复制卷分布
在node1:/dev/sde1
ll -h /data/sde1
在node2:/dev/sde1
ll -h /data/sde1
在node3:/dev/sde1
ll -h /data/sde1
在node4:/dev/sde1
ll -h /data/sde1
分布式复制卷中,带有分布式和复制卷的特点,即将文件分开存储,又复制一遍文件(备份)
挂起node2节点或者关闭gluster服务来模拟故障
systemctl stop gluster.service
在客户端上查看文件是否正常
分布式卷
ls -lh /test/dis
数据查看,缺少demo5,文件demo5是存储在node2上的,所以分布式卷不具备冗余
条带卷
ls -lh /test/stripe/
文件中没有数据,说明数据全部丢失,所以条带卷不具备冗余
分布式条带卷
ls -lh /test/dis_stripe/
存储在node1和node2上的4个文件不见了(数据是分片存储的),所以分布式条带卷不具备冗余
分布式复制卷
ls -lh /test/dis_rep/
文件和数据都在,分布式复制卷具有冗余
复制卷
在node3和node4中选一个关闭,关闭node4进行测试
ls -lh /test/rep/
文件和数据都在,所以复制卷具有冗余