一、概述
为什么我们需要它?
众所周知,在微服务架构中,从网关进来的请求会通过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
运行storage
为了方便后面测试是否成功,还需要提前创建一个文件夹,用来关联storage存储的文件,我们可以通过更改此文件来更改storage容器里的文件,你可以把这两个文件夹理解为同一个
#创建文件夹用于后面做文件的映射mkdir -p /apps/storage/data
- -v 后面是设置的虚拟机文件和容器里的文件的映射关系
- 将TRACKER_IP改成自己Linux系统的ip地址(可通过ifconfig查看),如果是云服务器,则改成公网IP
- -e 后面跟的是容器的参数,GROUP_NAME是组名,可以根据自己的需求进行设置
修改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/bashcd /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配置文件的超时时间,设置长一些再进行测试
四、总结
对于刚接触这个的小白来说,如果遇到了问题,首先要做的不是盲目的去百度搜解决办法,而应该第一时间想到查看日志文件,并且要知道查看哪一个日志文件,如果说你不知道日志文件在那个目录下,没关系,别着急,这个网上一艘便是,查看日志文件然后再根据日志文件提示的错误锁定问题,然后再针对性的去找解决办法。
平时遇到的很多问题往往都是比较宽泛的,你可能会搜索到各式各样的解决方案,因为一个表面的问题,往往有很多中深层次的问题导致的,是否能靠网上搜到的解决你遇到的问题完全是在靠运气。
重要的事说三遍:
出现问题一定要看日志文件!!!出现问题一定要看日志文件!!!出现问题一定要看日志文件