10分钟,教你快速搭建一套属于自己的分布式文件系统

Posted 敲代码的程序汪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10分钟,教你快速搭建一套属于自己的分布式文件系统相关的知识,希望对你有一定的参考价值。

一、概述

为什么我们需要它?

众所周知,在微服务架构中,从网关进来的请求会通过Ribbon进行负载均衡,可能造成你每次请求都有可能是不同的服务器处理的,因为,为了提高系统的吞吐量,某些服务被集群化,在这种情况下,当用户需要进行文件存储的时候,如果说把文件存储在当前处理请求的服务器中,那么下次当你想要获得这个文件的时候可能就获取不到了,因为你的这次请求可能交由另一个服务器处理了。为了解决在分布式系统中文的件存储这一问题,FastDFS应运而生

FastDFS是什么?

这是一款开源的分布式文件系统,负责对文件进行存储,主要功能包括:文件存储、文件同步、文件访问等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等、并且注重高可用、高性能,使用FastDFS可以很容易的搭建一套高性能的文件服务器集群提供上传、下载文件等服务

FastDFS的结构图:

10分钟,教你快速搭建一套属于自己的分布式文件系统_docker

FastDFS服务端有两个角色 :跟踪器(tracker)和存储节点(storage)。在Storage集群中,每一个Volume也称作一个组(group)

FastDFS是怎么存储文件的?

存储过程

10分钟,教你快速搭建一套属于自己的分布式文件系统_java_02

Tracker主要负责对请求进行调度,起到负载均衡的作用,类似于微服务中的注册中心(有心跳机制等等),它有每一个存储点的信息,在收到客户端发来的存储文件的请求时,会通过负载均衡算法来选择某一个Storage来存储该文件。

为什么是都是集群?

之前提到过高可用、负载均衡等名词,都是通过跟踪器(tracker)的集群化来保证的。当某一个Tracker宕机后,其他的Tracker可以继续对存储请求进行处理,这就保证了高可用。在决定文件要存到哪一个Storage的时候会使用随机或轮询等负载均衡的算法,来保证每个Storage所存储的数据比较均匀

之前也提到过冗余备份、线性扩容,是通过组(group)来保证的。首先,**想想为什么会出现组这个概念呢?**因为,当我们进行文件存储的时候,不是说把文件存储到某个Storage后就万事大吉了,万一某台机器故障了怎么办?

那里面的数据可能就都要丢失了,这是一件非常严重的情况,为了解决这种情况,FastDFS中可以采用多个Storage来存储相同的文件,这样做的目的是进行数据备份,即冗余备份,解决了某个Storage出现故障时文件丢失的问题。这些存储相同文件的Storage就属于同一个组(group)。还有一种情况,**当存储的文件逐渐增多时,如何进行扩容呢?**根据FastDFS的结构,我们可以通过增加组(group)的方式来扩容

二、安装

这里推荐使用Docker安装,因为简单快捷,步骤简单,适合第一次接触FastDfs并且对Linux命令不是很熟悉的小白,话不多说直接进入正题。

大体的流程:安装Docker——拉取FastDFS镜像——使用镜像创建容器并修改配置文件——重启后即可使用

安装Docker

安装
# 1、yum 包更新到最新
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源,(如果提示说没有yum-config-manager这个命令:yum -y install yum-utils)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按
y yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v
# 6、出现docker的版本信息说明成功了
配置镜像加速

登录阿里云,在左侧菜单选中镜像加速器获取自己的专属镜像加地址

阿里云镜像获取地址:​​https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors​​,

在​​/etc/docker/daemon.json​​文件末尾增加你自己的镜像加速地址(如果没有这个文件,就创建一个)

 "registry-mirrors": ["https://你的ID.mirror.aliyuncs.com"]
常用命令:
systemctl start docker    #启动
systemctl stop docker #停止
systemctl restart docker #重启

docker ps #查看运行的容器
docker images #查看下载的镜像

拉取FastDFS镜像

这一步下载镜像需要一点点时间,耐心等待即可

docker pull morunchang/fastdfs

运行Tracker和Storage

运行tracker
  • ​–name​​ 后面的是容器名
  • ​–net=host​​ 表示设置为host网络模式,容器使用主机的ip,并且不用做端口映射
  • ​sh​​后面是执行的是sh文件,如果运行的是storage容器,就是​​storage.sh​
docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh
运行storage

为了方便后面测试是否成功,还需要提前创建一个文件夹,用来关联storage存储的文件,我们可以通过更改此文件来更改storage容器里的文件,你可以把这两个文件夹理解为同一个

#创建文件夹用于后面做文件的映射
mkdir -p /apps/storage/data
  • ​-v​​ 后面是设置的虚拟机文件和容器里的文件的映射关系
  • 将​​TRACKER_IP​​改成自己Linux系统的ip地址(可通过ifconfig查看),如果是云服务器,则改成公网IP
  • ​-e​​ 后面跟的是容器的参数,​​GROUP_NAME​​是组名,可以根据自己的需求进行设置
docker run -d --name storage -v /apps/storage/data:/data/fast_data/data --net=host -e TRACKER_IP=192.168.220.100:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh

修改nginx的配置(storage容器内的)

进入storage容器内部
docker exec -it storage /bin/bash

打开nginx的配置文件nginx.conf

vi /etc/nginx/conf/nginx.conf

添加如下内容(已存在的,不用改),这一步的目的是将​​ip:port/组名/M00/*​​的请求映射到​​ngx_fastdfs_module​​模块下,并且存储在当前容器的​​/data/fast_data/data​​目录下

location ~ /M00 
root /data/fast_data/data;
ngx_fastdfs_module;
add_header Cache-Control no-store;

设置好后就可以退出容器了

exit

容器storage容器

docker restart storage

除了上面的之外,如果你有其他的需求,比如修改配置文件的其他信息,可以按照如下步骤来进行修改

docker exec -it storage /bin/bash
cd /etc/fdfs
vi tracker.conf
vi storage.conf

三、测试

第一步:

测试Nginx是否启动正常,如果上面的步骤中你没有修改nginx的配置文件,默认是8080端口打开

打开浏览器,输入:Linux的​​ip:8080​​,如果看到​​Welcom to Nginx​​则表示Nginx启动没有问题

不成功的解决办法:

如果访问被秒拒绝,则说明是防火墙的原因,如果等待了一段时间后提示错误,则可能是其他原因,这个时候需要进入storage容器查看nginx的error日志,在容器​​/etc/nginx/​​下的日志目录下

第二步:

如果第一步没有问题,则可以往Linux下的​​/apps/storage/data/data/00/00​​目录下传入一个图片,

例如:命名为​​rBCY81_Rh2eAcZAgAA7o7y_7EUQ049.png​​(因为文件名太短是访问不到的),

或者自己创建一个文件

vi /apps/storage/data/data/00/00/rBCY81_Rh2eAcZAgAA7o7y_7EUQ049.txt随便写的内容

然后尝试用浏览器进行访问这个文件,输入如下格式的URL

ip:8080/组名(默认group1)/M00/00/00/文件(例如:rBCY81_Rh2eAcZAgAA7o7y_7EUQ049.txt)

不成功的解决办法:

如果无法访问,可以进入容器,通过查看容器后查看配置文件来锁定错误原因

步骤:

进入容器

docker exec -it storage /bin/bash

查看storage日志文件信息

cat /data/fast_data/logs/storaged.log

在使用SpringBoot或者SpringCloud的FdfsClient进行上传图片时,如果没有get到tracker或者storage,去打开防火墙的22122,23000端口,云服务器的话需要去管理页面开启这些端口(具体百度,根据操作系统) 如果是报的错是超时,可以查看以下application.yml配置文件的超时时间,设置长一些再进行测试

四、总结

对于刚接触这个的小白来说,如果遇到了问题,首先要做的不是盲目的去百度搜解决办法,而应该第一时间想到查看日志文件,并且要知道查看哪一个日志文件,如果说你不知道日志文件在那个目录下,没关系,别着急,这个网上一艘便是,查看日志文件然后再根据日志文件提示的错误锁定问题,然后再针对性的去找解决办法。

平时遇到的很多问题往往都是比较宽泛的,你可能会搜索到各式各样的解决方案,因为一个表面的问题,往往有很多中深层次的问题导致的,是否能靠网上搜到的解决你遇到的问题完全是在靠运气。

重要的事说三遍:

出现问题一定要看日志文件!!!出现问题一定要看日志文件!!!出现问题一定要看日志文件

以上是关于10分钟,教你快速搭建一套属于自己的分布式文件系统的主要内容,如果未能解决你的问题,请参考以下文章

零基础秒懂:手把手教你搭建一套微服务框架!

直播实录|大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块

两天时间兼职运维从零搭建一套分布式文件云存储系统的收获

从 0 到 1 搭建一套 Flink 的监控系统

我要手把手教你搭建一套抗瞬时百万流量的秒杀系统

从 0 到 1 搭建一套 Flink 的监控系统