学习Gluster创建不同卷。

学习复习使用。只学习创建不同卷,不测试不同卷性能差别。

四个虚拟机进行测试

关闭防火墙 设置selinux为permissive

三个服务端
192.168.199.81 gluster-1
192.168.199.82 gluster-2
192.168.199.83 gluster-3

一个客户端 测试挂载卷
192.168.199.84 gluster-client

服务端每个服务器添加两块10G的硬盘并挂载用作 brick点。

硬盘挂载和gluster软件安装

硬盘挂载以gluster-1 为例
查看硬盘是否添加。 我的虚拟机上显示的/dev/sdb //dev/sdc 表示新加的两块硬盘设备。
新增的两块硬盘
设置挂载点

mkdir -p /gluster/disk1
mkdir -p /gluster/disk2

设置硬盘的文件格式 可以为 xfs ext2 ext3 ext4 等。选择xfs

mkfs.xfs /dev/sdb
mkfs.xfs /dev/sdc

将其写入 /etc/fstab 文件实现开机挂载

echo "/dev/sdb        /gluster/disk1  xfs     defaults        0 0" >> /etc/fstab 
echo "/dev/sdc        /gluster/disk2  xfs     defaults        0 0" >> /etc/fstab 

立即挂载 /etc/fstab 文件

mount -a

挂载完成查看
两块硬盘挂载成功
三个gluster服务节点都要设置

gluster使用yum 方式安装。

所有节点都要安装gluster源。版本选择6。41尽管是长期支持版本,但是似乎glusterfs-fuse 依赖库之类有冲突。。。

yum -y install centos-release-gluster6

三个服务端安装

yum -y install glusterfs-server

用户端安装

yum -y install glusterfs-fuse

只有在使用Infiniband时才需要安装RDMA模块。这应该是一个不同于tcp/ip的网络协议。。。

yum -y install glusterfs-rdma

glusterfs是基础包,也是服务软件和客户软件的依赖包。会自动安装。

服务端安装完成查看 安装软件。。。看着软件版本和源版本好像不一致。。。没关系。安装上就行。

rpm -qa | grep gluster

服务端软件

客户端安装完成查看 安装软件

rpm -qa | grep gluster

客户端软件
启动glusterd 守护进程,并设置开机自启

systemctl enable glusterd
systemctl start glusterd

配置受信任池
在gluster-1节点 将gluster-2 gluster-3加入受信任池。

gluster peer probe gluster-1
gluster peer probe gluster-2

测试安装不同卷。。。

brick: gluster基本存储单元,由受信任存储池中服务器上的导出目录表示。
brick通过以下格式将服务器与导出目录组合来表示。SERVER:EXPORT

myhostname:/exports/myexportdir/

创建卷命令
[] 表示可省略

gluster volume create <NEW-VOLNAME> [stripe <COUNT>] [replica <COUNT> [arbiter <COUNT>]] [disperse [<COUNT>]] [disperse-data <COUNT>] [redundancy <COUNT>] [transport <tcp|rdma|tcp,rdma>] <NEW-BRICK>... [force] - create a new volume of specified type with mentioned bricks

过于长。。。其实不是特别复杂。先放这里,不用太在意
transport <tcp|rdma|tcp,rdma> 这一块,表明使用的网络协议,默认是tcp。我想大多数人都使用的tcp协议吧。如果有使用其他网络协议的,那应该比我懂多了。。。

1.基础卷 Distribute(分布式卷)

分布式卷。这种类型卷数据没有冗余,只是将数据分布到不同的brick 中。也就是说数据没有备份。一旦数据丢失就真的丢失了。因此一般不常用。

默认创建不加额外参数就是 分布式卷
创建一个包含3个brick的分布式卷。卷名 gv-distributed

gluster volume create gv-distributed gluster-1:/gluster/disk1 gluster-2:/gluster/disk1 gluster-3:/gluster/disk1 force

末尾 加上force是因为我们直接将 挂载目录也就是brick导出目录设置数据存储点了,如果不想加force 可以设置

gluster volume create gv-distributed gluster-1:/gluster/disk1/brick gluster-2:/gluster/disk1/brick gluster-3:/gluster/disk1/brick 

/gluster/disk1/brick中 brick目录不用我们手动创建。

开启卷,查看该卷信息

gluster volume start gv-distributed
gluster volume info

在这里插入图片描述
可以看到改卷类型是Distribute Brick数目是3 传输类型是tcp以及其他信息。

客户端挂载该卷并写入数据查看数据分布

mkdir /mnt/test-distributed
mount -t glusterfs gluster-1:gv-distributed /mnt/test-distributed/

分布式卷挂载
测试写入文件

for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/test-distributed/copy-test-$i; done

将message文件复制100份写入到挂载的目录。

成功后可以在gluster-1 gluster-2 gluster-3服务节点查看作为brick的硬盘中数据。

cd /gluster/disk1
ls

我的文件分布如下
gluster-1
gluster-1
gluster-2
gluster-3
gluster-3
gluster-3
数量上可能不是特别平均,但是也差不太多。分布式卷数据分布大概就是这样,将数据分布到不同的brick,没有副本备份。

2.基础卷 Replicate(复制卷)

在创建卷时写入类型 replica 和副本数量。且副本数量与组成改卷的brick数目一致的话就是 基础复制卷。可选 [arbiter ] 我也不知道什么用的(似乎是设置仲裁器的数量,防止脑裂)。以后学会了再来补充
最好是3副本以上,2副本容易造成脑裂。

创建一个由3brick组成的3副本复制卷。 卷名 gv-replicated

gluster volume create gv-replicated replica 3 gluster-1:/gluster/disk2 gluster-2:/gluster/disk2 gluster-3:/gluster/disk2 force

开启卷 查看卷信息

gluster volume start gv-replicated
gluster volume info gv-replicated

复制卷信息
可以看到 卷类型是一个 复制卷 Brick数量1X3,3表示数据有3个副本。1表示分布式的数量,分布式数量为1表示数据只会分布在由这三个副本组成的副本群中。如果为2表示数据会分布在两个副本群中。

客户端挂载该卷并写入数据查看数据分布

mkdir /mnt/test-replicated
mount -t glusterfs gluster-1:gv-replicated /mnt/test-replicated/

复制卷挂载
可以看到复制卷的 容量约为10G 是3个brick 加起来的1/3。因为数据要有3份。
测试向该挂载卷写入数据

for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/test-replicated/copy-test-$i; done

查看服务端查看作为brick的硬盘中数据。

cd /gluster/disk2
ls

gluster-1
gluster-1
gluster-2
gluster-2
gluster-3
gluster-3
三个brick的内容完全一致。。。因为是3副本复制卷。gluster会自动维护副本群中文件。

有时候可以手动恢复副本群中 文件不同的brick。比如 现在删除 gluster-1的brick中的copy-test-001 不会使用程序删除

cd /gluster/disk2
rm -f copy-test-001

删除copy-test-001
可以看到删除成功。
客户端挂载点的 文件也少了一个。。。
客户端挂载点也少了一个
重新挂载后文件正常。。。如果还不正常。
在三个服务节点任一个上执行命令来检查修复卷
gluster volume heal VOLNAME full

gluster volume heal gv-replicated full

客户端数据正常
客户端数据恢复正常
服务节点数据恢复
服务节点删除数据恢复
不知什么原因 ,这样做未必真的有效,数据有时候可能并不会恢复。。。可能gluster修复的是异常问题导致的文件毁坏。手动执行检测可能不识别什么的。。。

3.基础卷 Stripe (条带卷)。4.0版本之后应该移除了。

不知道什么原因,gluster似乎移除了该类型卷。条带卷的意思将一个文件数据均匀的存储在构成卷的 brick 中。每个brick都存放的是文件的一部分,不是完整的文件。。。该类型卷优势是,读取大文件时,文件所在的不同brick同时读取文件,速度较快。
不过已经移除了。。。就不再多说了。相对应的复合卷什么的也就没了。

4.复合卷 Distributed Replicated(分布式复制卷)

前面说过,复制卷的副本数如果和组成该卷的brick 数量一致,那么就是一个基础副本卷。
如果组成改卷的brick数目是副本数的倍数,那么该卷就是一个分布式复制卷
注,一定要是倍数关系,brick少一个 多一个 卷的建立都会失败。。。
删除刚才的卷,准备测试创建新卷

gluster volume stop gv-distributed
gluster volume delete gv-distributed

gluster volume stop gv-replicated
gluster volume delete gv-replicated

如果硬盘上面有数据,将硬盘数据也清除掉。
创建一个3副本 的分布式存储卷 卷名 gv-dis-rep

gluster volume create gv-dis-rep replica 3 gluster-1:/gluster/disk1 gluster-2:/gluster/disk1 gluster-3:/gluster/disk1 gluster-1:/gluster/disk2 gluster-2:/gluster/disk2 gluster-3:/gluster/disk2 force

由6个brick组成的三副本的分布式复制卷,在该卷中,

gluster-1:/gluster/disk1 gluster-2:/gluster/disk1 gluster-3:/gluster/disk1

互为副本,这三个brick中存储的数据一致。看做副本群1。三个brick的大小要一致。

gluster-1:/gluster/disk2 gluster-2:/gluster/disk2 gluster-3:/gluster/disk2

互为副本,这三个brick中存储的数据一致。看做副本群2。三个brick的大小要一致。

副本群1 和 副本群2 构成一个分布式,数据会比较均衡的分布在这两个副本群中。副本群1中brick和副本群2中brick大小可以不一致。。。但最好构成gluster集群的brick大小都是一致的为好。

开启卷,查看卷信息
分布式复制卷的信息
构成该卷的brick有6个。2*3 3表示的就是副本的数量,2表示的分布式 的数量。

客户端挂载该卷并写入数据查看数据分布

挂载

mkdir /mnt/test-dis-rep
mount -t glusterfs gluster-1:gv-dis-rep /mnt/test-dis-rep

分布式复制卷挂载
大小为20G,因为是两个副本群构成,每个副本群中brick大小都为10G。
依然是测试写入100个文件,查看 各个brick中文件分布。

for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/test-dis-rep/copy-test-$i; done

分布式付志军写入数据
查看各个brick 的文件存储状况

gluster-1 /gluster/disk1
gluster-1disk1

gluster-2 /gluster/disk1
gluster-2disk1

gluster-3 /gluster/disk1
gluster-3disk1

gluster-1 /gluster/disk2
gluster-1disk2

gluster-2 /gluster/disk2
gluster-2disk2

gluster-3 /gluster/disk2
gluster-3disk2
可以看到 前三个brick的内容一致,后三个brick内容一致。两个副本群中数据内容组合起来就是完整的数据内容。

下面说的两个卷 个人不是特别理解。因此放在了最后,根据官方文档来学习测试
https://docs.gluster.org/en/latest/Administrator%20Guide/Setting%20Up%20Volumes/

5. Dispersed(分散卷)。

应该与不再支持的的条带卷有那么一丝类似。。。

分散的卷是基于纠删码(erasure codes)的。它在卷中的多块brick中对文件的编码数据进行条带化,并添加了一些冗余。可以使用分散的卷具有一个可配置水平的可靠性和最小的空间浪费。

关于纠删码。。。一脸懵。估计以后也学不会。只要知道 分散卷基于纠删码,存在冗余。类似于纠删码中的冗余级别就可以了。

应该是。假设有一个6块brick组成的分散卷,如果冗余为2,那么就是最多可以允许两块brick损坏,实际可用的空间为4brick。最优值大概就是6个brick两个做冗余。

gluster volume create <NEW-VOLNAME>  [disperse [<count>]] [redundancy <count>] <NEW-BRICK>... [force]

可以通过指定 分散集的brick 数、 冗余的brick数 或者两个都指定 来创建分散卷。

  • 如果disperse未指定,或者缺少时,但是指定了redundancy count时,整个卷将被视为由命令行中枚举的所有brick组成的单个分散集。

  • 如果 冗余 的 brick数未指定。会自动机算出最优值。大约就是 2+1 4+2 这种的。如果最优值无法计算得出,冗余度默认设置为1。

  • disperse count 的数目中包含了冗余的数目。

  • 如果指定disperse和 disperse 的count时。命令行列出的brick的数量一定是disperse count 的倍数。可以相等,那就是单个的分散卷。

删除掉之前的卷。测试创建一个由3个brick 构成的,disperse count 为3,冗余brick为1(redundancy 1)的的分散卷 gv-disperse。

gluster volume create gv-disperse disperse 3 redundancy 1 gluster-1:/gluster/disk1 gluster-2:/gluster/disk1 gluster-3:/gluster/disk1 force

指定了分散集 brick 数为3 冗余brick为1 一共由三个brick组成,这就是一个单一的分散卷。
单一分散卷创建
可以看到该卷信息。构成该卷的brick数 1X(2+1)=3
1个冗余brick 分散集brick 数为3。是一个单一的分散卷。

如此指定的话创建方式可以 省略分散集的 count 。结果是一样的。

gluster volume create gv-disperse disperse  redundancy 1 gluster-1:/gluster/disk1 gluster-2:/gluster/disk1 gluster-3:/gluster/disk1 force

disperse 也可以省略。看到 redundancy 关键字 gluster也会知道在创建分散卷。

 gluster volume create gv-disperse redundancy 1 gluster-1:/gluster/disk1 gluster-2:/gluster/disk1 gluster-3:/gluster/disk1 force

不指定 disperse count 的话默认就是创建单一分散卷。由所有brick构成一个分散集群。

可以不指定redundancy 1 只设置关键字disperse,会自动计算冗余brick,有三个brick的话,自动计算结果应该也是1。

gluster volume create gv-disperse disperse gluster-1:/gluster/disk1 gluster-2:/gluster/disk1 gluster-3:/gluster/disk1 force

自动计算单一分散卷冗余brick

客户端挂载该卷并写入数据查看数据分布

mkdir /mnt/test-disperse
mount.glusterfs gluster-1:gv-disperse /mnt/test-disperse

单一分散卷挂载
存入数据。。。

for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/test-disperse/copy-test-$i; done

存入数据
查看各个brick中数据
分散卷各brick存放数据
gluster-2 和 gluster-3的数据也是一样。看上去好像是复制卷一样啊。
看文件名是一致的,但是文件内容就不一样了。这些文件并不是一个完整的文件。
它在卷中的多块brick中对文件的编码数据进行条带化,并添加了一些冗余。
分散卷数据存储是 条带化存储的,单个并不是完整文件。另分散卷是基于纠删码的。这个原理确实有点复杂,我也不清楚数据到底怎么存储的。。。

对于分散卷。。。知道如何使用就可以了吧。。。

6. Distributed Dispersed(分布式分散卷)

可以看做多个不同的分散集群构成一个分布式的卷。每一个分散集群保存维护一份数据,多个集群构成完整的数据。
创建上与单一分散卷创建类似,只不过要设置 分散集群的brick数目。且构成分布式分散卷的brick 数目是 分散集群群brick数目的倍数。至少2倍。redundancy count的设置依然是根据 分散集群brick数目( disperse count)设置的。

设置一个6个brick构成的分布式分散卷gv-dis-dis,分散集群brick 数目为3 冗余为1。

gluster volume create gv-dis-dis disperse 3 redundancy 1 gluster-1:/gluster/disk1 gluster-2:/gluster/disk1 gluster-3:/gluster/disk1 gluster-1:/gluster/disk2 gluster-2:/gluster/disk2 gluster-3:/gluster/disk2 force
gluster volume start gv-dis-dis
gluster volume info gv-dis-dis

分布式分散卷信息
2X(2+1)=6 6个brick构成分布式分散卷。2+1 是每个分散集群有三个brick 其中一个作为冗余。 一共由两个 这样构造的 分散集群。

前面说过 gluster会自动计算冗余的brick数量。因此如此设置也是可以的
不设置冗余数

gluster volume create gv-dis-dis disperse 3 gluster-1:/gluster/disk1 gluster-2:/gluster/disk1 gluster-3:/gluster/disk1 gluster-1:/gluster/disk2 gluster-2:/gluster/disk2 gluster-3:/gluster/disk2 force

客户端挂载该卷并写入数据查看数据分布

 mkdir /mnt/test-dis-dis
 mount.glusterfs gluster-1:gv-dis-dis /mnt/test-dis-dis

分布式分散卷挂载

for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/test-dis-dis/copy-test-$i; done

查看分布式分散群 文件分布
分布式分散群文件分布
gluster-1:/gluster/disk1 gluster-2:gluster/disk1 gluster-3:/gluster/disk1 构成了一个分散集群。三个brick使用纠删码的方式保存数据。
gluster-1:/gluster/disk2 gluster-2:gluster/disk2 gluster-3:/gluster/disk3 构成另外的分散集群。三个brick使用纠删码的方式保存数据。
这两个分散集群 加起来构成了完整的数据。。。

卷扩容。卷收缩。卷迁移。

内容比较乱。。。将就着看。
所谓卷扩容,就是向原来卷中加入新的brick。
卷收缩,就是减少卷中的brick。
卷迁移 将一个brick中数据迁移到另一个中。应该是brick替换。

gluster volume help

查看卷操作帮助。

不管是扩容还是缩容执行前要明确增减的brick数是否可以构成新的平衡。

分布式卷扩容。

使用卷扩容前要明了原卷的构成,新加brick数与扩容的类型。

测试由3分布式扩展到6分布式。4或者5也是可以的。。。纯分布式存储方式brick之间关系没有那么密切。
三分不是复制卷信息
三分布式复制卷信息
假设其中有一定量数据。。。
3分布式中brick中数据
假设一次添加三个brick,那么构成该卷的就是6个brick,原卷类型是纯分布式卷,可以扩展成 6个brick 的纯分布式卷,或者2副本的分布式存储卷。。。中间如果需要数据迁移,gluster会自动完成。如果不需要迁移数据也能完成,gluster不会迁移数据。

首先测试扩展成6 brick的纯分布式卷

gluster volume add-brick gv-distribute gluster-1:/gluster/disk2 gluster-2:/gluster/disk2 gluster-3:/gluster/disk2 force

查看卷信息

gluster volume info gv-distribute

6分布式存储卷
查看新增brick 中数据。。。发现为空

手动进行数据均衡

gluster volume rebalance VOL_NAME start

需要耗费一段时间

gluster volume rebalance gv-distribute start

再次查看新增brick中数据
分布式卷扩容后新增brick中数据

纯分布式复制卷不能实现数据迁移。。。测试一下brick删除。

gluster volume remove-brick gv-distribute gluster-1:/gluster/disk2 start

移除brick
可以看到,执行过程中要确认。删除完成后查看卷信息,发现还是6个brick。因为删除比较麻烦,start 后还要commit 提交。

gluster volume remove-brick gv-distribute gluster-1:/gluster/disk2 commit

commit
在这个过程中可以查看删除状态

gluster volume remove-brick gv-distribute gluster-1:/gluster/disk2 status

直接使用 force的话,直接从卷中去除该brick,数据会直接丢失。其实该brick中的数据没有被删除(只不过不在卷中了,卷上当然就找不到这些数据)。。。start + commit 会先将该brick中数据迁移到其它地方,然后移除该brick。

gluster volume remove-brick gv-distribute gluster-1:/gluster/disk2 force

分布式卷扩容成分布式复制卷。

先将卷使用各种方法还原成 3个brick的分布式卷。测试扩容成2副本分布式复制卷 因为现在是一个3 分布式的,如果要设置成3副本,需要新增6个brick

gluster volume remove-brick gv-distribute gluster-2:/gluster/disk2 start
gluster volume remove-brick gv-distribute gluster-2:/gluster/disk2 commit
gluster volume remove-brick gv-distribute gluster-3:/gluster/disk2 start
gluster volume remove-brick gv-distribute gluster-3:/gluster/disk2 commit

测试新增brick扩容卷 使成为2副本分布式复制卷

gluster volume add-brick gv-distribute replica 2 gluster-1:/gluster/disk2 gluster-2:/gluster/disk2 gluster-3:/gluster/disk2 force

2副本分布式复制卷
新增brick中是有数据的,与之前存在的brick一一互为副本。
gluster-1:/gluster/disk1 与 gluster-1:/gluster/disk2
gluster-2:/gluster/disk1 与 gluster-2:/gluster/disk2
gluster-3:/gluster/disk1 与 gluster-3:/gluster/disk2

测试卷迁移 brick替换

互为副本之间的brick数据是不能迁移的。。。且副本中有一个brick数据迁移了,会影响另外的副本数据。与之保持一致。
还是直接叫 brick替换好一点。卷迁移不明确。。。

纯分布式卷是不能进行 brick替换的

volume replace-brick: failed: replace-brick is not permitted on distribute only volumes. Please use add-brick and remove-brick operations instead.

brick替换就是使用一块新的brick替换掉原来的brick。原来的brick退出卷。新增的brick加入该卷。

准备一个 3副本的纯复制卷。写入一定量数据
gluster迁移前数据

disk2 内数据 为空,disk1 内存放数据
disk2数据为空
brick 替换 使用 gluster-1:/gluster/disk2 替换 gluster-1:/gluster/disk1

gluster volume replace-brick gv-replicate gluster-1:/gluster/disk1 gluster-1:/gluster/disk2 commit force

卷信息
brick替换后卷信息
构成复制卷的brick 发生了变化

数据迁移
brick替换后数据
disk2 中写入了数据,disk1 中数据没有删除,但是disk1 已经不是构成卷的brick了。其中数据对卷不会有任何影响。。。

将复制卷扩展成分布式复制卷。

先将brick替换回来。依然是一个3副本的复制卷。

gluster volume replace-brick gv-replicate gluster-1:/gluster/disk2 gluster-1:/gluster/disk1 commit force

只是为了看着舒服。。。

[root@gluster-1 ~]# gluster volume info
 
Volume Name: gv-replicate
Type: Replicate
Volume ID: e44da150-3767-4cc1-be18-a2a9136a7918
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: gluster-1:/gluster/disk1
Brick2: gluster-2:/gluster/disk1
Brick3: gluster-3:/gluster/disk1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
[root@gluster-1 ~]# 

将 /gluster/disk2中文件数据清空

rm -f /gluster/disk2/*

3副本复制卷不能变成2副本。不知道2副本复制卷可不可以变成3副本
3副本复制卷可扩展为 分布式 3 副本复制卷。

gluster volume add-brick gv-replicate gluster-1:/gluster/disk2 gluster-2:/gluster/disk2 gluster-3:/gluster/disk2 force

分布式3副本复制卷

杂项

设置开机自动挂载gluster卷

编辑/etc/fstab 文件 如下 大概格式如下

gluster:cloud-second /export/secondary/ glusterfs defaults,_netdev      0 0

gluster卷 挂载点 glusterfs defaults,_netdev 0 0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章