架构:
glusterfs 是一个分布式的文件系统。分为客户端和服务端。
客户端:指的是我们挂载 glusterfs 服务集群的 机器节点
服务端:搭建的glusterfs 集群
基本概念:
卷名:集群创建后,我们可以把这个集群当成一个整体,创建多个 分布式的卷,这些的卷又有很多类型,如distribution、replica、这两种混合的。我们给这个卷起的名字就是卷名,客户端挂载的时候需要指定卷名,这就是它的作用。
集群的搭建步骤:
双节点:192.168.10.23 、192.168.10.23
磁盘:sdb
目录:/data
- 创建逻辑卷
pvcreate /dev/sdb
gcreate vg0 /dev/sdb
lvcreate -n lv0 vg0
lvcreate -l 100%VG -n lv0 vg0
fdisk -l
mkfs.xfs -i size=512 /dev/vg0/lv0
mount /dev/vg0/lv0 /data
df -hT
echo '/dev/vg0/lv0 /data xfs defaults 0 0' >> /etc/fstab
- 安装glusterfs 相关软件
- 安装centos yum 源,这种只能在centos上安装
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
修改 $releasever 为7 ,使用sed 命令,或者直接去目录里改
yum search centos-release-gluster
yum install centos-release-gluster41.noarch -y
yum 安装依赖包
./autogen.sh
./configure --without-libtirpc --disable-linux-io_uring && make install -j 8
#make && make install #使用了-j 8 就不用 make install了
/sbin/mount.glusterfs mount -t glusterfs
systemctl daemon-reload
systemctl start glusterd
glusterd 也可也手动启动。但是命令提示的功能也没有,这个以后再配置
make 的时候报错,可能是默认使用的python2,在编译完成之后就可以看得到是 with pyhton2.7 ,
update-alternatives --list python
update-alternatives --install /usr/bin/python python /usr/bin/python2 1
update-alternatives --install /usr/bin/python python /usr/bin/python3 2
最后发现只是少了一个 python-devel 的包,这个包在第一步中可能被忽略了,没有装上,现在用yum 装上即可
- 创建 glusterfs 卷
gluster peer probe 192.168.10.24 #在23 上把24 加到可信池里
gluster pool list #查看状态
gluster peer status
gluster volum create gv0 192.168.10.23:/data/brick1 192.168.10.24:/data/brick1
gluster volume start gv0
gluster volume status
gluster volume info
- 客户端挂载
#安装客户端
yum install glusterfs-fuse -y
mount -t glusterfs 192.168.10.22:/gv0 /mnt/gv0
底层原理分析
在客户端创建文件到共享卷的时候,客户端里 可以用 ll 命令看到文件的硬链接是1,而到服务端去看文件时,可以观察到文件硬链接为2。在隐藏目录.glusterfs 中肯定存在 这两个文件对应关系。
客户端里看到的文件 links 为1 ,服务端里的文件 links 为2,如果在服务端删的话,./glusterfs里的文件就多了一个 -links 为1 的文件,这个对应的是客户端能看到的文件。只有再删除了这个,文件才能真实的被删除,空间才能释放掉。
硬链接原理:硬连接的作用是允许一个文件可以拥有多个路径名。因此源文件和硬链接文件是仅文件名不同的相同文件,创建文件的硬链接相当于为文件又起了一个新的文件名而已。一个inode 可以对应多个文件名,用 ls -l 命令就可以看到。
只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
实验一:
服务端删除问价后,重启 数据卷,看看是否会恢复数据
重启后没有恢复数据,即使 隐藏目录里的 硬链接还在。
#找到硬链接为2的所有文件,然后删除,-link =1 说明只有一个 硬链接
find . -samefile -L `find . -links 2 -type f | grep -Ev "db|health|stub|0{4}"` -execdir rm {} \;
要正确的删除软链接,来释放空间。
软连接有的是链接目录,而不单单是文件,rm -rf 可能会删除目录所有内容了
# 客户端里看到的文件 links 为1 ,服务端里的文件 links 为2,如果在服务端删的话,./glusterfs里的文件就
# 多了一个 -links 为1 的文件,这个对应的是客户端能看到的文件
#找到 .gluster已删除的硬链接,brick里的 links 为1
#find .glusterfs -links 1 -type f | grep -Ev "health|db" | xargs ls -l
# find . -links 1 -type f | grep -Ev "db|health|stub|0{4}" | xargs ls -l
#查找brick 里面(包括.gluster)里所有links 为 1 的文件
# ll -haR | awk -F ' ' '==1{print }' | grep -Ev "db|health|stub|^l"
# 1,清理硬链接,brick下的 .glusterfs 失效的为 1
# 2,清理软连接,brick中有一些是其他节点上同步过来的,也要删掉。
# 先删客户端里已经不存在的目录,再清理失效的软连接
# 3,清理空目录