分布式存储之glusterfs
任务要求
1, 将远程多台服务器的空闲存储空间整合,组合成一个大存储给应用服务器(如apache,nginx,tomcat,mysql等)使用
2, 考虑高可用与负载均衡原则,并能实现在线扩容
任务拆解
1, 了解分布式存储的概念与原理
2, 选择对应的分布式存储软件
3, 准备多台有空闲空间的服务器做存储服务器
4, 搭建集群将多台存储服务器组合
5, 将组合的大存储划分成卷共享给应用服务器使用
6, 实现在线扩容
学习目标
- 能够说出分布式存储的优点
- 能够成功搭建glusterfs集群
- 掌握常见的glusterfs卷模式的创建与使用
- 能够对特定的glusterfs卷实现在线裁减或扩容
分布式存储介绍
我们已经学习了NAS是远程通过网络共享目录, SAN是远程通过网络共享块设备。
那么分布式存储你可以看作==拥有多台存储服务器连接起来的存储导出端==。把这多台存储服务器的存储合起来做成一个整体再通过网络进行远程共享,共享的方式有目录(文件存储),块设备(块存储),对象网关或者说一个程序接口(对象存储)。
常见的分布式存储开源软件有:GlusterFS,Ceph,HDFS,MooseFS,FastDFS等。
分布式存储一般都有以下几个优点:
-
扩容方便,轻松达到PB级别或以上
-
提升读写性能(LB)或数据高可用(HA)
-
避免单个节点故障导致整个架构问题
-
价格相对便宜,大量的廉价设备就可以组成,比光纤SAN这种便宜很多
Glusterfs
glusterfs介绍
glusterfs是一个免费,开源的分布式文件系统(它属于文件存储类型)。
raid级别回顾(拓展)
raid级别有很多种,下面主要介绍常用的几种:
raid0 读写性能佳,坏了其中一块,数据挂掉,可靠性低(stripe条带化),磁盘利用率100%
raid1 镜像备份(mirror),同一份数据完整的保存在多个磁盘上,写的性能不佳,可靠性高,读的性能还行,磁盘利用率50%
raid10 先做raid 1 再做raid 0
raid5 由多块磁盘做raid 5,磁盘利用率为n-1/n, 其中一块放校验数据,允许坏一块盘,数据可以利用校验值来恢复
raid6 在raid5的基础上再加一块校验盘,进一步提高数据可靠性
生产环境中最常用的为raid5和raid10
常见卷的模式
卷模式 | 描述 |
---|---|
Replicated | 复制卷,类似raid1 |
Striped(了解,新版本将会放弃此模式及其它相关的组合模式) | 条带卷,类似raid0 |
Distributed | 分布卷 |
Distribute Replicated | 分布与复制组合 |
Dispersed | 纠删卷,类似raid5,raid6 |
glusterfs看作是一个将多台服务器存储空间组合到一起,再划分出不同类型的文件存储卷给导入端使用。
Replicated卷
Striped卷
Distributed卷
Distribute Replicated卷
其它模式请参考官网: https://docs.gluster.org/en/latest/Administrator%20Guide/Setting%20Up%20Volumes/
glusterfs集群
实验准备:
-
所有节点(包括client)静态IP(NAT网络,能上外网)
-
所有节点(包括client)都配置主机名及其主机名互相绑定(这次我这里做了别名,方便使用)
10.1.1.11 vm1.cluster.com storage1
10.1.1.12 vm2.cluster.com storage2
10.1.1.13 vm3.cluster.com storage3
10.1.1.14 vm4.cluster.com storage4
10.1.1.15 vm5.cluster.com client
-
所有节点(包括client)关闭防火墙,selinux
# systemctl stop firewalld
# systemctl disable firewalld
# iptables -F -
所有节点(包括client)时间同步
-
所有节点(包括client)配置好yum(需要加上glusterfs官方yum源)
# vim /etc/yum.repos.d/glusterfs.repo
[glusterfs]
name=glusterfs
baseurl=https://buildlogs.centos.org/centos/7/storage/x86_64/gluster-4.1/
enabled=1
gpgcheck=0
yum源说明:
-
可按照以上yum路径去查找
glusterfs5
或glusterfs6
版本的yum源路径(目前我们使用4.1版) -
如果网速太慢,可下载我共享的软件做本地yum源安装
实验步骤:
-
在所有storage服务器上安装相关软件包,并启动服务
-
所有storage服务器建立连接, 成为一个集群
-
所有storage服务器准备存储目录
-
创建存储卷
-
启动存储卷
-
client安装挂载软件
-
client挂载使用
实验过程:
第1步, 在所有storage服务器上(不包括client)安装glusterfs-server软件包,并启动服务
下面的命令所有存储服务器都要做
# yum install glusterfs-server -y
# systemctl start glusterd
# systemctl enable glusterd
# systemctl status glusterd
分布式集群一般有两种架构:
-
有中心节点的 中心节点一般指管理节点,后面大部分分布式集群架构都属于这一种
-
无中心节点的 所有节点又管理又做事,glusterfs属于这一种
第2步, 所有storage服务器建立连接,成为一个集群
4个storage服务器建立连接不用两两连接,只需要找其中1个,连接另外3个各一次就OK了
下面我就在storage1上操作
storage1# gluster peer probe storage2
storage1# gluster peer probe storage3
storage1# gluster peer probe storage4 --这里使用ip,主机名,主机名别名都可以
然后在所有存储上都可以使用下面命令来验证检查
# gluster peer status
==注意==:
如果这一步建立连接有问题(一般问题会出现在网络连接,防火墙,selinux,主机名绑定等);
如果想重做这一步,可以使用gluster peer detach xxxxx [force] 来断开连接,重新做
第3步, 所有storage服务器准备存储目录(可以用单独的分区,也可以使用根分区)
因为我让大家准备的storage服务器没有准备额外的硬盘,所以这里用根分区来做实验
但生产环境肯定是不建议数据盘和系统盘在一起的
# mkdir -p /data/gv0
第4步, 创建存储卷(在任意一个storage服务器上做)
==注意==: ==改变的操作(create,delete,start,stop)等只需要在任意一个storage服务器上操作,查看的操作(info)等可以在所有storage服务器上操作==
下面命令我是在storage1上操作的
因为在根分区创建所以需要force参数强制
replica 4表示是在4台上做复制模式(类似raid1)
storage1# gluster volume create gv0 replica 4 storage1:/data/gv0/ storage2:/data/gv0/ storage3:/data/gv0/ storage4:/data/gv0/ force
volume create: gv0: success: please start the volume to access data
所有storage服务器上都可以查看
# gluster volume info gv0
Volume Name: gv0
Type: Replicate 模式为replicate模式
Volume ID: 328d3d55-4506-4c45-a38f-f8748bdf1da6
Status: Created 这里状态为created,表示刚创建,还未启动,需要启动才能使用
Snapshot Count: 0
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: storage1:/data/gv0
Brick2: storage2:/data/gv0
Brick3: storage3:/data/gv0
Brick4: storage4:/data/gv0
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
第5步, 启动存储卷
storage1# gluster volume start gv0
# gluster volume info gv0
Volume Name: gv0
Type: Replicate
Volume ID: 328d3d55-4506-4c45-a38f-f8748bdf1da6
Status: Started 现在看到状态变为started,那么就表示可以被客户端挂载使用了
Snapshot Count: 0
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: storage1:/data/gv0
Brick2: storage2:/data/gv0
Brick3: storage3:/data/gv0
Brick4: storage4:/data/gv0
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
第6步, client安装软件
客户端上操作
client# yum install glusterfs glusterfs-fuse -y
说明:
fuse(Filesystem in Userspace): 用户空间文件系统,是一个客户端挂载远程文件存储的模块
第7步, client挂载使用
==注意==:客户端也需要在/etc/hosts文件里绑定存储节点的主机名,才可以挂载(因为我前面做的步骤是用名字的)
client# mkdir /test0
client# mount -t glusterfs storage1:gv0 /test0
这里client是挂载storage1,也可以挂载storage2,storage3,storage4任意一个。(也就是说这4个storage既是老板,又是员工。这是glusterfs的一个特点,其它的分布式存储软件基本上都会有专门的管理server)
服务端安装过程如下:
[root@mcw01 ~]# vim /etc/hosts [root@mcw01 ~]# vim /etc/yum.repos.d/glusterfs.repo [root@mcw01 ~]# yum install glusterfs-server ........ Installed: glusterfs-server.x86_64 0:4.1.10-1.el7 Dependency Installed: attr.x86_64 0:2.4.46-13.el7 glusterfs.x86_64 0:4.1.10-1.el7 glusterfs-api.x86_64 0:4.1.10-1.el7 glusterfs-cli.x86_64 0:4.1.10-1.el7 glusterfs-client-xlators.x86_64 0:4.1.10-1.el7 glusterfs-fuse.x86_64 0:4.1.10-1.el7 glusterfs-libs.x86_64 0:4.1.10-1.el7 libtirpc.x86_64 0:0.2.4-0.16.el7 psmisc.x86_64 0:22.20-17.el7 rpcbind.x86_64 0:0.2.0-49.el7 userspace-rcu.x86_64 0:0.10.0-3.el7 Dependency Updated: libattr.x86_64 0:2.4.46-13.el7 Complete! [root@mcw01 ~]# systemctl start glusterd [root@mcw01 ~]# systemctl enable glusterd Created symlink from /etc/systemd/system/multi-user.target.wants/glusterd.service to /usr/lib/systemd/system/glusterd.service. [root@mcw01 ~]# systemctl status glusterd ● glusterd.service - GlusterFS, a clustered file-system server Loaded: loaded (/usr/lib/systemd/system/glusterd.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2023-03-05 21:09:58 CST; 16s ago Main PID: 6757 (glusterd) CGroup: /system.slice/glusterd.service └─6757 /usr/sbin/glusterd -p /var/run/glusterd.pid --log-level INFO Mar 05 21:09:58 mcw01 systemd[1]: Starting GlusterFS, a clustered file-system server... Mar 05 21:09:58 mcw01 systemd[1]: Started GlusterFS, a clustered file-system server. [root@mcw01 ~]# gluster peer probe storage2 peer probe: success. [root@mcw01 ~]# gluster peer probe storage3 peer probe: success. [root@mcw01 ~]# gluster peer probe storage4 peer probe: success. [root@mcw01 ~]# gluster peer status Number of Peers: 3 Hostname: storage2 Uuid: f5634de1-531e-4523-bb88-4f757b996b6a State: Peer in Cluster (Connected) Hostname: storage3 Uuid: dfea8e2a-eb07-4786-ae8b-e603ef2ecf38 State: Peer in Cluster (Connected) Hostname: storage4 Uuid: 06584a4d-c2c2-40b2-9c55-9b06933911c7 State: Peer in Cluster (Connected) [root@mcw01 ~]# mkdir -p /data/gv0 [root@mcw01 ~]# gluster volume create gv0 replica 4 storage1:/data/gv0/ storage2:/data/gv0/ storage3:/data/gv0/ storage4:/data/gv0/ force volume create: gv0: failed: Locking failed on storage2. Please check log file for details. # Unable to acquire lock for gv0可以看到日志显示无法获取到锁,是因为我同时在四个节点上执行命令了,这个创建命令只需要一个节点执行就行,多个一起执行发生了死锁 Locking failed on storage3. Please check log file for details. Locking failed on storage4. Please check log file for details. [root@mcw01 ~]# gluster volume create gv0 replica 4 storage1:/data/gv0/ storage2:/data/gv0/ storage3:/data/gv0/ storage4:/data/gv0/ force volume create: gv0: success: please start the volume to access data [root@mcw01 ~]# gluster volume info gv0 Volume Name: gv0 Type: Replicate Volume ID: 413a0541-622b-4558-8290-7c2be515f3e4 Status: Created Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv0 Brick2: storage2:/data/gv0 Brick3: storage3:/data/gv0 Brick4: storage4:/data/gv0 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off [root@mcw01 ~]# gluster volume start gv0 volume start: gv0: success [root@mcw01 ~]# gluster volume info gv0 Volume Name: gv0 Type: Replicate Volume ID: 413a0541-622b-4558-8290-7c2be515f3e4 Status: Started Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv0 Brick2: storage2:/data/gv0 Brick3: storage3:/data/gv0 Brick4: storage4:/data/gv0 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off [root@mcw01 ~]#
replica卷测试
读写测试方法:
在客户端使用dd命令往挂载目录里写文件,然后查看在storage服务器上的分布情况(具体验证详细过程参考授课视频)
(==注意: 读写操作请都在客户端进行,不要在storage服务器上操作==)
client# dd if=/dev/zero of=/test0/file1 bs=1M count=100
-
读写测试结果: 结果类似raid1
-
同读同写测试: 有条件的可以再开一台虚拟机做为client2,两个客户端挂载gv0后实现同读同写(文件存储类型的特点)
运维思想:
搭建OK后,你要考虑性能,稳定, 高可用,负载均衡,健康检查, 扩展性等
如果某一个节点挂了,你要考虑是什么挂了(网卡,服务,进程,服务器关闭了),如何解决?
请测试如下几种情况:
-
将其中一个storage节点关机
客户端需要等待10几秒钟才能正常继续使用,再次启动数据就正常同步过去(这里演练是将存储节点1关闭,然后在客户端执行df -h可能会卡一下。客户端此时创建文件,节点2,3,4都创建了,但是没有达到4个副本,当节点1重新起来,节点1上就很快同步创建了这个新建的文件)
-
将其中一个storage节点网卡down掉
客户端需要等待10几秒钟才能正常继续使用,再次启动数据就正常同步过去
-
将其中一个storage节点glusterfs相关的进程kill掉
客户端无需等待就能正常继续使用,但写数据不会同步到挂掉的storage节点,等它进程再次启动就可以同步过去了
结论: 作为一名运维工程师,HA场景有不同的挂法:
-
服务器关闭
-
网卡坏了
-
网线断了
-
交换机挂了
-
服务进程被误杀等等
但我们需要去考虑,当软件无法把我们全自动实现时,我们可能需要使用脚本来辅助。有一个简单的方法为: 如果一个节点没死透,我们就干脆将它关机,让它死透😂
请参考拓展: RHCS,pacemaker里的fence,stonish(shoot the other node in the head)等概念。
将其中一个storage节点glusterfs相关的进程kill掉,客户端无需等待就能正常继续使用,但写数据不会同步到挂掉的storage节点,等它进程再次启动就可以同步过去了
(如果只是将glusterfsd stop掉,那么当客户端写个文件,可以看到文件还是同步过来了(666文件)。我们查看端口,可以看到还有个端口开启着,名称前面是进程6974,我们杀掉进程,
当我们把上面那个进程也杀掉,客户端创建文件,就不会同步到这个节点了。但是当这个节点服务重新启动,着两个端口都起来了,那么客户端后来创建的文件777又同步创建出来了。
读写测试演练
我们在客户端上挂载gv0。mcw05是客户端,安装了glusterfs glusterfs-fuse,mcw01-04是glusterfs的存储服务端,在存储端创建的gv是4个副本的方式创建,是各个节点的/data/gv0目录作为存储目录。存储服务端都安装了glusterfs-server包。
在任意一个存储节点查看gv的信息
我们通过上面的信息可以看到 1*4,4个副本,有三个是冗余的,有三个备份,客户在mcw05上看到的是19G,它买了19G的存储,但是由于存储服务器我们用了分布式存储,是有备份的,相当于是19*4,而客户是不需要知道后面是什么样的,他买了19g,只需要在使用时,他看到的都是他的19G就可以了。因此,在客户这里使用的时候,后面的分布式存储多出的空间,客户是不可见的,不可感知的,如下,创建了100M的,在挂载gv的目录下,他看见的也是100M,如果他看到分布式存储的,创建100M,看到的是100*4M,那肯定也不合理
对于客户来说,是创建了100M文件,对于存储运维人员来看,是创建了副本(4)个100M文件
我们一般情况下,两个副本就可以了,这样另外两个节点又可以创建另外一个卷。这样就省很多空间
存储同读同写操作与高可用进阶
我们来看下什么是数据共享。我们新开一台机器mcw06,安装好客户端包之后,创建目录,添加dns解析。然和挂载上分布式文件系统。指定是存储2节点的gv0,和客户端1 也就是mcw05是一样的,虽然mcw05上指定的节点是节点1,但是没有区别的。我们看下test0下,已经能看到之前在mcw05上创建的文件了。
客户端主机5上创建文件,主机6上可以看到,反之亦然
如下情况,我们就可以使用分布式存储,即使一个web服务器,也就是一个客户端挂掉了,但是另一台依然可以正常读写数据到存储服务器,而且存储服务器是多副本的。即使挂了一个web服务器,因为另一个web还在运行,我们即使重装这个挂掉的web服务器,然后重新挂载到分布式存储,依然是正常使用,
卷的删除
第1步: 先在客户端umount已经挂载的目录(在umount之前把测试的数据先删除)
client# rm /test0/* -rf
client# umount /test0
第2步: 在任一个storage服务器上使用下面的命令停止gv0并删除,我这里是在storage1上操作
storage1# gluster volume stop gv0
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: gv0: success
storage1# gluster volume delete gv0
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: gv0: success
第3步: 在所有storage服务器上都可以查看,没有gv0的信息了,说明这个volumn被删除了
# gluster volume info gv0
Volume gv0 does not exist
问题: 我在不删除gv0的情况下,能否再创建一个叫gv1的卷?
当然可以,换个目录再创建就OK
现有gv下再创建gv演练
查看gv0信息 gluster volume info gv0 [root@mcw01 ~]# gluster volume info gv0 Volume Name: gv0 Type: Replicate Volume ID: 413a0541-622b-4558-8290-7c2be515f3e4 Status: Started Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv0 Brick2: storage2:/data/gv0 Brick3: storage3:/data/gv0 Brick4: storage4:/data/gv0 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off [root@mcw01 ~]# 查看mcw01的存储内容 [root@mcw01 ~]# ls /data/ gv0 [root@mcw01 ~]# ls -l /data/ total 0 drwxr-xr-x 3 root root 70 Mar 5 22:31 gv0 [root@mcw01 ~]# ls -l /data/gv0/ total 102412 -rw-r--r-- 2 root root 4 Mar 5 21:54 111 -rw-r--r-- 2 root root 4 Mar 5 22:29 222 -rw-r--r-- 2 root root 4 Mar 5 22:31 333 -rw-r--r-- 2 root root 104857600 Mar 5 21:55 file1 [root@mcw01 ~]# 查看mcw02的存储内容 [root@mcw02 ~]# ls -l /data/gv0/ total 102412 -rw-r--r-- 2 root root 4 Mar 5 21:54 111 -rw-r--r-- 2 root root 4 Mar 5 22:29 222 -rw-r--r-- 2 root root 4 Mar 5 22:31 333 -rw-r--r-- 2 root root 104857600 Mar 5 21:55 file1 [root@mcw02 ~]# 查看mcw05客户端1的挂载情况 [root@mcw05 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 1.9G 18G 10% / devtmpfs 973M 0 973M 0% /dev tmpfs 984M 0 984M 0% /dev/shm tmpfs 984M 8.7M 975M 1% /run tmpfs 984M 0 984M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 197M 0 197M 0% /run/user/0 storage1:gv0 19G 12G 7.8G 59% /test0 [root@mcw05 ~]# ls -l /test0/ total 102402 -rw-r--r-- 1 root root 4 Mar 5 21:54 111 -rw-r--r-- 1 root root 4 Mar 5 22:29 222 -rw-r--r-- 1 root root 4 Mar 5 22:31 333 -rw-r--r-- 1 root root 104857600 Mar 5 21:55 file1 [root@mcw05 ~]# 查看mcw06客户端2的挂载情况 [root@mcw06 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 1.6G 18G 9% / devtmpfs 478M 0 478M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.8M 482M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 1014M 125M 890M 13% /boot tmpfs 98M 0 98M 0% /run/user/0 storage2:gv0 19G 12G 7.8G 59% /test0 [root@mcw06 ~]# ls -lh /test0/ total 101M -rw-r--r-- 1 root root 4 Mar 5 21:54 111 -rw-r--r-- 1 root root 4 Mar 5 22:29 222 -rw-r--r-- 1 root root 4 Mar 5 22:31 333 -rw-r--r-- 1 root root 100M Mar 5 21:55 file1 [root@mcw06 ~]# 创建gv 目录在四个节点都创建,其它只要选择一个节点创建就行,我在存储节点1上操作 [root@mcw01 ~]# mkdir -p /data/gv1 [root@mcw01 ~]# gluster volume create gv1 replica 4 storage1:/data/gv1/ storage2:/data/gv1/ storage3:/data/gv1/ storage4:/data/gv1/ force volume create: gv1: success: please start the volume to access data [root@mcw01 ~]# gluster volume info gv1 Volume Name: gv1 Type: Replicate Volume ID: 059f0871-c731-452b-8fcc-7ce6fe0c6b3b Status: Created Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv1 Brick2: storage2:/data/gv1 Brick3: storage3:/data/gv1 Brick4: storage4:/data/gv1 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off [root@mcw01 ~]# 开启gv [root@mcw01 ~]# gluster volume start gv1 volume start: gv1: success [root@mcw01 ~]# gluster volume info gv1 Volume Name: gv1 Type: Replicate Volume ID: 059f0871-c731-452b-8fcc-7ce6fe0c6b3b Status: Started Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv1 Brick2: storage2:/data/gv1 Brick3: storage3:/data/gv1 Brick4: storage4:/data/gv1 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off [root@mcw01 ~]# 查看数据存储目录 [root@mcw01 ~]# ls -l /data/ total 0 drwxr-xr-x 3 root root 70 Mar 5 22:31 gv0 drwxr-xr-x 3 root root 24 Mar 6 21:47 gv1 [root@mcw01 ~]# tree /data/ /data/ ├── gv0 │ ├── 111 │ ├── 222 │ ├── 333 │ └── file1 └── gv1 2 directories, 4 files [root@mcw01 ~]#
删除gv演练
mcw05客户端1上创建目录并挂载使用 [root@mcw05 ~]# mkdir /test1 [root@mcw05 ~]# mount.glusterfs storage1:gv1 /test1 [root@mcw05 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 1.9G 18G 10% / devtmpfs 973M 0 973M 0% /dev tmpfs 984M 0 984M 0% /dev/shm tmpfs 984M 8.7M 975M 1% /run tmpfs 984M 0 984M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 197M 0 197M 0% /run/user/0 storage1:gv0 19G 12G 7.9G 59% /test0 storage1:gv1 19G 12G 7.9G 59% /test1 [root@mcw05 ~]# [root@mcw05 ~]# echo gv1 > /test1/gv1.txt [root@mcw05 ~]# ls /test1/gv1.txt /test1/gv1.txt [root@mcw05 ~]# cat /test1/gv1.txt gv1 [root@mcw05 ~]# 先删除mcw05上的数据再卸载 [root@mcw05 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 1.9G 18G 10% / devtmpfs 973M 0 973M 0% /dev tmpfs 984M 0 984M 0% /dev/shm tmpfs 984M 8.7M 975M 1% /run tmpfs 984M 0 984M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 197M 0 197M 0% /run/user/0 storage1:gv0 19G 12G 7.9G 59% /test0 storage1:gv1 19G 12G 7.9G 59% /test1 [root@mcw05 ~]# ls /test1/ gv1.txt [root@mcw05 ~]# rm -rf /test1/* [root@mcw05 ~]# ls /test1/ [root@mcw05 ~]# umount /test1 [root@mcw05 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 1.9G 18G 10% / devtmpfs 973M 0 973M 0% /dev tmpfs 984M 0 984M 0% /dev/shm tmpfs 984M 8.7M 975M 1% /run tmpfs 984M 0 984M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 197M 0 197M 0% /run/user/0 storage1:gv0 19G 12G 7.9G 59% /test0 [root@mcw05 ~]# ls /test1/ [root@mcw05 ~]# 停止gv1 [root@mcw01 ~]# gluster volume info gv1 Volume Name: gv1 Type: Replicate Volume ID: 059f0871-c731-452b-8fcc-7ce6fe0c6b3b Status: Started Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv1 Brick2: storage2:/data/gv1 Brick3: storage3:/data/gv1 Brick4: storage4:/data/gv1 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off [root@mcw01 ~]# [root@mcw01 ~]# gluster volume stop gv1 Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y volume stop: gv1: success [root@mcw01 ~]# gluster volume info gv1 Volume Name: gv1 Type: Replicate Volume ID: 059f0871-c731-452b-8fcc-7ce6fe0c6b3b Status: Stopped Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv1 Brick2: storage2:/data/gv1 Brick3: storage3:/data/gv1 Brick4: storage4:/data/gv1 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off [root@mcw01 ~]# 删除gv1 [root@mcw01 ~]# gluster volume stop gv1 Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y volume stop: gv1: success [root@mcw01 ~]# gluster volume info gv1 Volume Name: gv1 Type: Replicate Volume ID: 059f0871-c731-452b-8fcc-7ce6fe0c6b3b Status: Stopped Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv1 Brick2: storage2:/data/gv1 Brick3: storage3:/data/gv1 Brick4: storage4:/data/gv1 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off [root@mcw01 ~]# [root@mcw01 ~]# [root@mcw01 ~]# [root@mcw01 ~]# gluster volume delete gv1 Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y volume delete: gv1: success [root@mcw01 ~]# 检查所有存储节点都没有gv1了 [root@mcw01 ~]# gluster volume info gv1 Volume gv1 does not exist [root@mcw01 ~]# [root@mcw02 ~]# gluster volume info gv1 Volume gv1 does not exist [root@mcw02 ~]# [root@mcw03 ~]# gluster volume info gv1 Volume gv1 does not exist [root@mcw03 ~]# [root@mcw04 ~]# gluster volume info gv1 Volume gv1 does not exist [root@mcw04 ~]# 删除gv1,但是gv1的目录还存在 数据在之前就已经删除了, root@mcw01 ~]# [root@mcw01 ~]# ls -lh /data/ total 0 drwxr-xr-x 3 root root 70 Mar 5 22:31 gv0 drwxr-xr-x 3 root root 24 Mar 6 22:01 gv1 [root@mcw01 ~]# ls -lh /data/gv1/ total 0 [root@mcw01 ~]# 客户端目录卸载之前,就已经把数据删了,数据删了就已经同步到各个存储节点删除了 如果该gv下还有数据,当删除该gv时是否会有影响。有时间验证 [root@mcw05 ~]# ls /test0/ 111 222 333 file1 [root@mcw05 ~]# rm -rf /test0/333 [root@mcw05 ~]# ls /test0/ 111 222 file1 [root@mcw05 ~]# [root@mcw01 ~]# ls -lh /data/gv0 total 101M -rw-r--r-- 2 root root 4 Mar 5 21:54 111 -rw-r--r-- 2 root root 4 Mar 5 22:29 222 -rw-r--r-- 2 root root 4 Mar 5 22:31 333 -rw-r--r-- 2 root root 100M Mar 5 21:55 file1 [root@mcw01 ~]# [root@mcw01 ~]# ls -lh /data/gv0 total 101M -rw-r--r-- 2 root root 4 Mar 5 21:54 111 -rw-r--r-- 2 root root 4 Mar 5 22:29 222 -rw-r--r-- 2 root root 100M Mar 5 21:55 file1 [root@mcw01 ~]# [root@mcw02 ~]# ls -lh /data/gv0/ total 101M -rw-r--r-- 2 root root 4 Mar 5 21:54 111 -rw-r--r-- 2 root root 4 Mar 5 22:29 222 -rw-r--r-- 2 root root 100M Mar 5 21:55 file1 [root@mcw02 ~]#
如果该gv下还有数据,当删除该gv时是否会有影响,或者是有客户端没有卸载时就删除gv是否有影响
使用之前创建的目录重新创建gv [root@mcw01 ~]# gluster volume create gv1 replica 4 storage1:/data/gv1/ storage2:/data/gv1/ storage3:/data/gv1/ storage4:/data/gv1/ force volume create: gv1: success: please start the volume to access data [root@mcw01 ~]# gluster volume info gv1 Volume Name: gv1 Type: Replicate Volume ID: fc3dbc16-6b20-498f-9098-d30e56b4b213 Status: Created Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv1 Brick2: storage2:/data/gv1 Brick3: storage3:/data/gv1 Brick4: storage4:/data/gv1 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off [root@mcw01 ~]# gluster volume start gv1 volume start: gv1: success [root@mcw01 ~]# gluster volume info gv1 Volume Name: gv1 Type: Replicate Volume ID: fc3dbc16-6b20-498f-9098-d30e56b4b213 Status: Started Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv1 Brick2: storage2:/data/gv1 Brick3: storage3:/data/gv1 Brick4: storage4:/data/gv1 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off [root@mcw01 ~]# 客户端挂载使用 [root@mcw05 ~]# [root@mcw05 ~]# ls /test1/ [root@mcw05 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 1.9G 18G 10% / devtmpfs 973M 0 973M 0% /dev tmpfs 984M 0 984M 0% /dev/shm tmpfs 984M 8.7M 975M 1% /run tmpfs 984M 0 984M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 197M 0 197M 0% /run/user/0 storage1:gv0 19G 12G 7.9G 59% /test0 [root@mcw05 ~]# mount.glusterfs storge4:gv1 /test1 Mounting glusterfs on /test1 failed. [root@mcw05 ~]# mount.glusterfs storage4:gv1 /test1 [root@mcw05 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 1.9G 18G 10% / devtmpfs 973M 0 973M 0% /dev tmpfs 984M 0 984M 0% /dev/shm tmpfs 984M 8.7M 975M 1% /run tmpfs 984M 0 984M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 197M 0 197M 0% /run/user/0 storage1:gv0 19G 12G 7.9G 59% /test0 storage4:gv1 19G 12G 7.9G 59% /test1 [root@mcw05 ~]# echo xiaoma > /test1/xiaoma.txt [root@mcw05 ~]# 客户端没有卸载,直接删除gv1,如果gv没有停止,那么会删除失败 [root@mcw01 ~]# [root@mcw01 ~]# gluster volume info gv1 Volume Name: gv1 Type: Replicate Volume ID: fc3dbc16-6b20-498f-9098-d30e56b4b213 Status: Started Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv1 Brick2: storage2:/data/gv1 Brick3: storage3:/data/gv1 Brick4: storage4:/data/gv1 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off [root@mcw01 ~]# [root@mcw01 ~]# gluster volume delete gv0 # Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y volume delete: gv0: failed: Volume gv0 has been started.Volume needs to be stopped before deletion. [root@mcw01 ~]# [root@mcw01 ~]# gluster volume stop gv1 Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y volume stop: gv1: success [root@mcw01 ~]# [root@mcw01 ~]# gluster volume delete gv1 Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y volume delete: gv1: success [root@mcw01 ~]# ls /data/gv1/ xiaoma.txt [root@mcw01 ~]# cat /data/gv1/xiaoma.txt #gv1删除后,数据没有被删除 xiaoma [root@mcw01 ~]# gluster volume info gv1 Volume gv1 does not exist [root@mcw01 ~]# 由于没有卸载,直接把gv删除了,客户端这里没有看到挂载了,但是挂载目录缺是存在,并且不能访问,不能删除 [root@mcw05 ~]# df -h df: ‘/test1’: Transport endpoint is not connected Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 1.9G 18G 10% / devtmpfs 973M 0 973M 0% /dev tmpfs 984M 0 984M 0% /dev/shm tmpfs 984M 8.7M 975M 1% /run tmpfs 984M 0 984M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 197M 0 197M 0% /run/user/0 storage1:gv0 19G 12G 7.9G 59% /test0 [root@mcw05 ~]# [root@mcw05 ~]# ls /test1 ls: cannot access /test1: Transport endpoint is not connected [root@mcw05 ~]# ls / ls: cannot access /test1: Transport endpoint is not connected bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test0 test1 tmp usr var [root@mcw05 ~]# ls /test1 ls: cannot access /test1: Transport endpoint is not connected [root@mcw05 ~]# ls -ld /test1 ls: cannot access /test1: Transport endpoint is not connected [root@mcw05 ~]# rm -rf /test1 rm: cannot remove ‘/test1’: Is a directory [root@mcw05 ~]# ls / ls: cannot access /test1: Transport endpoint is not connected bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test0 test1 tmp usr var [root@mcw05 ~]#
停掉gv,客户端无法访问,无挂载。开启gv,客户端重新自动挂载并可以访问
停掉gv0 [root@mcw01 ~]# gluster volume stop gv0 Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y volume stop: gv0: success 客户端无法访问了 [root@mcw05 ~]# df -h df: ‘/test0’: Transport endpoint is not connected df: ‘/test1’: Transport endpoint is not connected Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 1.9G 18G 10% / devtmpfs 973M 0 973M 0% /dev tmpfs 984M 0 984M 0% /dev/shm tmpfs 984M 8.7M 975M 1% /run tmpfs 984M 0 984M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 197M 0 197M 0% /run/user/0 [root@mcw05 ~]# ls /test0 ls: cannot access /test0: Transport endpoint is not connected [root@mcw05 ~]# 开启gv0 [root@mcw01 ~]# gluster volume start gv0 volume start: gv0: success [root@mcw01 ~]# 客户端挂载重新恢复并且可访问了。 [root@mcw05 ~]# df -h df: ‘/test1’: Transport endpoint is not connected Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 1.9G 18G 10% / devtmpfs 973M 0 973M 0% /dev tmpfs 984M 0 984M 0% /dev/shm tmpfs 984M 8.7M 975M 1% /run tmpfs 984M 0 984M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 197M 0 197M 0% /run/user/0 storage1:gv0 19G 12G 7.9G 59% /test0 [root@mcw05 ~]# ls /test0 111 222 file1 [root@mcw05 ~]#
stripe模式(条带)
条带模式是没有高可用的
第1步: 再重做成stripe模式的卷(重点是命令里的stripe 4参数)(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume create gv0 stripe 4 storage1:/data/gv0/ storage2:/data/gv0/ storage3:/data/gv0/ storage4:/data/gv0/ force
volume create: gv0: success: please start the volume to access data
第2步: 启动gv0(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume start gv0
第3步: 客户端挂载
client# mount -t glusterfs storage1:gv0 /test0
第4步:读写测试
读写测试结果: 文件过小,不会平均分配给存储节点。有一定大小的文件会平均分配。类似raid0。
-
磁盘利率率100%(前提是所有节点提供的空间一样大,如果大小不一样,则按小的来进行条带)
-
大文件会平均分配给存储节点(LB)
-
没有HA,挂掉一个存储节点,此stripe存储卷则不可被客户端访问
条带模式使用失败演练
创建目录,创建条带模式 [root@mcw01 ~]# mkdir -p /data/gv2/ [root@mcw01 ~]# gluster volume create gv2 stripe 4 storage1:/data/gv2/ storage2:/data/gv2/ storage3:/data/gv2/ storage4:/data/gv2/ force volume create: gv2: success: please start the volume to access data [root@mcw01 ~]# gluster volume info gv2 Volume Name: gv2 Type: Stripe Volume ID: af335b7c-0c32-41bb-898d-fc3a8e72a16e Status: Created Snapshot Count: 0 Number of Bricks: 1 x 4 = 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv2 Brick2: storage2:/data/gv2 Brick3: storage3:/data/gv2 Brick4: storage4:/data/gv2 Options Reconfigured: transport.address-family: inet nfs.disable: on [root@mcw01 ~]# 开启gv。我们可以看到,如果是已经开启的,发现开启失败 [root@mcw01 ~]# gluster volume start gv0 volume start: gv0: failed: Volume gv0 already started [root@mcw01 ~]# [root@mcw01 ~]# [root@mcw01 ~]# gluster volume start gv2 volume start: gv2: success [root@mcw01 ~]# 客户端创建目录挂载失败,不知道啥原因 [root@mcw05 ~]# mount.glusterfs storage1:gv2 /test2 Mounting glusterfs on /test2 failed. [root@mcw05 ~]#
distributed模式
第1步: 准备新的存储目录(所有存储服务器上都要操作)
# mkdir -p /data/gv1
第2步: 创建distributed卷gv1(不指定replica或stripe就默认是Distributed的模式, 在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume create gv1 storage1:/data/gv1/ storage2:/data/gv1/ storage3:/data/gv1/ storage4:/data/gv1/ force
第3步: 启动gv1(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume start gv1
第4步: 客户端挂载
client# mkdir /test1
client# mount -t glusterfs storage1:gv1 /test1
第5步:读写测试(测试方法与replica模式一样,具体过程参考授课视频)
读写测试结果: 测试结果为随机写到不同的存储里,直到所有写满为止。
-
利用率100%
-
方便扩容
-
不保障的数据的安全性(挂掉一个节点,等待大概1分钟后,这个节点就剔除了,被剔除的节点上的数据丢失)
-
也不提高IO性能
又是挂载失败
又是挂载失败 [root@mcw01 ~]# [root@mcw01 ~]# mkdir -p /data/gv3 [root@mcw01 ~]# gluster volume create gv3 storage1:/data/gv3/ storage2:/data/gv3/ storage3:/data/gv3/ storage4:/data/gv3/ force volume create: gv3: success: please start the volume to access data [root@mcw01 ~]# gluster volume start gv3 volume start: gv3: success [root@mcw01 ~]# gluster volume info gv3 Volume Name: gv3 Type: Distribute Volume ID: 449a5e03-b2a1-432f-ac44-0bca45a3de43 Status: Started Snapshot Count: 0 Number of Bricks: 4 Transport-type: tcp Bricks: Brick1: storage1:/data/gv3 Brick2: storage2:/data/gv3 Brick3: storage3:/data/gv3 Brick4: storage4:/data/gv3 Options Reconfigured: transport.address-family: inet nfs.disable: on [root@mcw01 ~]# [root@mcw05 ~]# df -h df: ‘/test1’: Transport endpoint is not connected Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 1.9G 18G 10% / devtmpfs 973M 0 973M 0% /dev tmpfs 984M 0 984M 0% /dev/shm tmpfs 984M 8.7M 975M 1% /run tmpfs 984M 0 984M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 197M 0 197M 0% /run/user/0 storage1:gv0 19G 12G 7.9G 59% /test0 [root@mcw05 ~]# [root@mcw05 ~]# mkdir /test3 [root@mcw05 ~]# mount.glusterfs starage1:gv3 /test3 Mounting glusterfs on /test3 failed. [root@mcw05 ~]#
distributed-replica模式
第1步: 准备新的存储目录(所有存储服务器上都要操作)
# mkdir -p /data/gv2
第2步: 创建distributed-replica卷gv2(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume create gv2 replica 2 storage1:/data/gv2/ storage2:/data/gv2/ storage3:/data/gv2/ storage4:/data/gv2/ force
第3步: 启动gv2(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume start gv2
第4步: 客户端挂载
client# mkdir /test2
client# mount -t glusterfs storage1:gv2 /test2
第5步:读写测试
读写测试结果: 4个存储分为两个组,这两个组按照distributed模式随机。但在组内的两个存储会按replica模式镜像复制。
特点:
-
结合了distributed与replica的优点:可以扩容,也有HA特性
dispersed模式
disperse卷是v3.6版本后发布的一种卷模式,类似于raid5/6
第1步: 准备新的存储目录(所有存储服务器上都要操作)
# mkdir -p /data/gv3
第2步: 创建卷gv3(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume create gv3 disperse 4 storage1:/data/gv3/ storage2:/data/gv3/ storage3:/data/gv3/ storage4:/data/gv3/ force
There is not an optimal redundancy value for this configuration. Do you want to create the volume with redundancy 1 ? (y/n) y
volume create: gv3: success: please start the volume to access data
注意:没有指定冗余值,默认为1,按y确认
第3步: 启动gv3(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume start gv3
storage1# gluster volume info gv3
Volume Name: gv3
Type: Disperse
Volume ID: 767add4e-48c4-4a2d-a5d1-467076d73afd
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x (3 + 1) = 4 这里看到冗余数为1
Transport-type: tcp
Bricks:
Brick1: storage1:/data/gv3
Brick2: storage2:/data/gv3
Brick3: storage3:/data/gv3
Brick4: storage4:/data/gv3
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
第4步: 客户端挂载
client# mkdir /test3
client# mount -t glusterfs storage1:gv3 /test3
第5步:读写测试(测试方法与replica模式一样,具体过程参考授课视频)
读写测试结果: 写100M,每个存储服务器上占33M左右。因为4个存储1个为冗余(与raid5一样)。
课后测试: 如果想要实现2个冗余,则最少需要5台存储服务器
# gluster volume create gv4 disperse 4 redundancy 2 storage1:/data/gv4/ storage2:/data/gv4/ storage3:/data/gv4/ storage4:/data/gv4/ force
redundancy must be less than 2 for a disperse 4 volume
这里指定disperse 4 redundancy 2参数,但报错为冗余值必须要比disperse值少2以上
在线裁减与在线扩容
在线裁减要看是哪一种模式的卷,比如stripe模式就不允许在线裁减。下面我以distributed卷来做裁减与扩容
在线裁减(注意要remove没有数据的brick)
# gluster volume remove-brick gv1 storage4:/data/gv1 force
Removing brick(s) can result in data loss. Do you want to Continue? (y/n) y
volume remove-brick commit force: success
在线扩容
# gluster volume add-brick gv1 storage4:/data/gv1 force
volume add-brick: success
问题1: 4个存储节点想扩容为5个存储节点怎么做?
答案: 第5个存储服务器安装服务器软件包,启动服务,然后gluster peer probe storage5加入集群
问题2: 一个卷里已经有4个brick,想在线扩容brick,怎么做?
只有distributed模式或带有distributed组合的模式才能在线扩容brick
glusterfs小结:
属于文件存储类型,优点:可以数据共享 缺点: 速度较低
卷类型:
见xmind文件