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

一、概述

为什么我们需要它?

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

FastDFS是什么?

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

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

FastDFS的结构图:

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

FastDFS是怎么存储文件的?

存储过程

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配置文件的超时时间,设置长一些再进行测试

四、总结

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

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

重要的事说三遍:

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容