高级框架第三天FastDFS

2020-08-17  本文已影响0人  w漫漫

FastDFS:分布式文件系统

一.项目架构的改变

1.

以前

以前我们采用的上面的方式进行图片存储.图片在哪个项目中上传的图片就存储到哪个项目所在的服务器.其他项目模块通过HTTP请求进行获取图片.

缺点:

图片存储过于分散

图片多的服务器压力比较大,可能会影响其他功能

存储到项目路径中,重启会丢失.存储到外部文件中,I/O操作性能低

针对上面的问题可以搭建单独的图片服务器,专门做图片存储及图片访问的.而想要搭建文件服务器就需要应用文件存储技术/工具,比如分布式文件系统架构图

2.分布式文件系统架构图

分布式文件系统架构图

二.分布式文件系统概述

1.分类

1.1通用分布式文件系统

和传统的本地文件系统(如ext3,NTFS等)相对应.典型代表:lustre,MooseFS

1.1.1优点

标准文件系统操作方式,对开发者门槛较低

1.1.2.缺点

系统复杂性较高.需要支持若干标准的文件操作.如:目录结构,文件读写权限,文件锁等.复杂性更高

系统整体性能有所降低,因为要支持POSIX标准(表示可移植操作系统接口(Portable Operating System Interface of UNIX),POSIX标准定义了操作系统应该为应用程序提供的接口标准)

1.2专用分布式文件系统

基于google File System的思想,文件上传后不能修改.需要使用专有API对文件进行访问,也可称作分布式文件存储服务.典型代表:MogileFS,FastDFS,TFS

1.2.1优点

系统复杂性较低,不需要支持若干标准的文件操作,如:目录结构,文件读写权限,文件锁等,系统比较简洁

系统整体性能较高,因为无需支持POSIX标准,可以省去支持POSIX引入的环节,系统更加高效

1.2.2缺点

采用专有API,对开发者门槛较高(可直接封装成工具类)

2.Google FS体系结构

2.1两个角色

名字服务器(索引服务器)

存储服务器

2.2.架构特点

不支持文件修改功能

文件分块存储,需要索引服务器

一个文件可以存储多份,一个文件存储到哪些存储服务器,通常采用动态分配的方式

三.FastDFS简介

1.简介

FastDFS是一个轻量级的开源分布式文件系统.2008年4月份开始启动.类似google FS的一个轻量级分布式文件系统,纯C实现,支持Linux,FreeBSD,AIX等UNIX系统.

主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡.实现了软件方式的磁盘阵列(Redundant Arrays of Independent Drives,RAID),可以使用廉价的IDE(Integrated Driver Electronics)硬盘进行存储.并且支持存储服务器在线扩容.支持相同内容的文件只保存一份,节约磁盘空间

FastDFS只能通过Client API访问,不支持POSIX访问方式

FastDFS特别适合大中型互联网应用使用,用来存储文件资源(如:图片,文档,音频,视频等)

2.网址

FastDFS没有官网.但是作者余庆(happy_fish100)担任chinaunix中FastDFS板块版主.并且会不定期更新板块中内容

http://bbs.chinaunix.net/

FastDFS软件可以在sourceforge进行下载,最新版本为5.08

http://sourceforge.net/projects/fastdfs/files/

四.FastDFS架构

1.架构图

架构图

2.角色

Client:客户端.使用java语言编写的项目属于客户端

Tracker Server:跟踪服务器,主要做调度工作,在访问上起负载均衡的作用.在内存中记录集群中group和storage server的状态信息,是连接Client和Storage server的枢纽

Storage Server:存储服务器,文件和文件属性(meta data)都保存到存储服务器上

3.架构解读

只有两个角色,tracker server 和storage server,不需要存储文件索引信息

所有服务器都是对等的,不存在Master-Slave关系

存储服务器采用分组方式,同组内存储服务器上的文件完全相同(RAID1)

不同组的storage server之间不会相互通信

由storage server 主动向tracker server报告状态信息,tracker server之间不会相互通信

五.FastDFS安装

FastDFS安装

六.文件上传流程

1.时序图

时序图

2.流程说明

1.客户端访问Tracker

2.Tracker返回Storage的ip和端口

3.客户端直接访问Storage,把文件内容和元数据发送过去

4.Storage返回文件存储id.包含了组名和文件名

七.文件下载

1.时序图

2.下载说明

1.client询问tracker下载问阿金的storage,参数为文件标识(组名和文件名)

2.tracker返回一台可用的storage;

3.client直接和storage通讯完成文件下载

八.Nginx简介

1.简介

FastDFS是没有文件访问功能的,需要借助其他工具实现图片HTTP访问的.Nginx就具备代理虚拟机主机功能

Nginx(engine x)是一个高性能的HTTP和反向代理服务.Nginx是由伊戈尔.赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日

Nginx是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性:在连接高并发的情况下,Nginx是Apache服务不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一

2.代理方式

2.1正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获取的内容返回给客户端.客户端才能使用正向代理

正向代理

 2.2反向代理

反向代理(Reverse proxy)方式是指代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器

方向代理

2.3二者之间的区别

位置不同

正向代理,架设在客户机和目标主机之间;

反向代理,架设在服务器端;

代理对象不同

正向代理,代理客户端,服务端不知道实际发起请求的客户端;

反向代理,代理服务端,客户端不知道实际提供服务的服务端

3.Nginx作用

3.1HTTP协议代理

只要支持HTTP协议访问内容,都可以由Nginx进行代理.Nginx只支持HTTP协议的代理,其他协议不支持

3.2搭建虚拟主机

Nginx可以监听安装的主机的某个端口,对外支持这个端口的HTTP访问.当接收到外部HTTP请求后把本机中资源返回给客户端.今天的课程内容就是使用Nginx的搭建虚拟主机功能,外部请求图片时,把图片信息响应给请求发

3.3负载均衡

Nginx可以代理多个主机,内置负载均衡策略

十.Nginx安装

nginx安装(包含fastdfs模块)

十一.KindEditor使用

1.KindEditor简介

KingEditor是基于JavaScript的插件.里面包含了丰富的组件,如:多文件上传组件,富文本编辑框

使用KindEditor可以大大的降低页面开发难度

2.文件上传参数及返回值说明

3.代码示例

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

<title>Insert title here</title>

<link rel="stylesheet" href="js/kindeditor/themes/default/default.css"/>

<script src="js/kindeditor/kindeditor-all.js"></script>

<script src="js/kindeditor/lang/zh_CN.js"></script>

<script type="text/javascript">

    KindEditor.ready(function(K){

        var editor = K.editor({

            allowFileManager:true,

            uploadJson:'upload'

        });

        editor = K.create('textarea[name="feel"]',{

            uploadJson:'upload'

        });

        K('#J_selectImage').click(function(){

            editor.loadPlugin('multiimage',function(){

                editor.plugin.multiImageDislog({

                    clickFn:function(urlList){

                        var div = K('#J_imageView');

                        div.html('');

                        K.each(urlList,function(i,data){

                            div.append('<img src="'+data.url+'" width="50" height="50" />');

                            div.append('<imput type="hidden" name="imgs" value="'+data.url+'" />');

                        });

                        editor.hideDialog();

                    }

                })

            })

        })

    })

</script>

</head>

<body>

<form action="insert" method="post">

    标题:<input type="text" name="title"/><br/>

    图片:<input type="button" id="J_selectImage" value="批量上传"/>

    <div id="J_imageView"></div>

    感受:<textarea name="feel" style="width:700px;height:200px;visibility:hidden;"></textarea><br/>

    <input type="submit" value="发布"/>

</form>

</body>

</html>

上一篇 下一篇

猜你喜欢

热点阅读