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安装
六.文件上传流程
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安装
十一.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>
网友评论