当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-01 22:14:06 Java

1.概述为什么需要它?众所周知,在微服务架构中,网关传入的请求会通过Ribbon进行负载均衡,这可能会导致每个请求都被不同的服务器处理,因为,为了提高系统的吞吐量,一些服务是集群的,在这种情况下,当用户需要存储文件时,如果文件存储在当前处理请求的服务器中,那么下次想要获取文件时,可能就获取不到了,因为你这次的请求可能已经被另一台服务器处理了。为了解决分布式系统中的文件存储问题,FastDFS应运而生。什么是FastDFS?这是一个负责存储文件的开源分布式文件系统。其主要功能包括:文件存储、文件同步、文件访问等,解决了大容量存储和负载均衡的问题。特别适用于以文件为载体的在线服务,如相册网站、视频网站等。FastDFS专为互联网量身打造,充分考虑了冗余备份、负载均衡、线性扩展等,注重高可用和高性能。使用FastDFS,可以轻松搭建一个高性能的文件服务器集群,提供上传、下载文件等功能。FastDFS服务结构图:FastDFS服务器有两个角色:tracker(跟踪器)和存储节点(storage)。在一个Storage集群中,每个Volume也被称为一个组(group)。FastDFS是如何存储文件的?存储过程Tracker主要负责调度请求,起到负载均衡的作用。类似于微服务中的注册中心(有心跳机制等)。它包含有关每个存储点的信息。当请求存储文件时,会通过负载均衡算法选择某个Storage来存储文件。为什么都是集群?前面提到的高可用、负载均衡等,都是通过tracker的集群来保证的。当一个Tracker宕机时,其他Tracker可以继续处理存储请求,保证了高可用。在决定将文件保存到哪个Storage时,会使用随机或roundrobin等负载均衡算法来保证每个Storage存储的数据是相对统一的。前面提到过,冗余备份和线性扩展都是通过组(group)来保证的。首先想想为什么会出现组的概念?因为,我们在存储文件的时候,并不是说把文件存储到某个Storage中就万事大吉了。如果某台机器出现故障怎么办?其中的数据可能会丢失。这是一个非常严重的情况。为了解决这种情况,FastDFS可以使用多个Storages来存储同一个文件。这样做的目的是为了进行数据备份,即冗余I备份,解决一个Storage出现故障时文件丢失的问题。这些存储相同文件的存储属于同一个组。还有一种情况,当存储的文件数量逐渐增加时,如何扩容呢?根据FastDFS的结构,我们可以通过添加组来扩容。2.安装这里推荐使用Docker安装,简单快捷,步骤简单。适合刚接触FastDfs,对Linux命令不是很熟悉的初学者。话不多说,让我们进入正题。大致过程:安装Docker——拉取FastDFS镜像——使用镜像创建容器并修改配置文件——重启后即可使用InstallDocker进行安装#1、更新yum包到最新的yumupdate#2.安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖yuminstall-yyum-utilsdevice-mapper-persistent-datalvm2#3.设置yum源,(如果提示没有yum-config-manager这个命令:yum-yinstallyum-utils)yum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.repo#4.安装docker,进入界面按yyuminstall-ydocker-ce#。5、查看docker版本,验证是否验证成功。docker-v#6.出现docker版本信息,说明镜像配置为加速登录阿里云。选择左侧菜单中的镜像加速器获取自己的专属镜像加地址阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,在/etc末尾添加自己的镜像/docker/daemon.json文件加速地址(没有该文件则新建一个){"registry-mirrors":["https://yourID.mirror.aliyuncs.com"]}常用命令:systemctlstartdocker#启动systemctlstopdocker#停止systemctlrestartdocker#重启dockerps#查看正在运行的容器dockerimages#查看下载的镜像拉取FastDFS镜像这一步下载镜像需要一点时间,耐心等待dockerpullmorunchang/fastdfsrunTrackerandStorageruntracker–name容器名称是什么–net=host表示设置对于宿主机网络模式,容器使用宿主机的ip,不需要做端口映射。sh文件在sh之后执行。storage容器运行的话就是storage.shdockerrun-d--nametracker--net=hostmorunchang/fastdfsshtracker.shrunsstorage为了方便后面测试成功,需要创建文件夹预先关联存储在存储器中的文件。我们可以通过更改这个文件来更改存储容器中的文件。你可以把这两个文件夹理解成一样的#创建一个文件夹,方便后面的文件映射mkdir-p/apps/storage/data-v后面是设置的虚拟机文件和容器中文件的映射关系ChangeTRACKER_IP到自己的linux系统如果是云服务器,改成公网IP-e后跟容器的参数,GROUP_NAME是组名,可以根据自己的需要设置dockerrun-d--namestorage-v/apps/storage/data:/data/fast_data/data--net=host-eTRACKER_IP=192.168.220.100:22122-eGROUP_NAME=group1morunchang/fastdfsshstorage.sh修改Nginx配置(存储容器中)进入存储容器dockerexec-itstorage/bin/bash打开nginx配置文件nginx.confvi/etc/nginx/conf/nginx.conf添加如下内容(已有的,不用改),目的这一步是将ip:port/组名/M00/*的请求映射到ngx_fastdfs_module模块,存放在当前容器位置的/data/fast_data/data目录下~/M00{root/data/fast_data/data;ngx_fastdfs_module;add_headerCache-Controlno-store;}设置后可以退出容器exitcontainerstoragecontainerdockerrestartstorage除了以上另外,如果有其他需求,比如修改配置文件中的其他信息,可以按照以下步骤修改:dockerexec-itstorage/bin/bashcd/etc/fdfsvitracker.confvistorage.conf3.先测试第一步:测试Nginx是否正常启动。如果以上步骤没有修改nginx配置文件,则默认开启8080端口,打开浏览器输入:Linuxip:8080。如果看到WelcomtoNginx,说明Nginx启动没有问题不成功的解决方法:如果访问被秒拒,说明是防火墙的原因。如果等待一段时间后显示错误,可能是其他原因。这时候需要进入存储容器查看nginx的错误日志。在容器/etc/nginx/下log目录下的第二步:如果第一步没问题的话,可以传一张图片到linux下的/apps/storage/data/data/00/00目录下,例如:将其命名为rBCY81_Rh2eAcZAgAA7o7y_7EUQ049。png(因为文件名太短无法访问),或者创建一个文件vi/apps/storage/data/data/00/00/rBCY81_Rh2eAcZAgAA7o7y_7EUQ049.txt并尝试用浏览器访问这个文件。按照以下格式输入urlip:8080/组名(默认group1)/M00/00/00/file(例如:rBCY81_Rh2eAcZAgAA7o7y_7EUQ049.txt)不成功的解决方法:如果不能访问,可以进入容器查看配置文件后查看容器锁定错误原因步骤:进入容器dockerexec-itstorage/bin/bash查看存储日志文件信息cat/data/fast_data/logs/storaged.log使用SpringBoot或SpringCloud的FdfsClient上传时图片,如果没有trackerorstorage,打开防火墙的22122和23000端口。对于云服务器,需要在管理页面(具体可以百度,根据操作系统)打开这些端口。如果报错是超时,可以查看下面application.yml配置文件的超时时间。设置更长的时间,然后进行测试。4.总结对于那些刚接触这个的人对于小白来说,遇到问题,首先要做的不是盲目去百度搜索解决方案,而是应该第一时间想到查看日志文件,知道要查看哪个日志文件。如果你不知道日志文件在那个目录下,没关系,不用担心,网上有一个,查看日志文件然后根据日志提示的错误锁定问题文件,然后有针对性地寻找解决方案。平时遇到的很多问题,往往都是比较宽泛的,你可能会找到各种各样的解决办法,因为一个表面的问题,往往是由很多深层次的问题引起的。能否通过网上搜索解决遇到的问题,完全看运气。重要的事情说三遍:有问题一定要看日志文件!!!如果出现问题,请务必查看日志文件!!!如果有问题,您必须查看日志文件