乐趣区

关于分布式: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 配置文件的超时工夫,设置长一些再进行测试

四、总结

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

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

重要的事说三遍:

呈现问题肯定要看日志文件!!!呈现问题肯定要看日志文件!!!呈现问题肯定要看日志文件

退出移动版