GlusterFS 是一个可扩展的分布式文件系统,旨在处理大量数据的存储需求。它通过将多个存储服务器的存储空间聚合在一起,提供单一的命名空间。以下是 GlusterFS 中几种常见的卷(Volume)类型及其作用,并用通俗的例子来说明每种类型的特点。
主机名 | IP |
---|---|
node1 | 192.168.200.179 |
node2 | 192.168.200.180 |
node3 | 192.168.200.172 |
这里面的每个节点都有3块额外的硬盘,每个硬盘20个G
在每个服务器节点上执行以下命令安装 GlusterFS:
yum install glusterfs-server
启动 GlusterFS 服务:
systemctl enable --now glusterd
假设我们有三台服务器 node1
、node2
和 node3
,首先在每个节点上编辑 /etc/hosts
文件,添加所有节点的 IP 地址和主机名:
192.168.200.179 node1
192.168.200.180 node2
192.168.200.172 node3
然后,在一个节点上执行以下命令来设置信任关系:
gluster peer probe node2
gluster peer probe node3
使用 gluster peer status
命令来检查集群状态,确保所有节点都已经连接。
自行将硬盘进行分区,然后格式化,也可以不分区,直接将一整个硬盘格式化,我建议还是分一下区
每个节点都要做,我只写一台的操作
# 每个节点都是,我的每个节点的硬盘都是sdb1,sdc1,sdd1
[root@oe01 ~]# mkdir -p /data/sd{c..d}1
[root@oe01 ~]# mount /dev/sdb1 /data/sdb1
[root@oe01 ~]# mount /dev/sdc1 /data/sdc1
[root@oe01 ~]# mount /dev/sdd1 /data/sdd1
将文件随机分布到集群中的不同服务器上,没有任何冗余。这种卷适合不需要高可用性和容错性的场景,例如缓存或临时文件存储。
像是一个图书馆里,所有的书都随意放在不同的书架上,没有特定的顺序。如果一个书架坏了,那上面的书就暂时不可用了。
[root@oe01 sdc1]# gluster volume create volume1 node1:/data/sdc1/brick node2:/data/sdc1/brick
volume create: volume1: success: please start the volume to access data
参数解释:
现在卷是创建出来了,但是没有处于启动状态,是无法使用的,接下来我们启动这个卷
[root@oe01 sdc1]# gluster volume start volume1
volume start: volume1: success
启动卷也是很简单,直接告诉他需要启动的卷名就可以了
客户端需要挂载的话可以通过posix协议来挂载,也就是mount -t glusterfs 这样的方式
# 我是用第三个节点充当客户端
# 1. 安装客户端软件包
[root@oe03 ~]# yum install glusterfs-fuse -y
# 2. 挂载使用
[root@oe03 ~]# mount -t glusterfs node1:/volume1 /mnt/
你在挂载的时候随意指定集群内的任意节点都可以,我这里使用的node1,你可以使用node2:/volume1,或者node3:/volume1,即使我们没有使用node3来创建这个卷依然可以挂载
我们在客户端往卷里写入文件,然后回到node1和node2查看
[root@oe03 ~]# cd /mnt/
[root@oe03 mnt]# cp /etc/hosts .
[root@oe03 mnt]# ls
hosts
将hosts文件复制到/mnt下,我们回到node1和node2来查看
[root@oe01 ~]# ls /data/sdc1/brick/
hosts
[root@oe02 ~]# ls /data/sdc1/brick/
可以很清楚的看见,这个文件只有node1节点上有,如果文件丢失/损坏是没有副本或者其他机制可以恢复的
提供数据冗余,通过在多个服务器上复制每个文件,确保高可用性和数据容错性。适合重要数据存储,需要高可靠性的场景。
像是一个图书馆里,每本书都有多个副本,放在不同的书架上。如果一个书架坏了,你还能从其他书架上找到同样的书。
[root@oe01 sdb1]# gluster volume create volume2 replica 3 node1:/data/sdb1/brick node2:/data/sdb1/brick node3:/data/sdb1/brick
volume create: volume2: success: please start the volume to access data
参数解释:
[root@oe01 sdb1]# gluster volume start volume2
volume start: volume2: success
# 我们还是一样在node3上挂载
[root@oe03 mnt]# mkdir /gluster/replicas -p
[root@oe03 mnt]# mount -t glusterfs node2:/volume2 /gluster/replicas
[root@oe03 replicas]# cp /etc/hosts .
[root@oe03 replicas]# ls
hosts
# node1上
[root@oe01 ~]# ls /data/sdb1/brick/
hosts
# node2上
[root@oe02 ~]# ls /data/sdb1/brick/
hosts
# node3上
[root@oe03 ~]# ls /data/sdb1/brick/
hosts
可以看到,hosts这个文件每个节点都写入了一份,这样做确保了数据的可靠性,丢失了一大部分存储空间空间只有以前的1/3
[root@oe03 ~]# df -hT /gluster/replicas/
Filesystem Type Size Used Avail Use% Mounted on
node2:/volume2 fuse.glusterfs 20G 381M 20G 2% /gluster/replicas
这里显示他的空间就只有20G,我们使用的是3个20G的磁盘做的
将文件分块,并将块分布在多个服务器上,以提高读取和写入性能。适合需要高带宽和大文件存储的场景。与Raid0类似
像是一本大字典,每一页都分给不同的书架。如果你要查阅字典,每个书架会提供一部分内容,从而加快查找速度。
结合分布式卷和复制卷的优点,将文件分布在不同的服务器组中,并在每个组内复制文件。提供高可用性和扩展性。
像是一个图书馆,不仅每本书有多个副本,而且这些副本还分散在不同的区域。如果一个区域坏了,你还能从其他区域找到同样的书。
要创建分布式复制卷至少需要副本数*2的brick才可以
先停止卷
# 先删除之前使用过的卷,我们指定副本为3,那么就需要6个brick,我们现在是不够的
[root@oe01 brick]# gluster volume stop volume1
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: volume1: success
[root@oe01 brick]# gluster volume stop volume2
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: volume2: success
然后删除卷
[root@oe01 brick]# gluster volume delete volume1
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: volume1: success
[root@oe01 brick]# gluster volume delete volume2
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: volume2: success
然后将每个目录下的brick也删除,如果不删除的话在创建卷的时候会报错
[root@oe01 data]# rm -rf /data/sd{b..d}1/brick
[root@oe02 data]# rm -rf /data/sd{b..d}1/brick
[root@oe03 data]# rm -rf /data/sd{b..d}1/brick
[root@oe01 data]# gluster volume create volume3 replica 3 node1:/data/sdb1/brick node2:/data/sdb1/brick node3:/data/sdb1/brick node1:/data/sdc1/brick node2:/data/sdc1/brick node3:/data/sdc1/brick
volume create: volume3: success: please start the volume to access data
[root@oe01 data]# gluster volume start volume3
volume start: volume3: success
[root@oe03 ~]# cd /gluster/
[root@oe03 gluster]# mkdir volume3
[root@oe03 gluster]# mount -t glusterfs node3:/volume3 /gluster/volume3/
[root@oe03 gluster]# cd volume3/
[root@oe03 volume3]# cp /etc/chrony.conf .
[root@oe03 volume3]# ls
chrony.conf
[root@oe01 brick]# ls -R /data/ |grep chrony.conf -B 1
/data/sdb1/brick:
chrony.conf
[root@oe02 ~]# ls -R /data/ |grep chrony.conf -B 1
/data/sdb1/brick:
chrony.conf
[root@oe03 volume3]# ls -R /data/ |grep chrony.conf -B 1
/data/sdb1/brick:
chrony.conf
这个数据会被写入到同一个组,这里的组跟我们的定义顺序就有关系了,我们指定的是node1 /data/sdb1/brick,然后是node2,然后是node3,副本数是3,这样他们3个就是一个组,另外3个就是另一个组了,当我们的node1挂掉之后,数据还会在node2和node3上,这也就是为什么顺序这么关键的原因
如果我们指定的顺序是node1 /data/sdb1/brick, node1 /data/sdc1/brick node1 /data/sdd1/brick,那么某个文件的副本会全部写到node1节点上,如果node1挂掉了,那么数据也就不存在了
结合分布式卷和条带卷的优点,将文件分块,并将块分布在不同的服务器组中,以提高性能和扩展性。
像是一本大字典,每一页都分给不同的区域,每个区域再分给不同的书架。这样既能加快查找速度,又能扩展存储容量。
使用纠删码(Erasure Coding)来提供数据冗余,能够在较少的存储开销下提供数据容错性。适合存储大规模数据且需要高效利用存储空间的场景。
像是一个图书馆,书被分成了很多部分,放在不同的书架上,即使少数几个书架坏了,其他书架上的部分也可以组合起来恢复整个书。
不同类型的卷适用于不同的应用场景,选择合适的卷类型可以根据数据的重要性、性能需求和存储效率来决定。希望这些例子和配置示例能帮助你更好地理解 GlusterFS 卷的类型和作用。