本文档只是创建复制卷,分布式卷,分布式复制卷,纠删卷
操作系统 | 内核 | 角色 | Ip地址 | 说明 |
CentOS Stream 9 x86_64 | 5.14.0-427.el9.x86_64 | 客户端 client | 192.168.80.119 | 挂载存储业务机器 |
CentOS Stream 9 x86_64 | 5.14.0-427.el9.x86_64 | 客户端 client | 192.168.80.93 | brick端(manager/node) |
CentOS Stream 9 x86_64 | 5.14.0-427.el9.x86_64 | 存储节点 | 192.168.80.183 | brick端(manager/node) |
CentOS Stream 9 x86_64 | 5.14.0-427.el9.x86_64 | 存储节点 | 192.168.80.158 | brick端(manager/node) |
CentOS Stream 9 x86_64 | 5.14.0-427.el9.x86_64 | 存储节点 | 192.168.80.159 | brick端(manager/node) |
CentOS Stream 9 x86_64 | 5.14.0-427.el9.x86_64 | 存储节点 | 192.168.80.160 | brick端(manager/node) |
环境准备
存储节点全部创建新的目录
mkdir -pv /gfs/vdb1/gv0
将新的虚拟机磁盘(20G)全部划分为一个区,如果磁盘较大的话,也是分为一个区,给它20G的大小,保证挂载磁盘内存的一致性。
mkfs.ext4 /dev/vdb1
磁盘挂载完成之后需要查看磁盘的uuid,能够确保永久挂载。
blkid
如图,可以看到分区的uuid
在/etc/fstab文件中添加一行
UUID=9e4c220f-4825-4896-9eb4-573f8f045d49 /gfs/vdb1/gv0 ext4 defaults 0 0
UUID 挂载的目录 磁盘的文件系统
修改主机名称
hostnamectl set-hostname --static gfs-client119
hostnamectl set-hostname --static gfs-client93
hostnamectl set-hostname --static gfs-node183
hostnamectl set-hostname --static gfs-node158
hostnamectl set-hostname --static gfs-node159
hostnamectl set-hostname --static gfs-node160
修改hosts文件
cat >>/etc/hosts<<ldp
192.168.80.93 clant-93
192.168.80.119 clant-119
192.168.80.158 gfs-node158
192.168.80.159 gfs-node159
192.168.80.160 gfs-node160
192.168.80.183 gfs-node183
ldp
所有服务器配置时间
yum -y install chrony
cat /etc/chrony.conf
pool ntp1.aliyun.com iburst
pool ntp2.aliyun.com iburst
sourcedir /run/chrony-dhcp
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
keyfile /etc/chrony.keys
ntsdumpdir /var/lib/chrony
leapsectz right/UTC
logdir /var/log/chrony
所有服务器下载源
[root@gfs-manager183 gv0]# yum list 'centos-release-gluster*'
Repository centos-gluster9 is listed more than once in the configuration
上次元数据过期检查:0:04:10 前,执行于 2024年03月06日 星期三 14时32分03秒。
已安装的软件包
centos-release-gluster9.noarch 1.0-2.el9s @extras-common
可安装的软件包
centos-release-gluster10.noarch 1.0-2.el9s extras-common
centos-release-gluster11.noarch 1.0-1.el9s extras-common
下载源
yum -y install centos-release-gluster9.noarch
集群节点安装glusterfs-server9
yum clean all
yum makecache
所有节点安装
yum -y install centos-release-gluster9.noarch
183 158 159 160主机安装
yum -y install glusterfs-server
删除
yum remove glusterfs-server
设置开启自启和启动
systemctl enable glusterd
systemctl start glusterd
出现的问题
启动失败
删除/var/lib/glusterd/里面的所有文件
再次启动
systemctl start glusterd
将node节点加入集群
在任意一台机器上输入
gluster peer probe gfs-node158
gluster peer probe gfs-node159
gluster peer probe gfs-node160
gluster peer probe gfs-node183
这里使用ip,主机名,主机名别名都可以
出现的错误
这里提示的错误,可以查看当前主机的的hosts文件,里面的ip地址对应的别名或者主机名称是否和当前输入的gluster peer probe gfs-manager183 里面的 gfs-manager183是否一致。如果不一致,则修改。
查看集群节点状态
gluster peer status
这里只显示本机以外的节点信息
然后在所有存储上都可以使用该命令来验证检查
158主机
159主机
160主机
183主机
可以看到所有的集群节点都可以看到其他节点的信息。
查看所有节点的信息
在这里为了较少篇幅,不显示所有节点的显示的信息
gluster pool list
158主机
删除节点(按需删除)
gluster peer detach 节点名称
设置GlusterFS卷
在所有服务器上执行以下命令创建一个GlusterFS卷:
mkdir -pv /data/brick1/gv0
创建卷显示错误
如图所示
[root@gfs-node158 ~]# gluster volume create gfsfbs gfs-node158:/dev/vdb1 gfs-node159:/dev/sdb1 force
volume create: gfsfbs: failed: The provided path /dev/vdb1 which is already present, is not a directory
这里就是,本人使用的是gluster volume create gfsfbs gfs-node158:/dev/vdb1 gfs-node159:/dev/sdb1 force该命令,直接指向的主机的磁盘分区名称,但是在此之前本人将该分区进行了挂载,导致此情况的发生。
解决:将该分区和挂载的目录umount(取消挂载)
创建分布式卷
没有对文件进行分块处理;
通过扩展文件属性保存 HASH值;
支持的底层文件系统有 ext3 、ext4 、ZFS 、XFS等
特点:
文件分布在不同的服务器,不具备冗余性;
更容易和廉价地扩展卷的大小;
单点故障会造成数据丢失;
依赖底层的数据保护。
然后在任意一台服务器 上执行创建卷命令:
gluster volume create gfsfbs gfs-node158:/gfs/vdb1/gv0 gfs-node159:/gfs/vdb1/gv0
出现
volume create: gfsfbs: failed: The brick gfs-node158:/gfs/vdb1/gv0 is a mount point. Please create a sub-directory under the mount point and use that as the brick directory. Or use 'force' at the end of the command if you want to override this behavior.
这个错误提示表示:创建卷失败,因为brick gfs-node158:/gfs/vdb1/gv0是一个挂载点。请在挂载点下创建一个子目录,并将其用作brick目录。或者,如果您想覆盖此行为,请在命令末尾使用'force'。
我们输入强制:
gluster volume create gfsfbs gfs-node158:/gfs/vdb1/gv0 gfs-node159:/gfs/vdb1/gv0 force
显示创建成功
启动
gluster volume start gfsfbs
gfsfbs为创建卷的名称
查看状态
gluster volume info gfsfbs
使用客户端进行挂载
mount.glusterfs gfs-node158:/gfs/vdb1/gv0 /data/gv0
显示挂载失败
出现的错误就是,挂载的是该主机的目录,但是本次我们是创建的分布式卷,所以需要输入分布式卷名称,而不是单独的主机名和目录名称
mount -t glusterfs gfs-node158:gfsfbs /data/gv0
如果显示
这个错误提示是因为在创建 GlusterFS 卷时,brick 被创建在了系统的根分区。建议不要使用系统的根分区作为存储后端。如果你想覆盖这个行为,可以在命令末尾添加 'force'。
93主机上创建10个文件
for i in `seq 10`; do dd if=/dev/zero of=$i.txt bs=1M count=10;done
158主机显示
159主机显示
创建复制卷
gluster volume create gv0 replica 3 \
gfs-node160:/gfs/vdb1/gv0/
gfs-node183:/gfs/vdb1/gv0/
创建详细过程
[root@gfs-node160 ~]# gluster volume create gv0 replica 2 \
gfs-node160:/gfs/vdb1/gv0/ \
gfs-node183:/gfs/vdb1/gv0/
Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this. See: http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/.
Do you still want to continue?
(y/n) y
volume create: gv0: failed: The brick gfs-node160:/gfs/vdb1/gv0 is a mount point. Please create a sub-directory under the mount point and use that as the brick directory. Or use 'force' at the end of the command if you want to override this behavior.
[root@gfs-node160 ~]# echo $?
1
[root@gfs-node160 ~]# gluster volume create gv0 replica 2 gfs-node160:/gfs/vdb1/gv0/ gfs-node183:/gfs/vdb1/gv0/ force
volume create: gv0: success: please start the volume to access data
gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2
gluster volume create gv0 replica 2 gfs-node160:/gfs/vdb1/gv0/ gfs-node183:/gfs/vdb1/gv0/ force
查看卷状态
gluster volume info gv0
[root@gfs-node160 ~]# gluster volume info gv0
Volume Name: gv0
Type: Replicate
Volume ID: 203fe180-91f6-44f1-afb7-b5a6d8bcfa11
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gfs-node160:/gfs/vdb1/gv0
Brick2: gfs-node183:/gfs/vdb1/gv0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
启动
[root@gfs-node160 ~]# gluster volume start gv0
volume start: gv0: success
再次查看状态
[root@gfs-node160 ~]# gluster volume info gv0
Volume Name: gv0
Type: Replicate
Volume ID: 203fe180-91f6-44f1-afb7-b5a6d8bcfa11
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gfs-node160:/gfs/vdb1/gv0
Brick2: gfs-node183:/gfs/vdb1/gv0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
查看创建的卷
gluster volume list
出现的问题
mount 挂载失败
提示信息如下
[root@gfs-node93 ~]# mount -t glusterfs gv0:/gfs/vdb1/gv0 /data/gv0
Mounting glusterfs on /data/gv0 failed.
[root@gfs-node93 ~]# mount -t glusterfs gfs-node160:/gfs/vdb1/gv0 /data/gv0
Mounting glusterfs on /data/gv0 failed.
排查思路
排查思路:首先查看gfs服务端日志详细信息,日志默认在/var/log/glusterfs下面。查看glusterd.log日志详细信息
[2024-03-11 01:56:30.028377 +0000] I [MSGID: 106496] [glusterd-handshake.c:968:__server_getspec] 0-management: Received mount request for volume /gfs
[2024-03-11 01:56:30.028462 +0000] E [MSGID: 106048] [glusterd-handshake.c:475:build_volfile_path] 0-management: Failed to get volinfo []
[2024-03-11 01:56:30.028490 +0000] E [MSGID: 106128] [glusterd-handshake.c:1101:__server_getspec] 0-management: Failed to find peer info []
[2024-03-11 01:56:30.028497 +0000] E [MSGID: 106176] [glusterd-handshake.c:1137:__server_getspec] 0-management: Failed to mount the volume
[2024-03-11 02:04:26.355896 +0000] I [MSGID: 106496] [glusterd-handshake.c:968:__server_getspec] 0-management: Received mount request for volume gv0
查看日志之后发现服务端没有找到gv0,第二次是找不到卷。之后想了以下gfs-node160:/gfs/vdb1/gv0 gfs-node160主机和183主机创建的是gv0的卷
之后输入以下的命令
mount -t glusterfs gfs-node160:gv0 /data/gv0
命令说明:
-t glusterfs :指定挂载的文件系统类型
gfs-node160:gv0:指定挂载的主机的node节点和卷名称,二者使用冒号分隔
/data/gv0:指定本机的挂载目录
测试
在客户端创建完成20个100MB的文件,创建完成之后。客户端发起同步数据,到两个node节点,到同步完成之后,基本达到了实时传输数据的效果。
结合以下的三个
磁盘IO
网络IO
硬件上的软件工作
创建分布式复制卷
命令
gluster volume create dis-rep replica 4 transport tcp gfs-node183:/gfs/vdb1/gv0 \
gfs-node158:/gfs/vdb1/gv0 \
gfs-node159:/gfs/vdb1/gv0 \
gfs-node160:/gfs/vdb1/gv0 force
出现的问题
[root@gfs-node158 ~]# gluster volume create dis-rep replica 4 transport tcp gfs-node183:/gfs/vdb1/gv0 \
gfs-node158:/gfs/vdb1/gv0 \
gfs-node159:/gfs/vdb1/gv0 \
gfs-node160:/gfs/vdb1/gv0
volume create: dis-rep: failed: The brick gfs-node158:/gfs/vdb1/gv0 is a mount point. Please create a sub-directory under the mount point and use that as the brick directory. Or use 'force' at the end of the command if you want to override this behavior.
创建卷失败:dis-rep错误:brick gfs-node158:/gfs/vdb1/gv0 是一个挂载点。请在挂载点下创建一个子目录,并将其用作brick目录。或者,如果你想覆盖这种行为,可以在命令末尾使用 'force'。
查看状态
启动卷组
gluster volume start dis-rep
查看卷组的状态信息
[root@gfs-node158 ~]# gluster volume info
Volume Name: dis-rep
Type: Replicate
Volume ID: 5c75db30-e5a2-4b7f-9364-afc5e036307c
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: gfs-node183:/gfs/vdb1/gv0
Brick2: gfs-node158:/gfs/vdb1/gv0
Brick3: gfs-node159:/gfs/vdb1/gv0
Brick4: gfs-node160:/gfs/vdb1/gv0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
客户端进行挂载
mount -t glusterfs gfs-node159:dis-rep /mnt
基本性能测试
for i in `seq 300`; do dd if=/dev/zero of=$i-$RANDOM.txt bs=1M count=100;done
创建纠删卷
创建命令
gluster volume create disperse-volume disperse 4 transport tcp \
gfs-node158:/gfs/vdb1/gv0 \
gfs-node159:/gfs/vdb1/gv0 \
gfs-node160:/gfs/vdb1/gv0 \
gfs-node183:/gfs/vdb1/gv0
disperse-volume为卷名称
出现问题
[root@gfs-node158 gv0]# gluster volume create disperse-volume disperse 4 transport tcp gfs-node158:/gfs/vdb1/gv0 gfs-node159:/gfs/vdb1/gv0 gfs-node160:/gfs/vdb1/gv0 gfs-node183:/gfs/vdb1/gv0
There isn't an optimal redundancy value for this configuration. Do you want to create the volume with redundancy 1 ? (y/n) y
volume create: disperse-volume: failed: The brick gfs-node158:/gfs/vdb1/gv0 is a mount point. Please create a sub-directory under the mount point and use that as the brick directory. Or use 'force' at the end of the command if you want to override this behavior.
创建卷失败:分散卷错误:brick gfs-node158:/gfs/vdb1/gv0 是一个挂载点。请在挂载点下创建一个子目录,并将其用作brick目录。或者,如果你想覆盖这种行为,可以在命令末尾使用 'force'。
修改创建命令
gluster volume create disperse-volume disperse 4 transport tcp \
gfs-node158:/gfs/vdb1/gv0 \
gfs-node159:/gfs/vdb1/gv0 \
gfs-node160:/gfs/vdb1/gv0 \
gfs-node183:/gfs/vdb1/gv0 force
查看状态
启动disperse-volume卷
[root@gfs-node158 gv0]# gluster volume start disperse-volume
volume start: disperse-volume: success
查看状态
[root@gfs-node158 gv0]# gluster volume info
Volume Name: disperse-volume
Type: Disperse
Volume ID: 404b9906-21cf-4d2c-aa99-f8bb8b24b4c4
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x (3 + 1) = 4
Transport-type: tcp
Bricks:
Brick1: gfs-node158:/gfs/vdb1/gv0
Brick2: gfs-node159:/gfs/vdb1/gv0
Brick3: gfs-node160:/gfs/vdb1/gv0
Brick4: gfs-node183:/gfs/vdb1/gv0
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
在客户端进行挂载
mount -t glusterfs gfs-node159:disperse-volume /mnt
删除文件之后,df -h 查看磁盘占用未释放