分布式存储—GlusterFS

分布式存储—GlusterFS

zys91 421 2022-05-04

Go项目实践

实验简介

GlusterFS 是一个分布式文件系统,具有很高的横向扩展能力。它的实现并不基于一个集中化的元数据服务器,因此没有单点故障等问题。在 GlusterFS 中存储的数据,可通过传统的 NFS,SMB/CIFS、FUSE 等协议,在Windows、Linux 系统中访问GlusterFS 集群。

ownCloud 是一款开源的云盘解决方案,可以快速的搭建起属于自己的私人云盘。并跨平台支持 Windows、Mac、Android、iOS、Linux 等平台,而且还提供了网页版和 WebDAV 形式访问,因此用户可以在任何电脑、手机上都能轻松获取存储的文件。

实验目的及要求

  1. 在 Vmware 中,用 Fedora-Server-dvd-x86_64-35-1.2.iso 安装 2 至 4 个 Fedora 虚拟机。
  2. 分别在每个节点上部署 Fedora。
  3. 在 Linux 系统上实现 Native 挂载;实验验证 GlusterFS 集群。
  4. 在其中一台服务器上搭建 ownCloud,创建自己的私人云盘系统。
  5. 完成 GlusterFS 的其余6 种卷创建和使用。
  6. 思考如何结合 GlusterFS 七种卷的特性,为 ownCloud 用户存储的文档提供高可靠和高可用的服务。

搭建 GlusterFS

实验步骤

第一步:准备工作

  1. 下载镜像及虚拟机安装
# 清华源 Fedora-Server 下载连接:
https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/35/Server/x86_64/iso/Fedora-Server-dvd-x86_64-35-1.2.iso
# 需要安装 2-4 个 Fedora-Server 虚拟机 
# 虚拟机配置 CPU 2core MEM 2G HDD SCSI-20G NETWORK NAT
# 第一个虚拟机安装好后,可以使用 VMWare 的克隆功能完成其他虚拟机的安装
# 虚拟机克隆参考教程:https://blog.csdn.net/weixin_36665875/article/details/106350796
  1. 配置系统软件源
# 清华源配置参考:https://mirror.tuna.tsinghua.edu.cn/help/fedora/
# 备份原有源
mkdir /etc/yum.repos.d/bak
cp /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
# 修改 fedora 仓库 (/etc/yum.repos.d/fedora.repo) 具体修改内容参考上方链接
vim /etc/yum.repos.d/fedora.repo
# 修改 updates 仓库 (/etc/yum.repos.d/fedora-updates.repo)
vim /etc/yum.repos.d/fedora-updates.repo
# 修改 fedora-modular 仓库 (/etc/yum.repos.d/fedora-modular.repo)
vim /etc/yum.repos.d/fedora-modular.repo
# 修改 updates-modular 仓库 (/etc/yum.repos.d/fedora-updates-modular.repo)
vim /etc/yum.repos.d/fedora-updates-modular.repo
# 具体修改内容参考清华镜像站官网链接
# 更新仓库缓存
sudo dnf makecache

第二步:虚拟机配置

  1. 在 Vmware 中,为每个虚拟机增加一块磁盘
可以通过命令查看,新增磁盘 /dev/sdb
cat /proc/partitions

vm-addhhd
2. 固定每一个虚拟机的 IP 地址

# 使用 ifconfig 命令,查看当前网卡名称,如ens160
ifconfig
# 使用如下命令,修改ens160,以固定IP
vim /etc/sysconfig/network-scripts/ens160
#————————————————————
IPADDR=192.168.142.128
NETMASK=255.255.255.0
GATEWAY=192.168.142.2
DNS1=192.168.142.2
# 修改 MAC 地址:(采用克隆方式的需注意此处是否正确)
HWADDR=00:0C:29:8F:3F:86
# 修改 BOOTPROTO 项为static:
BOOTPROTO=static
# 确保 ONBOOT 项为yes:
ONBOOT=yes
#————————————————————
# 重启网络服务使其生效
service network restart

第三步:格式化、挂载分区(bricks)

在每个节点上执行以下命令:

# 新添加分区位于 /dev/sdb
mkfs.xfs -i size=512 /dev/sdb
mkdir -p /data/brick1
echo '/dev/sdb /data/brick1 xfs defaults 1 2' >> /etc/fstab
mount -a && mount
# 通过以下命令查看目录挂载情况
df -h

第四步:安装 GlusterFS

在每个节点上执行以下命令:

# 安装 GlusterFS
yum install -y glusterfs-server
# 启动 GlusterFS 管理守护进程
service glusterd start
service glusterd status

glusterd
glusterd-run

第五步:配置可信任池

  1. 首先,使用以下命令关闭每个虚拟机的防火墙
iptables -F
  1. 在其中一个节点上,使用如下命令,探测其他所有的节点
# 命令中的IP地址根据实际情况填写
gluster peer probe 192.168.142.129
gluster peer probe 192.168.142.130
gluster peer probe 192.168.142.131
# 可以通过以下命令查看所有节点的基本状态(显示的时候不包括本节点)
gluster peer status

gluster-peer-status

第六步:建立 GlusterFS 卷(七种方式)

  1. 建立卷的七种方式
    Distributed:分布式卷,文件通过hash算法随机的分不到bricks组成的卷上。
    Replicated:复制卷,类似raid1,replica数必须等于volume中brick所包含的存储服务器数,可用性高。
    Striped:条带式卷,类似raid0,stripe数必须等于volume中brick所包含的存储服务器数,文件会被分成数据块,以Round Robin的方式存储在bricks中,并发粒度是数据块,大文件性能好。
    Distributed striped:分布式条带卷,volume中brick所包含的存储服务器必须是stripe的倍数(>=2倍),兼顾分布式和条带式的功能。
    Distributed Replicated:分布式的复制卷,volume中brick所包含的存储服务器数必须是replica的倍数(>=2倍),兼顾分布式和复制式的功能。
    Stripe Replicated:条带复制卷,volume中brick所包含的存储服务器数必须是stripe和replica的倍数(>=2倍),兼顾条带式和复制式的功能。
    Distributed Stripe Replicated:分布式条带复制卷,按需存储服务器数量必须是222=8,共8台,兼顾分布式,条带式和复制式的功能。
  2. 创建挂载卷的常用命令
    以下创建挂载卷,均可通过以下命令进行查看、启用、停止、删除
# 查看已创建挂载卷
gluster volume info
# 启动挂载卷
gluster volume start gv0
# 删除前,先停止挂载卷
gluster volume stop gv0
# 删除挂载卷
gluster volume delete gv0
# 删除卷缓存文件和属性
rm -rf /data/brick1/gv0/.glusterfs
setfattr -x trusted.glusterfs.volume-id /data/brick1/gv0/
setfattr -x trusted.gfid /data/brick1/gv0/
  1. 在每个节点上创建卷目录
mkdir /data/brick1/gv0
  1. 在其中一个节点上执行以下命令(七种方式)

(1)基础卷:分布式卷(distribute)
默认模式,即DHT:将文件以hash算法随机分布到另外一台服务器节点中存储。

gluster volume create gv0 192.168.142.128:/data/brick1/gv0 192.168.142.129:/data/brick1/gv0
gluster volume start gv0
# 确认卷的信息
gluster volume info

volume-distribute
(2)基础卷:条带卷(stripe)(自GlusterFS 6.1版本,已弃用 stripe 模式)
条带模式,即Striped, 创建 volume 时带 stripe x 数量:将文件切割成数据块,分别存储到 stripe x 个节点中。

gluster volume create gv0 stripe 2 192.168.142.128:/data/brick1/gv0 192.168.142.129:/data/brick1/gv0
gluster volume start gv0
# 确认卷的信息
gluster volume info

注:自GlusterFS 6.1版本,已弃用 stripe 模式
volume-stripe
(3)基础卷:复制卷(replica)
复制模式,即AFR, 创建 volume 时带 replica x 数量:将文件复制到 replica x 个节点中。

gluster volume create gv0 replica 2 192.168.142.128:/data/brick1/gv0 192.168.142.129:/data/brick1/gv0
gluster volume start gv0
# 确认卷的信息
gluster volume info

volume-replica
(4)复合卷:分布式条带卷(distribute stripe)
分布式条带模式(组合型),最少需要4台服务器或者4块磁盘才能创建。创建 volume 时 stripe 2 server = 4 个节点:是DHT 与 Striped 的组合型。

gluster volume create gv0 stripe 2 192.168.142.128:/data/brick1/gv0 192.168.142.129:/data/brick1/gv0 192.168.142.130:/data/brick1/gv0 192.168.142.131:/data/brick1/gv0
gluster volume start gv0
# 确认卷的信息
gluster volume info

注:自GlusterFS 6.1版本,已弃用 stripe 模式

(5)复合卷:分布式复制卷(distribute replica)
分布式复制模式(组合型),最少需要4台服务器或者2台服务器4块磁盘才能创建。 创建 volume 时 replica 2 server = 4 个节点:是 DHT 与 AFR 的组合型。

gluster volume create gv0 replica 2 192.168.142.128:/data/brick1/gv0 192.168.142.129:/data/brick1/gv0 192.168.142.130:/data/brick1/gv0 192.168.142.131:/data/brick1/gv0
gluster volume start gv0
# 确认卷的信息
gluster volume info

volume-distribute-replica
(6)复合卷:条带复制卷(stripe replica)
条带复制卷模式(组合型),最少需要4台服务器才能创建。创建 volume 时 stripe 2 replica 2 server = 4 个节点:是 Striped 与 AFR 的组合型。

gluster volume create gv0 stripe 2 replica 2 192.168.142.128:/data/brick1/gv0 192.168.142.129:/data/brick1/gv0 192.168.142.130:/data/brick1/gv0 192.168.142.131:/data/brick1/gv0
# 确认卷的信息
gluster volume info

注:自GlusterFS 6.1版本,已弃用 stripe 模式

(7)复合卷:分布式条带复制卷(distribute stripe replica)
三种模式混合, 至少需要8台服务器才能创建。stripe 2 replica 2,每4个节点组成一个组。

gluster volume create gv0 stripe 2 replica 2 192.168.142.128:/data/brick1/gv0 192.168.142.129:/data/brick1/gv0 192.168.142.130:/data/brick1/gv0 192.168.142.131:/data/brick1/gv0
192.168.142.128:/data/brick2/gv0 192.168.142.129:/data/brick2/gv0 192.168.142.130:/data/brick2/gv0 192.168.142.131:/data/brick2/gv0
gluster volume start gv0
# 确认卷的信息
gluster volume info

注:自GlusterFS 6.1版本,已弃用 stripe 模式

  1. 开启 RPC 服务
    在每个节点上执行以下命令:
# 开启 rpcbind 服务
service rpcbind start
# 必须重启 glusterd 服务
service glusterd restart

第七步:测试 GlusterFS 卷

将使用其中一个服务节点,挂载该卷。通常,我们从外部的机器中挂载该卷,成为客户端。由于该方法需要安装额外的包到客户端机器上,因此我们将使用其中一个服务节点作为“客户端”,进行简单的测试。

  1. 在服务节点1上,挂载创建出来的 gv0 卷(以复制卷为例)
mount -t glusterfs 192.168.142.128:gv0 /mnt
  1. 创建 100 个文件
for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/copy-test-$i; done
  1. 检查挂载点,此时将会看到返回了 100 个文件(还有1 个.glusterfs 目录)
ls -lA /mnt | wc -l
  1. 检查在每个服务节点上的GlusterFS 挂载点:
ls -lA /data/brick1/gv0

在 2 个服务节点上执行上述语句时,均可以得到以下内容:
node1-files
node2-files

搭建 ownCloud

实验步骤

本次实验环境基于搭建 GlusterFS 的 Fedora 服务器上,选择其中任意一台即可。

第一步:准备工作

  1. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  1. 关闭 SELinux
# 临时关闭和永久关闭(二选一)
# 临时关闭
setenforce 0
# 永久关闭
vim /etc/sysconfig/selinux
# 修改 SELINUX=disable
  1. 更新 yum 源(同之前操作)

第二步:安装ownCloud

  1. 安装 samba、httpd
yum install -y samba
yum install -y httpd
  1. 安装 php7.1
# 安装 remi 源
yum -y install http://mirrors.tuna.tsinghua.edu.cn/remi/fedora/remi-release-31.rpm
# 修改 /etc/yum.repos.d/remi.repo
vim /etc/yum.repos.d/remi.repo
# 修改 enabled=1 gpgcheck=0
# 安装 php7.1
yum -y install --enablerepo=remi php71 php71-php php71-php-opcache php71-php-xml php71-php-mcrypt php71-php-gd php71-php-devel php71-php-mysql php71-php-intl php71-php-mbstring php71-php-zip php71-php-fpm
# 查看 php 版本
php71 -v

php71-v
3. 安装 mariadb

yum install -y mariadb mariadb-server
  1. 设置服务开机自启
# 设置 samba 开机启动
systemctl start smb.service
systemctl enable smb.service
# 设置 httpd 开机启动
systemctl start httpd.service
systemctl enable httpd.service
# 设置 mariadb 开机启动
systemctl start mariadb.service
systemctl enable mariadb.service
  1. 修改 /var/www/html 权限
chown apache.apache /var/www/html/
  1. 安装 ownCloud
cd /var/www/html
# 下载 ownCloud
wget https://download.owncloud.org/community/owncloud-10.2.0.tar.bz2
# 解压
tar -xjvf owncloud-10.2.0.tar.bz2
# 拷贝index.php 到html 下
cp /var/www/html/owncloud/index.php /var/www/html/
# 修改目录权限
chmod 777 /var/www/html/owncloud
# 重启 httpd
systemctl restart httpd.service
ps -aux | grep httpd

httpd-status

第三步:注册测试

在虚拟机外部打开浏览器,输入<虚拟机 IP 地址>/owncloud,设置管理员密码并登录,界面如下:
owncloud-web

总结

通过本次 Go 项目实践,我利用 GlusterFS 和 ownCloud 成功搭建了个人云盘服务。前者作为分布式文件系统,通过对他的安装和使用,让我对分布式文件存储有了更加深入的理解,同时也熟悉了7种创建卷的方式,了解到每种方式的优缺点和不同的适用场景。后者作为一个开源的云盘解决方案,让我了解到网盘的高效稳定运行和他背后的存储技术有着密不可分的关系。所以,面对网盘这种业务的大容量、高可用、高速率的需求,我认为需要考虑数据存储的容错性、高利用率、广分布、易拓展的特性。因此,可以结合各个基础卷的优势,采用复合卷(分布式条带复制卷)来解决网盘业务的需求。