gluster分布式存储
-
分布式存储
-
glusterfs 写入一个1.txt,在三个节点上面同时备份,但是空间就占用了很多
-
引入一个纠删码,将文件切片,有一个校验块,分别存储在不同的节点,占用的空间少,且允许有一个节点故障,可以根据切片的块和校验的块算出完整的文件
-
兼容nfs和cifs
一、分布式文件系统
1、概述
1、什么是分布式文件系统?
- 分布式存储系统就像一个存储集群,将数据分散的存储在多台独立的设备上,让这些设备协同工作,对外呈现一个统一的存储空间,彻底的改变了传统集中式存储由一个中心机头管理的模式,解决了性能瓶颈和单点故障的风险
2、传统存储和分布式存储的对比
-
可伸缩性
-
传统存储是纵向扩容,扩容是升级单台设备的硬件,扩容依赖控制器支持的容量和硬盘的数量都是有限的,之前是64G的服务器,现在换成128G的服务器
-
分布式存储是横向扩容,扩容的是节点的数量,扩展容量的同时可以同步扩容计算能力,之前是64G的服务器,多加几个普通的服务器就行了
-
-
集中式
-
传统存储有集中式(控制器),就是访问都需要经过这个控制器,性能瓶颈,单点故障
-
分布式存储没有控制器,去中心化的
-
-
可靠性
-
传统存储根据控制器的冗余,就是多添加一个控制器
-
分布式存储依赖这个数据的冗余,多副本和纠删码保障的
-
3、存储世界
-
按照架构分(搬家公司)
-
分布式存储(团队搬家),ceph,hdfs,glusterfs
-
集中式存储(个人搬家),传统的san/nas
-
-
按服务形态分(搬家公司提供什么样的服务)
-
块 (san,云硬盘)
-
文件存储(nas,glusterfs,nfs)
-
对象存储(s3,swift,oss)
-
-
ceph是一个分布式存储,对外提供访问的方式有块,文件存储,对象存储都支持
-
glusterfs是一个分布式存储,对外表现形式是文件存储
4、常见的分布式存储
5、glusterfs特点
-
高可用性: GlusterFS能够自动检测存储节点的故障,并将数据转移到其他节点上,保证数据的高可用性。
-
负载均衡: GlusterFS采用分布式存储方式,能够自动将数据均匀地分散在不同的存储节点上,有效地实现负载均衡
-
可扩展性: GluserFS的Scale-Out架构可以实现随着存储需求的增加,添加更多的存储节点,以增加存储容量。
-
数据安全: GlusterFS采用数据冗余的方式,将数据复制到多个存储节点上,以保证数据的安全性
-
高性能: GlusterFS的弹性哈希算法能够实现快速读写,支持多个客户端并发访问,提高系统的性能
-
易于管理: GlusterFS提供了一套完整的管理工具,使得系统管理员可以轻松地管理存储节点和文件系统
2、glusterfs架构

1、brick
-
基本存储块,是整个glusterfs中唯一保存用户数据的组件,是一个独立的数据存储单元,
-
一台服务器上划出来用于存储的一块地盘,/date/brick1 这个文件夹
2、volume卷
- 卷是glusterfs中用户用来访问和使用存储的方式,一个卷由多个brick组成,根据卷的特性,将卷分成多个类型,有复制卷,分散卷,分布式卷,分布式复制卷,分布式离散卷
3、glusterfs-fuse
- 是glusterfs原生访问的驱动程序,也就是客户端去使用glusterfs时需要安装的文件系统驱动
4、glusterd
- 是glusterfs在集群中各个节点的守护进程,如果集群中有节点的glusterd出现停止或者故障,则影响集群功能的正常使用(如创建卷,删除卷)
5、glusterfs中卷的类型
-
分布式卷:没有数据冗余,在数据高可靠的场景下不能使用,分布式卷还能实现条带化,将数据切片存放到多个bricks中,以提高存储的性能 使用随机算法将其随机存储到卷中的一个brick中
- 没有冗余性,如果服务器坏了,数据就丢失了

-
复制卷:存储的文件会保存在卷中的所有brick上,类似于raid1
- 安全性高,有冗余性,缺点就是占用的空间太大了

-
分布式复制卷:在分布式卷中选择一定数量的brick作为副本数,因此brick的数量要是副本数量的倍数
-
先产生复制卷,再来实现分布式卷
-
既有安全性和大容量,最常用的组合,4台服务器两两一组互为镜像
-

- 分散卷: 数据切片的数量,冗余片的数量,片的总数
二、实验
1、安装和配置glusterfs
-
至少需要三个节点,所有节点之间主机名必须可以互相访问
-
关闭防火墙和selinux
-
每个节点至少准备一个硬盘,推荐一个硬盘作为一个brick
-
每个节点添加三个硬盘,10G
1、安装glusterfs
每一个节点都需要安装
[root@server ~]# yum -y install glusterfs-server
[root@server ~]# systemctl enable glusterd --now
2、配置glusterfs
域名解析,每个节点需要配置
[root@server ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.50.21 node1
192.168.50.22 node2
192.168.50.20 node0
建立信任关系,在任意一个节点上面配置即可
[root@node0 ~]# gluster peer probe node1
peer probe: success
[root@node0 ~]# gluster peer probe node2
peer probe: success
# 建立了连接
[root@node0 ~]# gluster peer status
Number of Peers: 2
Hostname: node1
Uuid: 7806f074-0041-402e-a0fb-b7687d36cbf6
State: Peer in Cluster (Connected)
Hostname: node2
Uuid: e2bd2d5d-8383-408f-8128-c96c6418ecf1
State: Peer in Cluster (Connected)
# 在node1上面查看
# 在哪个节点上面查看,是看不到自己的
[root@node1 ~]# gluster peer status
Number of Peers: 2
Hostname: node0
Uuid: 6954bc2d-273f-4cb2-8b62-07a3e0a67f5b
State: Peer in Cluster (Connected)
Hostname: node2
Uuid: e2bd2d5d-8383-408f-8128-c96c6418ecf1
State: Peer in Cluster (Connected)
3、分区和格式化卷和挂载
每个节点都需要做
进行分区,将每个硬盘分区,且分区的大小都是一整个硬盘
sdb 8:16 0 10G 0 disk
└─sdb1 8:17 0 10G 0 part
sdc 8:32 0 10G 0 disk
└─sdc1 8:33 0 10G 0 part
sdd 8:48 0 10G 0 disk
└─sdd1 8:49 0 10G 0 part
# 分区是一个习惯,在Linux中不经常将一个硬盘都直接使用,而是在这个基础上面分区才行
# 创建挂载点
mkdir -p /data/sd{b..d}1
# 格式化分区
mkfs -t xfs /dev/sdb1
mkfs -t xfs /dev/sdc1
mkfs -t xfs /dev/sdd1
[root@node0 ~]# mount /dev/sdb1 /data/sdb1/
[root@node0 ~]# mount /dev/sdc1 /data/sdc1/
[root@node0 ~]# mount /dev/sdd1 /data/sdd1/
-
brick的要求
-
brick目录可以使用任意的文件系统,但是这个目录不能是这个挂载点
-
/dev/sdb1 不能使用,必须是挂载点下面在创建一个子目录,作为brick
-
[root@node0 ~]# ls /data/ -R
/data/:
sdb1 sdc1 sdd1
/data/sdb1:
brick
/data/sdb1/brick:
/data/sdc1:
brick
/data/sdc1/brick:
/data/sdd1:
brick
/data/sdd1/brick:
1、分布式卷
-
将文件随机分布到集群中的不同服务器上面,没有冗余性
-
如果出现了故障。数据就丢失了
-
这种分布式卷不适用高可用性和容错性
1、创建分布式卷
在glusterfs中操作的,只需要选择一个主机进行操作即可,在node0上面操作,
# 默认创建的卷是分布式卷
[root@node0 ~]# gluster volume create volume1 node0:/data/sdb1/brick node1:/data/sdb1/brick
volume create: volume1: success: please start the volume to access data
# 这个volume1卷是创建出来了,但是还需要启动才行
-
参数解释
-
为什么一个用node0的sdb,一个用node1的sdb呢?
-
这样做是防止某一台主机故障而导致的数据丢失,glusterfs会根据你创建卷时指定的数据来存放文件
-
这里是分布式卷,没有冗余性(容错的机制),也可以全部指定在同一节点的磁盘
-
-
node1:/data/sdb1/brick
-
在这个挂载点下面创建一个brick目录,并将所有的数据都存储在这个目录里面
-
不能直接指定/data/sdc1会报错的,因为glusterfs不能直接在根目录下创建(这里的根目录不是linux的根目录,而是存储的根目录),必须得在指定的目录下的子目录创建才行
-
-
查看卷的详细信息
[root@node0 ~]# gluster volume info volume1
Volume Name: volume1
Type: Distribute # 分布式卷的类型
Volume ID: b2dda0bd-dfae-44eb-9def-e0497b2ac3ca
Status: Created # 创建出来的
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: node0:/data/sdb1/brick
Brick2: node1:/data/sdb1/brick
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
2、启动卷
上面的卷是创建出来了,但是了是没有启动的状态
[root@node0 ~]# gluster volume start volume1
volume start: volume1: success
# 查看卷是启动的状态
[root@node0 ~]# gluster volume info volume1 | grep -i started
Status: Started
3、原生客户端挂载
- node2充当客户端
# 安装客户端
[root@node2 ~]# yum -y install glusterfs-fuse
# 挂载使用
# node0上面的volume1
[root@node2 ~]# mount -t glusterfs node0:volume1 /media/
# 这个挂载的话,集群内的任意节点都可以,node2:volume1 也可以,即使没有使用node2创建卷,也可以挂载
# 查询挂载点
[root@node2 ~]# df -hT /media/
Filesystem Type Size Used Avail Use% Mounted on
node0:volume1 fuse.glusterfs 20G 413M 20G 3% /media
4、观察卷的存储方式
在客户端上面往卷里面写入文件,查看存储方式
[root@node2 media]# cp /etc/passwd .
查看存储的位置在哪里
# 发现node0上面有这个文件
[root@node0 ~]# ls /data/sdb1/brick/
passwd
[root@node1 ~]# ls /data/sdb1/brick/
[root@node1 ~]#
- 这个文件分布在node0上面了,node1上面没有,没有冗余性,如果文件丢失,没有副本的
5、开机自动挂载
写入/etc/fstab中
# _netdev 就是等待网络加载完成后,才开始挂载,否则的话,就挂载不成功了
node0:volume1 /media glusterfs defaults,_netdev 0 0
2、复制卷
- 写入一个数据,存储在多份磁盘上,复制每个文件,确保了高可用性
1、创建复制卷
# replica 副本数量至少需要3个以上,小于的话,会有警告的
[root@node0 ~]# gluster volume create volume2 replica 3 node0:/data/sdc1/brick node1:/data/sdc1/brick node2:/data/sdc1/brick
volume create: volume2: success: please start the volume to access data
# 查询复制卷的详细信息
[root@node0 ~]# gluster volume info volume2
Volume Name: volume2
Type: Replicate # 类型为复制卷
Volume ID: 62cb3b17-7fd3-4f83-b128-1dc0b407ca80
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3 # 使用了3个brick
Transport-type: tcp
Bricks:
Brick1: node0:/data/sdc1/brick
Brick2: node1:/data/sdc1/brick
Brick3: node2:/data/sdc1/brick
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
2、启动卷和挂载卷
# 启动卷
[root@node0 ~]# gluster volume start volume2
volume start: volume2: success
# 挂载卷
[root@node2 ~]# mount -t glusterfs node1:volume2 /mnt/
[root@node2 ~]# df -hT /mnt
Filesystem Type Size Used Avail Use% Mounted on
node1:volume2 fuse.glusterfs 10G 207M 9.8G 3% /mnt
# 发现大小为10G,但是了我们使用了3个10G的磁盘配置的
3、观察卷的存储方式
# 写入文件
[root@node2 mnt]# cp /etc/hosts .
# 发现三个节点上面都有文件
[root@node0 ~]# ls /data/sdc1/brick/
hosts
[root@node1 ~]# ls /data/sdc1/brick/
hosts
[root@node2 mnt]# ls /data/sdc1/brick/
hosts
- 每个节点上面都写入了一份,确保了数据的可靠性,但是丢失了一大部分的存储空间,只有以前的1/3
删除其中一个节点的文件的话,会自平衡的,也就是会自己复原的,再次修改文件的时候,删除的节点会自动平衡过来的,也就是会在创建过来的
3、分布式复制卷
因为是三个副本,需要需要6个bricks
- 创建分布式复制卷至少需要副本数*2的brick才可以
删除之前创建的卷
1、删除之前创建的卷
# 客户端先要卸载挂载点
# 停止卷
gluster volume stop volume1
gluster volume stop volume2
# 删除brick里面的数据和隐藏目录
# 删除卷
gluster volume delete volume1
gluster volume delete volume2
2、创建分布式复制卷
# 创建卷的时候,如果之前的brick使用过的话,就会报这个错误
# 是因为之前创建的时候,会有属性这些影响
[root@node0 /]# gluster volume create volume3 replica 3 node0:/data/sdb1/brick node1:/data/sdb1/brick node2:/data/sdb1/brick node0:/data/sdc1/brick node1:/data/sdc1/brick node2:/data/sdc1/brick
volume create: volume3: failed: /data/sdb1/brick is already part of a volume
# 使用force强制创建就可以,哪些属性就可以改变了
# 这个卷的顺序也是非常重要的,三个为一组
[root@node0 /]# gluster volume create volume3 replica 3 node0:/data/sdb1/brick node1:/data/sdb1/brick node2:/data/sdb1/brick node0:/data/sdc1/brick node1:/data/sdc1/brick node2:/data/sdc1/brick force
volume create: volume3: success: please start the volume to access data
# 查看卷的详细信息
[root@node0 /]# gluster volume info
Volume Name: volume3
Type: Distributed-Replicate # 分布式复制卷
Volume ID: 4a750cdb-a22d-4255-bbf9-5cf10caf0f6a
Status: Created # 创建的状态
3、启动卷和挂载卷
[root@node0 /]# gluster volume start volume3
volume start: volume3: success
# 挂载这卷
[root@node1 /]# mount -t glusterfs node1:/volume3 /media/
# 查看发现大小为20G,但是了,实际是60G,2个卷,一个卷里面有三个10G的brick,只有20G的使用大小,另外就是复制过去到其他的brick上
[root@node1 /]# df -hT /media/
Filesystem Type Size Used Avail Use% Mounted on
node1:/volume3 fuse.glusterfs 20G 413M 20G 3% /media
4、观察卷的存储方式
# 写入一个文件
[root@node1 media]# cp /etc/passwd .
# 发现只有sdb1/brick里面写入了,且复制了2份,到相邻的brick上了
[root@node1 data]# ls sdb1/brick/
passwd
[root@node0 data]# ls sdb1/brick/
passwd
[root@node2 data]# ls sdb1/brick/
passwd
- 首先先分布之后,确认好在哪一个卷上,再来复制到相邻的brick上了
5、删除一个brick里面数据,观察
# 删除node0上面的brick里面的数据
[root@node0 data]# ls sdb1/brick/
passwd
[root@node0 data]# rm sdb1/brick/passwd
rm: remove regular file 'sdb1/brick/passwd'? y
[root@node0 data]# ls sdb1/brick/
4、卷的扩容和缩容
1、卷的扩容
- 直接增加一个brick即可
[root@node0 ~]# gluster volume add-brick volume1 node2:/data/sdb1/brick force
volume add-brick: success
# 添加了一个brick
volume add-brick: success
Brick1: node0:/data/sdb1/brick
Brick2: node1:/data/sdb1/brick
Brick3: node2:/data/sdb1/brick
2、缩容
-
减少brick,或者升级等操作
-
就会将数据迁移到其他的brick上
# 前提,卷挂载了
# 将要移除的brick数据迁移到其他的brick上
gluster volume remove-brick volume1 node1:/data/sdb1/brick start
# 查看数据迁移是否完成
# 一共迁移了5个文件
[root@node0 ~]# gluster volume remove-brick volume1 node1:/data/sdb1/brick status
Node Rebalanced-files size scanned failures skipped status run time in h:m:s
--------- ----------- ----------- ----------- ----------- ----------- ------------ --------------
node1 5 0Bytes 5 0 0 completed 0:00:00
# 提交移除的更改
[root@node0 ~]# gluster volume remove-brick volume1 node1:/data/sdb1/brick commit
volume remove-brick commit: success
Check the removed bricks to ensure all files are migrated.
If files with data are found on the brick path, copy them via a gluster mount point before re-purposing the removed brick.
# 查看brick,已经移除了
Bricks:
Brick1: node0:/data/sdb1/brick
# 数据已经全部迁移到node0上的brick上了
[root@node0 brick]# ls
1233.txt 199.txt 1.txt 2.txt 3.txt 5.txt 99.txt
5、卷的再平衡
1、手动平衡(针对分布式卷)
-
就是在扩容或者缩容后,brick上的数据分布偏差了,可以手动平衡
-
就是将文件再分布一下
-
分布式卷的话,文件没有了,就彻底没有了
# 继续沿着上面的操作,所有的文件,都在node0上的brick上
# 添加一个brick
[root@node0 ~]# gluster volume add-brick volume1 node1:/data/sdb1/brick force
volume add-brick: success
# 发现这个新brick里面没有数据
[root@node1 brick]# ls
[root@node1 brick]#
# 这个时候就需要手动平衡一下,将这些文件重新分布一下
[root@node1 brick]# gluster volume rebalance volume1 start
volume rebalance: volume1: success: Rebalance on volume1 has been started successfully. Use rebalance status command to check status of the rebalance process.
ID: 1d3d3ada-4af1-4eac-95d7-f0f69b139e10
# 平衡了2个文件到node1上面的brick了
[root@node1 brick]# gluster volume rebalance volume1 status
Node Rebalanced-files size scanned failures skipped status run time in h:m:s
--------- ----------- ----------- ----------- ----------- ----------- ------------ --------------
node0 2 0Bytes 7 0 0 completed 0:00:01
localhost 0 0Bytes 0 0 0 completed 0:00:00
volume rebalance: volume1: success
# 修改文件的内容,或者添加内容的时候,都是同步的
# 挂载给客户端和实际存储的brick都是同步的
2、自动平衡(针对的是复制卷)
-
范围:卷存在冗余的特性,一但
-
文件删除了,但是其他节点上面的brick有文件,可以再平衡,就能恢复过来
[root@node0 ~]# gluster volume create volume2 replica 3 node0:/data/sdc1/brick node1:/data/sdc1/brick node2:/data/sdc1/brick force
volume create: volume2: success: please start the volume to access data
[root@node2 media]# mount -t glusterfs node0:volume2 /mnt/
# 写入一个文件
[root@node2 mnt]# ls
[root@node2 mnt]# touch 444.txt
# 删除node0上面的文件
[root@node0 brick]# rm -rf 444.txt
# 再平衡
[root@node0 ~]# gluster volume heal volume2 full
Launching heal operation to perform full self heal on volume volume2 has been successful
Use heal info commands to check status.
# 就恢复了
[root@node0 brick]# ls
444.txt
3、brick替换(复制卷)
- 替换brick后,原brick上的数据不会自动迁移,需要执行heal来恢复数据到新的brick上
[root@node0 ~]# gluster volume replace-brick volume2 node0:/data/sdc1/brick/ node0:/data/sdd1/brick commit force
volume replace-brick: success: replace-brick commit force operation successful
# 查看brick,发现已经替换了
Bricks:
Brick1: node0:/data/sdd1/brick
Brick2: node1:/data/sdc1/brick
Brick3: node2:/data/sdc1/brick
# 数据再平衡一下
# 但是了,我这个新的brick有数据啊,自动的平衡了
[root@node0 sdd1]# ls brick/
444.txt
# 如果没有数据的话,执行heal命令
[root@node0 ~]# gluster volume heal volume2 full
Launching heal operation to perform full self heal on volume volume2 has been successful
Use heal info commands to check status.
glusterfs 命令查询
挂载卷有三种方式
总结
-
分布式卷,就是在扩容或者缩容brick后,需要手动的平衡reblance一下
-
复制卷的话,brick节点上面的数据丢失的话,就需要heal 恢复
-
流程
-
将磁盘分区后,挂载
-
创建卷,启动卷,挂载
-
扩容和缩容,故障
-
再平衡
-

浙公网安备 33010602011771号