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架构

img

1、brick

  • 基本存储块,是整个glusterfs中唯一保存用户数据的组件,是一个独立的数据存储单元,

  • 一台服务器上划出来用于存储的一块地盘,/date/brick1 这个文件夹

2、volume卷

  • 卷是glusterfs中用户用来访问和使用存储的方式,一个卷由多个brick组成,根据卷的特性,将卷分成多个类型,有复制卷,分散卷,分布式卷,分布式复制卷,分布式离散卷

3、glusterfs-fuse

  • 是glusterfs原生访问的驱动程序,也就是客户端去使用glusterfs时需要安装的文件系统驱动

4、glusterd

  • 是glusterfs在集群中各个节点的守护进程,如果集群中有节点的glusterd出现停止或者故障,则影响集群功能的正常使用(如创建卷,删除卷)

5、glusterfs中卷的类型

  • 分布式卷:没有数据冗余,在数据高可靠的场景下不能使用,分布式卷还能实现条带化,将数据切片存放到多个bricks中,以提高存储的性能 使用随机算法将其随机存储到卷中的一个brick中

    • 没有冗余性,如果服务器坏了,数据就丢失了

img

  • 复制卷:存储的文件会保存在卷中的所有brick上,类似于raid1

    • 安全性高,有冗余性,缺点就是占用的空间太大了

img

  • 分布式复制卷:在分布式卷中选择一定数量的brick作为副本数,因此brick的数量要是副本数量的倍数

    • 先产生复制卷,再来实现分布式卷

    • 既有安全性和大容量,最常用的组合,4台服务器两两一组互为镜像

img

  • 分散卷: 数据切片的数量,冗余片的数量,片的总数

二、实验

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 恢复

  • 流程

    • 将磁盘分区后,挂载

    • 创建卷,启动卷,挂载

    • 扩容和缩容,故障

    • 再平衡

posted @ 2026-03-07 22:34  乔的港口  阅读(8)  评论(0)    收藏  举报