GlusterFS企业分布式存储

GlusterFS

分布式文件系统

​ 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源并不直接与本地节点相连,而是分布于计算网络中的一个或者多个节点的计算机上。目前意义上的分布式文件系统大多都是由多个节点计算机构成,结构上是典型的客户机/服务器模式。流行的模式是当客户机需要存储数据时,服务器指引其将数据分散的存储到多个存储节点上,以提供更快的速度,更大的容量及更好的冗余特性;

产生

​ 计算机通过文件系统管理、存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量的方式,已经不能满足目前的需求。

分布式文件系统可以有效解决数据的存储和管理难题,将固定于某个地点的某个文件系统,扩展到任意多个地点/多个文件系统,众多的节点组成一个文件系统网络。每个节点可以分布在不同的地点,通过网络进行节点间的通信和数据传输。人们在使用分布式文件系统时,无需关心数据是存储在哪个节点上、或者是从哪个节点从获取的,只需要像使用本地文件系统一样管理和存储文件系统中的数据;

代表-nfs

​ NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样;

优点

​ 1)节约使用的磁盘空间客户端经常使用的数据可以集中存放在一台机器上,并使用NFS发布,那么网络内部所有计算机可以通过网络访问,不必单独存储;

​ 2)节约硬件资源NFS还可以共享软驱,CDROM和ZIP等的存储设备,减少整个网络上的可移动设备的数量;

​ 3)用户主目录设定对于特殊用户,如管理员等,为了管理的需要,可能会经常登录到网络中所有的计算机,若每个客户端,均保存这个用户的主目录很繁琐,而且不能保证数据的一致性.实际上,经过NFS服务的设定,然后在客户端指定这个用户的主目录位置,并自动挂载,就可以在任何计算机上使用用户主目录的文件;

缺点

​ 1) 存储空间不足,需要更大容量的存储;

​ 2) 直接用NFS挂载存储,有一定风险,存在单点故障;

​ 3) 某些场景不能满足要求,大量的访问磁盘IO是瓶颈;

​ 4) 扩容,缩容影响服务器较多;

​ 5) 目录层级不要太深,合理组织目录,数量不要太多,增大glusterfs目录缓存,另外还可以设计把元数据和数据分离,将元数据放到内存数据库,并在ssd持久保存;

​ 6) 小文件性能较差,它主要为大文件设计,对小文件优化很少, 虽然在客户端采用了元数据缓存md-cache提高小文件性能,但是md-cache大小有限,海量小文件缓存命中率会严重下降,优化效果会减小,需要增大元数据缓存或者将小文件合并为一个大文件,成为block

常见分布式存储

FastDFS:

一个开源的轻量级分布式文件系统,是纯C语言开发的。它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS 针对大量小文件存储有优势。

GlusterFS:

主要应用在集群系统中,具有很好的可扩展性。软件的结构设计良好,易于扩展和配置,通过各个模块的灵活搭配以得到针对性的解决方案。GlusterFS适合大文件,小文件性能相对较差。

MooseFS:

比较接近GoogleFS的c++实现,通过fuse支持了标准的posix,支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,算是通用的文件系统,可惜社区不是太活跃,性能相对其他几个来说较差,国内用的人比较多。

Ceph:

C++编写,性能很高,支持Fuse,并且没有单点故障依赖;Ceph 是一种全新的存储方法,对应于 Swift 对象存储。在对象存储中,应用程序不会写入文件系统,而是使用存储中的直接 API 访问写入存储。因此,应用程序能够绕过操作系统的功能和限制。在openstack社区比较火,做虚机块存储用的很多!

​ GoogleFS:性能十分好,可扩展性强,可靠性强。用于大型的、分布式的、对大数据进行访问的应用。运用在廉价的硬件上。

Gluster存储基础梳理

​ GlusterFS系统是一个可扩展的网络文件系统,相比其他分布式文件系统,GlusterFS具有高扩展性、高可用性、高性能、可横向扩展等特点,并且其没有元数据服务器的设计,让整个服务没有单点故障的隐患。Glusterfs是一个横向扩展的分布式文件系统,就是把多台异构的存储服务器的存储空间整合起来给用户提供统一的命名空间。用户访问存储资源的方式有很多,可以通过NFS,SMB,HTTP协议等访问,还可以通过gluster本身提供的客户端访问。

​ GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBand RDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能;

GlusterFS 适合大文件还是小文件存储?

弹性哈希算法和Stripe 数据分布策略,移除了元数据依赖,优化了数据分布,提高数据访问并行性,能够大幅提高大文件存储的性能。对于小文件,无元数据服务设计解决了元数据的问题。但GlusterFS 并没有在I/O 方面作优化,在存储服务器底层文件系统上仍然是大量小文件,本地文件系统元数据访问是一个瓶颈,数据分布和并行性也无法充分发挥作用。

​ 因此,GlusterFS 适合存储大文件,小文件性能较差,还存在很大优化空间。

应用场景

​ GlusterFS 在企业中应用场景理论和实践上分析,GlusterFS目前主要适用大文件存储场景,对于小文件尤其是海量小文件,存储效率和访问性能都表现不佳。海量小文件LOSF问题是工业界和学术界公认的难题,GlusterFS作为通用的分布式文件系统,并没有对小文件作额外的优化措施,性能不好也是可以理解的;

  • Media: 文档、图片、音频、视频
  • Shared storage: 云存储、虚拟化存储、HPC(高性能计算)
  • Big data: 日志文件、RFID(射频识别)数据

术语

Brick: GlusterFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如'SERVER:EXPORT'。Client:挂载了GlusterFS卷的设备;

GFID: GlusterFS卷中的每个文件或目录都有一个唯一的128位的数据相关联,其用于模拟inode;

Namespace: 每个Gluster卷都导出单个ns作为POSIX的挂载点; Node: 一个拥有若干brick的设备;

RDMA: 远程直接内存访问,支持不通过双方的OS进行直接内存访问; RRDNS: round robin

DNS是一种通过DNS轮转返回不同的设备以进行负载均衡的方法;

Self-heal: 用于后台运行检测复本卷中文件和目录的不一致性并解决这些不一致; Split-brain: 脑裂

Volfile: Glusterfs进程的配置文件,通常位于/var/lib/glusterd/vols/volname;

Volume: 一组bricks的逻辑集合;

Trusted Storage Pool

• 一堆存储节点的集合

• 通过一个节点"邀请"其他节点创建,这里叫probe

• 成员可以动态加入,动态删除

添加命令如下:

bash 复制代码
gluster peer probe node2

删除命令如下:

bash 复制代码
gluster peer detach node3

Brick

Brick是一个节点和一个导出目录的集合,e.g. node1:/brick1

• Brick是底层的RAID或磁盘经XFS或ext4文件系统格式化而来,所以继承了文件系统的限制

• 每个节点上的brick数是不限的

• 理想的状况是,一个集群的所有Brick大小都一样。

Volumes

Volume是brick的逻辑组合

• 创建时命名来识别

• Volume是一个可挂载的目录

• 每个节点上的brick数是不变的,e.g.mount --t glusterfs www.std.com:test /mnt/gls

• 一个节点上的不同brick可以属于不同的卷

• 支持如下种类:

a) 分布式卷

b) 条带卷

c) 复制卷

d) 分布式复制卷

e) 条带复制卷

f) 分布式条带复制卷

1)分布式卷• 文件分布存在不同的brick里

• 目录在每个brick里都可见

• 单个brick失效会带来数据丢失

• 无需额外元数据服务器

2)复制卷

• 同步复制所有的目录和文件

• 节点故障时保持数据高可用

• 事务性操作,保持一致性

• 有changelog

• 副本数任意定

3)分布式复制卷

• 最常见的一种模式

• 读操作可以做到负载均衡

4)条带卷

• 文件切分成一个个的chunk,存放于不同的brick上

• 只建议在非常大的文件时使用(比硬盘大小还大)

• Brick故障会导致数据丢失,建议和复制卷同时使用

• 区块(chunks)是带有空洞的文件------这有助于保持偏移量的一致性

Glusterfs整体工作流程-数据访问流程

a)首先是在客户端, 用户通过glusterfs的mount point 来读写数据, 对于用户来说,集群系统的存在对用户是完全透明的,用户感觉不到是操作本地系统还是远端的集群系统。

b)用户的这个操作被递交给 本地linux系统的VFS来处理。

c)VFS 将数据递交给FUSE 内核文件系统:在启动 glusterfs 客户端以前,需要想系统注册一个实际的文件系统FUSE,如上图所示,该文件系统与ext3在同一个层次上面, ext3 是对实际的磁盘进行处理, 而fuse 文件系统则是将数据通过/dev/fuse 这个设备文件递交给了glusterfs client端。所以, 我们可以将 fuse文件系统理解为一个代理。

d)数据被fuse 递交给Glusterfs client 后, client 对数据进行一些指定的处理(所谓的指定,是按照client 配置文件据来进行的一系列处理, 我们在启动glusterfs client 时需要指定这个文件。

e)在glusterfs client的处理末端,通过网络将数据递交给 Glusterfs Server,并且将数据写入到服务器所控制的存储设备上。

这样, 整个数据流的处理就完成了。

GlusterFS客户端访问流程

当客户端访问GlusterFS存储时,首先程序通过访问挂载点的形式读写数据,对于用户和程序而言,集群文件系统是透明的,用户和程序根本感觉不到文件系统是本地还是在远程服务器上。读写操作将会被交给VFS(Virtual File System)来处理,VFS会将请求交给FUSE内核模块,而FUSE又会通过设备/dev/fuse将数据交给GlusterFS Client。最后经过GlusterFS Client的计算,并最终经过网络将请求或数据发送到GlusterFS Server上;

GlusterFS常用命令

bash 复制代码
# 1 启停和开机启动
systemctl start  glusterd.service
systemctl enable glusterd.service
systemctl status glusterd.service

#2 为存储池添加/移除服务器节点
gluster peer probe <SERVER>
gluster peer detach <SERVER>
#注意,移除节点时,需要提前将该节点上的Brick移除。

# 3查看所有节点的基本状态(不包括本节点):
gluster peer status

# 4 挂载glusterfs
mount -t glusterfs <SERVER>:/<VOLNAME><MOUNTDIR>

#5 创建/启动/停止/删除卷
gluster volume create <NEW-VOLNAME>[stripe <COUNT> \
    | replica <COUNT>] \
    [transport [tcp | rdma | tcp,rdma]] \
    <NEW-BRICK1> <NEW-BRICK2> \
    <NEW-BRICK3> <NEW-BRICK4>...
#force 参数可能用于强制执行一些可能有风险的操作,比如删除卷、移除存储节点等。使用 force 参数可能会绕过一些安全检查或确认步骤,因此需要谨慎使用,以避免意外造成数据丢失或系统不稳定。
gluster volume start <VOLNAME>
gluster volume stop <VOLNAME>
gluster volume delete <VOLNAME>
#注意,删除卷的前提是先停止卷。

# 6 查看卷信息
gluster volume list    #列出集群中的所有卷:
gluster volume info [all]    #查看集群中的卷信息:
gluster volume status [all]    #查看集群中的卷状态:
gluster volume status <VOLNAME> [detail| clients | mem | inode | fd] 

# 7 配置卷
gluster volume set <VOLNAME> <OPTION> <PARAMETER>

# 8  扩展卷
gluster volume add-brick <VOLNAME> <NEW-BRICK>
#如果是复制卷,则每次添加的Brick数必须是replica的整数倍。

# 9 收缩卷
## 9.1 先将数据迁移到其它可用的Brick,迁移结束后才将该Brick移除:
gluster volume remove-brick <VOLNAME> <BRICK> start
#在执行了start之后,可以使用status命令查看移除进度:
gluster volume remove-brick <VOLNAME> <BRICK> status

## 9.2不进行数据迁移,直接删除该Brick:
gluster volume remove-brick <VOLNAME> <BRICK> commit
#注意,如果是复制卷或者条带卷,则每次移除的Brick数必须是replica或者stripe的整数倍。
# 关于收缩卷,线上几乎不会收缩,基本上都是扩容,而且裁剪只能收缩没有数据的,否则可能数据丢失。所以,有些卷是不支持收缩的。

# 10 迁移卷
#使用start命令开始进行迁移
#迁移过程中,可以使用pause命令暂停迁移:
#			可以使用abort命令终止迁移:
#			可以使用status命令查看迁移进度:
#在数据迁移结束后,执行commit命令来进行Brick替换:
gluster volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> start
gluster volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> pause
gluster volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> abort
gluster volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> status
gluster volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> commit

# 11 重新均衡卷
#不迁移数据:
gluster volume rebalance <VOLNAME> lay-outstart
gluster volume rebalance <VOLNAME> start
gluster volume rebalance <VOLNAME> startforce
gluster volume rebalance <VOLNAME> status
gluster volume rebalance <VOLNAME> stop

# 12 磁盘配额
#开启/关闭系统配额:
gluster volume quota <VOLNAME> enable | disable
#设置目录配额:
gluster volume quota <VOLNAME> limit-usage <DIR> <VALUE>
#查看配额:
gluster volume quota <VOLNAME> list [<DIR>]

# 13 地域复制(geo-replication):
gluster volume geo-replication <MASTER> <SLAVE> start | status | stop

# 14 IO信息查看:
gluster volume profile <VOLNAME> start | info | stop

# 15 Top监控:
#Top命令允许你查看Brick的性能,例如:read,write, file open calls, file read calls, file write calls, directory opencalls, and directory real calls。所有的查看都可以设置top数,默认100。

gluster volume top <VOLNAME> open[brick <BRICK>] [list-cnt <COUNT>]
#其中,open可以替换为read, write, opendir, readdir等。

gluster volume top <VOLNAME> read-perf [bs <BLOCK-SIZE> count <COUNT>] [brick <BRICK>] [list-cnt <COUNT>]
#其中,read-perf可以替换为write-perf等。

部署 GlusterFS 群集

服务器 磁盘 挂载点 系统
Node1节点:192.168.99.118 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 centos7.4
Node2节点:192.168.99.119 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 centos7.4
Node3节点:192.168.99.121 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 centos7.4
Node4节点:192.168.99.177 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 centos7.4
客户端节点:192.168.99.179 centos7.4

准备环境(所有node节点上操作)

四台机器分别添加四块硬盘,系统为centos7.4,7.9会有glibc依赖库问题。

关闭防火墙

bash 复制代码
systemctl stop firewalld
setenforce 0

磁盘分区,并挂载

bash 复制代码
#编写脚本
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
# 查看挂载情况
df -h

修改主机名,配置/etc/hosts文件

bash 复制代码
hostnamectl set-hostname node1

echo "192.168.99.118 node1" >> /etc/hosts
echo "192.168.99.119 node2" >> /etc/hosts
echo "192.168.99.121 node3" >> /etc/hosts
echo "192.168.99.177 node4" >> /etc/hosts

安装、启动GlusterFS(所有node节点上操作)

  1. glusterfs:这是 GlusterFS 的客户端软件包。它允许将远程 GlusterFS 卷挂载到本地文件系统上,以便应用程序可以像访问本地文件一样访问远程文件系统中的数据。它实现了 FUSE(Filesystem in Userspace)技术,以在用户态管理文件系统操作。
  2. glusterfs-server:这是 GlusterFS 的服务器软件包。它包含了 GlusterFS 存储服务器的核心组件,用于存储和管理数据。这些服务器一起组成一个分布式存储解决方案,可以将数据分布在多个节点上,提供高可用性和可扩展性。
  3. glusterfs-fuse:这是 GlusterFS FUSE 客户端的依赖软件包。当使用 glusterfs 客户端将 GlusterFS 卷挂载到本地文件系统上时,通常需要安装这个软件包来支持 FUSE 技术。
  4. glusterfs-rdma:这是可选的 GlusterFS 组件,用于启用 RDMA(Remote Direct Memory Access)支持,以提高数据传输的性能和效率。RDMA 是一种高性能的网络传输技术,适用于需要低延迟和高吞吐量的应用场景。这个软件包通常是可选的,根据特定需求决定是否安装。
bash 复制代码
#修改yum源之前先安装pciutils
yum -y install pciutils unzip
# 将gfsrepo.zip上传到/opt目录下解压缩
cd /opt
unzip gfsrepo.zip

#将glfsrepo 软件上传到/opt目录下
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 glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
# 官方目前为9x版本,而6x之后已不再支持条带卷,
# 故本次试验使用3x版本,由于安装gluster-server时依赖的glibc包需要2.17-196版本,故使用centos7.4版本,且进入后不要yum update,否则会导致glibc版本更新
#如采用官方 YUM 源安装,可以直接指向互联网仓库
# 安装server
# yum install -y centos-release-gluster
# yum install -y glusterfs-server

systemctl start glusterd.service 
systemctl enable glusterd.service
systemctl status glusterd.service

添加节点到存储信任池中(在 node1 节点上操作)

bash 复制代码
#只要在一台Node节点上添加其它节点即可
# GlusterFS 将会尝试建立节点之间的对等关系,从而形成一个分布式存储集群,可以共享数据和提供冗余性。
gluster peer probe node1
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4

#在每个Node节点上查看群集状态
gluster peer status

创建卷

根据规划创建如下卷:

卷名 类型 brick
dis-volume 分布式卷 node1-4(/data/sdb1)
stripe-volume 条带卷 node1-2(/data/sdc1)
rep-volume 复制卷 node3-4(/data/sdc1)
dis-stripe 分布式条带卷 node1-4(/data/sdd1)
dis-rep 分布式复制卷 node1-4(/data/sde1)

创建分布式卷(dis-volume)

bash 复制代码
#创建分布式卷,没有指定类型,默认创建的是分布式卷
gluster volume create dis-volume \
node1:/data/sdb1 node2:/data/sdb1 node3:/data/sdb1 node4:/data/sdb1 force  
#在 GlusterFS 中,force选项用于强制操作,即使存在一些潜在的问题或警告。GlusterFS 在创建卷时会检查相关的条件和限制,如果发现问题或者不符合要求,就会拒绝创建卷并返回相应的错误信息。

#查看卷列表
gluster volume list
#启动新建分布式卷
gluster volume start dis-volume
#查看创建分布式卷信息
gluster volume info dis-volume

创建条带卷(stripe-volume)

bash 复制代码
#指定类型为 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

创建复制卷(rep-volume)

bash 复制代码
#指定类型为 replica,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是复制卷
gluster volume create rep-volume replica 2 node3:/data/sdc1 node4:/data/sdc1 force
gluster volume start rep-volume
gluster volume info rep-volume

创建分布式条带卷(dis-stripe)

bash 复制代码
#指定类型为 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

创建分布式复制卷(dis-rep)

bash 复制代码
#指定类型为 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

部署 Gluster 客户端

安装客户端软件

bash 复制代码
#将gfsrepo 软件上传到/opt目下 
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 glusterfs glusterfs-fuse

创建挂载目录

bash 复制代码
mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
ls /test

配置 /etc/hosts 文件

挂载 Gluster 文件系统

bash 复制代码
#临时挂载
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
bash 复制代码
 df -Th

对五种卷进行文件测试

卷中写入文件,客户端操作

bash 复制代码
cd /opt
dd if=/dev/zero of=/opt/demo1.log bs=1M count=40
dd if=/dev/zero of=/opt/demo2.log bs=1M count=40
dd if=/dev/zero of=/opt/demo3.log bs=1M count=40
dd if=/dev/zero of=/opt/demo4.log bs=1M count=40
dd if=/dev/zero of=/opt/demo5.log bs=1M count=40
bash 复制代码
 ls -lh /opt
bash 复制代码
cp -i /opt/demo* /test/dis/
cp -i /opt/demo* /test/stripe/
cp -i /opt/demo* /test/rep/
cp -i /opt/demo* /test/dis_stripe/
cp -i /opt/demo* /test/dis_rep/

服务端查看文件分布

bash 复制代码
#查看分布式文件分布
#node1
ls -lh /data/sdb1
#node2
ll -h /data/sdb1
#node4
ll -h /data/sdb1



bash 复制代码
#查看条带卷文件分布
#node1
 ls -lh /data/sdc1      
 #数据被分片50% 没副本 没冗余
 #node2
 ls -lh /data/sdc1


bash 复制代码
#查看复制卷分布
#node3
 ll -h /data/sdc1
 #数据没有被分片 有副本 有冗余 
#node4 
ll -h /data/sdc1        
#数据没有被分片 有副本 有冗余 


bash 复制代码
#查看分布式条带卷分布
#node1、2、3、4
ll -h /data/sdd1 



bash 复制代码
#查看分布式复制卷分布        
#数据没有被分片 有副本 有冗余
ll -h /data/sde1




破坏性测试

bash 复制代码
#挂起 node2 节点或者关闭glusterd服务来模拟故障
#systemctl stop glusterd.service
#或者关闭虚拟机
shutdown -h now
bash 复制代码
#在客户端上查看文件是否正常
#分布式卷数据查看
ll /test/dis/ 
bash 复制代码
#条带卷
cd /test/stripe/  #无法访问,条带卷不具备冗余性
bash 复制代码
#分布式条带卷
 ll /test/dis_stripe/  #无法访问,分布条带卷不具备冗余性
bash 复制代码
#分布式复制卷
ll /test/dis_rep/    #可以访问,分布式复制卷具备冗余性
bash 复制代码
#挂起 node2 和 node4 节点,在客户端上查看文件是否正常
#测试复制卷是否正常
ls -l /test/rep/  #在客户机上测试正常 数据有
bash 复制代码
#测试分布式条卷是否正常
 ll /test/dis_stripe/  #在客户机上测试没有数据 
bash 复制代码
#测试分布式复制卷是否正常
 ll /test/dis_rep/  #在客户机上测试正常 有数据

对分布式卷进行扩容缩容实验

bash 复制代码
gluster volume info dis-volume

挂载新硬盘sdf1

扩容

bash 复制代码
#增加一个brick
 gluster volume add-brick dis-volume node3:/data/sdf1 force
 gluster volume rebalance dis-volume start force


缩容

bash 复制代码
gluster volume rebalance dis-volume start force
gluster volume remove-brick dis-volume node3:/data/sdf1 force
y

yum安装glusterfs对三种基本卷进行测试

服务器 磁盘 挂载点 系统
Node1节点:192.168.99.118 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 centos7.4
Node2节点:192.168.99.119 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /data/sdb1 /data/sdc1 /data/sdd1 /data/sde1 centos7.4
bash 复制代码
chmod +x /opt/fdisk.sh
cd /opt/
#执行脚本
./fdisk.sh
# 查看挂载情况
df -h
bash 复制代码
 yum install -y centos-release-gluster
 yum install -y glusterfs-server
bash 复制代码
gluster peer probe node1
gluster peer probe node2

根据规划创建如下卷:

卷名 类型 brick
dis-volume 分布式卷 node1-4(/data/sdb1)
stripe-volume 条带卷 node1-2(/data/sdc1)
rep-volume 复制卷 node3-4(/data/sdc1)

创建分布式卷(dis-volume)

bash 复制代码
#创建分布式卷,没有指定类型,默认创建的是分布式卷
gluster volume create dis-volume \
node1:/data/sdb1 node2:/data/sdb1 force
#在 GlusterFS 中,force选项用于强制操作,即使存在一些潜在的问题或警告。GlusterFS 在创建卷时会检查相关的条件和限制,如果发现问题或者不符合要求,就会拒绝创建卷并返回相应的错误信息。

#查看卷列表
gluster volume list
#启动新建分布式卷
gluster volume start dis-volume
#查看创建分布式卷信息
gluster volume info dis-volume

创建条带卷(stripe-volume)

bash 复制代码
#指定类型为 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

失败

创建复制卷(rep-volume)

bash 复制代码
#指定类型为 replica,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是复制卷
gluster volume create rep-volume replica 2 node1:/data/sdd1 node2:/data/sdd1 force
gluster volume start rep-volume
gluster volume info rep-volume
相关推荐
wainyz5 分钟前
Java NIO操作
java·开发语言·nio
喵叔哟14 分钟前
重构代码之用委托替代继承
开发语言·重构
lzb_kkk19 分钟前
【JavaEE】JUC的常见类
java·开发语言·java-ee
SEEONTIME19 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
起名字真南38 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
明达技术1 小时前
物联优化汽车齿轮锻造
分布式·物联网
tyler_download1 小时前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~1 小时前
qt5将程序打包并使用
开发语言·qt
hlsd#1 小时前
go mod 依赖管理
开发语言·后端·golang
小春学渗透1 小时前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc