分布式存储初认识——竹子整理

  背景:随着计算机网络技术的发展和普及,出现了越来越多像”淘宝“,”京东“等大型电子商务网站。这类网站都保存有大量图片资源。用户在访问这些站点网页时,网页中图片信息占到页面数据流量的大部分。由于受客户端浏览器限制,无法从一台服务器上同时下载页面中的所有图片信息,因此即使服务器又很高带宽,用户的放弃问速度还是会受到很大影响,由于图片保存在物理硬盘上,访问图片需要频繁进行I/O操作,因此当并发用户数越来越多的时候,I/O操作就会成为整个系统的性能瓶颈。

  对于大型的网站系统来说,由于拥有雄厚的资金,可以使用NFS,CDN,Lighttpd等技术(好吧,除了CDN,在JS中稍微有点认识,其他都没听过),提高用户的访问速度。但这些技术需要庞大的资金支持,对于处于创业初期中等规模的商务网站,由于缺少必要的资金支持,因此无法采用这些技术提升网站的访问速度。今天我们讲一个适用于中等规模商务网站的海量图片数据分布式动态存储及负载均衡的解决方案。该方案只需增加很少的硬件成本,即可提升网站的访问速度,并且可以根据需要动态调整图片服务器的数量及图片的存储目录,确保系统具有可扩展性和伸缩性。

  系统架构设计需满足一下4点要求:

  

   以上只是为了随笔的完整性而收录,好了,直接进入技术阶段。

  本随笔就以图片为例,对分布式存储进行一个简单的介绍。流程是这样的:

  存储阶段:用户上传图片-->web服务器接收-->存储到另一台图片服务器上

  请求阶段:用户请求图片-->web服务器从数据库获取图片信息,请求对应图片服务器-->对应图片服务器进行I/O操作获取图片返回

  以上过程,我都尽量简化了。不要在乎细节~

  好了,先说说存储阶段,粗一看很容易理解,不过具体实施起来,就需考虑实现所需的技术了,其中的关键就是web服务器接收图片后如何存储到图片服务器上。这里(笔者玩.net)有这么几种技术(评论可以补充):

  【1】、将数据进行数据流操作后,即变成bytu[],通过webClient,来进行两个站点间的数据传输。  

byte[] fileByte = 将图片处理成byte[];
string imageUrl = "http://192.168.2.41:8899/UploadImage.ashx?Id=1&Ext=png";
WebClient wc = new WebClient();
wc.UploadData(imageUrl , fileByte);

  

//图片服务器接收(这里用的是一般处理程序)
int imageId = Convert.ToInt32( context.Request["Id"]);
string ext = context.Request["Ext"];
//这两个就组成了我们图片的名称,当然名称如何组成可以你自己定
using(FileStream fs = File.OpenWrite("D:/"+imageId+ext))
{
  //获取传输过来的Byte[]
  //context.Request.InputStream:web服务器wc.UploadData的第二个参数的数据流
  context.Request.InputStream.CopyTo(fs);
}

  【2】、通过在图片服务器中设置一个小的web站点,然后建立一个webService,web服务器通过这个开放的服务进行数据传输,同理,用我们的wcf,webapi也可以实现。这个懂的自然懂,不懂的可以查阅下资料哈,也不是一两行代码能解释的。

  【3】、我们的web服务器与图片服务器放置在一起的话,其实就可以是个局域网,这样一来,我们直接可以将图片服务器的某个文件夹进行”共享“,这样我们的web服务器直接就可以进行I/O操作。

  目前为止,我们存储阶段的流程是走通了,但是问题来了:

  Q1:如果我们有多台图片服务器呢?

  A1:首先,我们应该抓住问题重点,多台服务器,多台怎么了,造成什么问题了?回头看上面【1】的代码,会有哪些变动?就四行代码,很容易看出,多台服务器的区别就是我们的IP变多个了,我们应该用哪个呢?多台的存在肯定是一台不够用,所以我们需要让它们雨露均沾对吧。由此,引出了上文背景的一个词儿:负载均衡。好了,不卖关子,其实很简单,不就是对IP这个字符串数组进行管理嘛,首先建个表,记录我们的IP以及服务器状态(可用不可用之类),其他的字段可以任意扩展。然后我们将图片数据流传输前,就先用随机算法获取我们数据表中的IP,然后WebClient或其他技术,传输即可。

  注意点:图片服务器对图片进行存储完后,需对web服务器说一声,我这边存完了,好让web服务器进行后续操作,如将图片信息保存入数据库,字段应该有:图片Id,图片所在的图片服务器IP,存储路径,时间等。怎么”说一声“呢,很简单,如果传输用的 webClient的话,”说一声“也用这个不就行了。随便在web服务器定义个接口,可以也是一般处理程序,然后定义个接收字段,约束下即可。如果是用wcf,则更简单,方法定义为回调函数即可(我好啰嗦啊,不是怕你们看不懂,是怕我自己日后看不懂~)

  说完存储阶段,下面的请求阶段就很简单了。

  用户请求图片-->web服务器从数据库获取图片信息,请求对应图片服务器-->对应图片服务器进行I/O操作获取图片返回

  请求图片,肯定是带着Id来的,这样我们就从图片信息数据表中查询出对应信息,主要是存储该图片的对应图片服务器的IP,存储路径。然后WebClient等技术请求即可。额,好像完事儿了,确实很简单。

  好了,一堆文字,看着烦。用图片总结下:

  

两张表的设计:

  

如果您认为这篇文章还不错或者有所收获,可以点击右下角的【推荐】按钮,因为你的支持是我继续写作,分享的最大动力!

作者:玛丽的竹子

来源:http://www.cnblogs.com/joeymary/

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

时间: 2024-09-30 20:21:51

分布式存储初认识——竹子整理的相关文章

分布式存储初认识

背景:随着计算机网络技术的发展和普及,出现了越来越多像”淘宝“,”京东“等大型电子商务网站.这类网站都保存有大量图片资源.用户在访问这些站 点网页时,网页中图片信息占到页面数据流量的大部分.由于受客户端浏览器限制,无法从一台服务器上同时下载页面中的所有图片信息,因此即使服务器又很高带 宽,用户的放弃问速度还是会受到很大影响,由于图片保存在物理硬盘上,访问图片需要频繁进行I/O操作,因此当并发用户数越来越多的时候,I/O操作就会 成为整个系统的性能瓶颈. 对于大型的网站系统来说,由于拥有雄厚的资金

从头开始学习数据库及ADO.NET——竹子整理

目前为止,学习编程一年有余,写过管理系统,写过商城,写过桌面,接触的多了,乱七八糟的点太多,一堆前段框架,后台类库,纷纷杂杂,更新迭代之快也是令人咋舌.于是我就在想,作为一名程序员,哪些内容是实打实的干货呢,互联网的内容是学习不完的,只有当你用到它时,才去学习,这是我的理解.零零散散的东西除去,越来越深的感触就是像我这种做应用的实际就是跟数据打交道,数据类型,数据量,数据的存储方式...回顾之前的学习路线,数据库这块感觉理解尚缺,于是今天开始重新回过头整理一遍数据库及ADO.以新人的姿态去学习知

c++的关联容器入门(map and set)

C++的关联容器主要是两大类map和set 我们知道谈到C++容器时,我们会说到 顺序容器(Sequence containers),关联容器(Associative containers),无序关联容器(Unordered associative containers)以及容器适配器(Container adaptors), 另外,我相信,这些抽象的容器概念,应该是所有高级语言都有的.本文重点阐述关联容器. Associative containers implement sorted dat

Cocos2dx 学习笔记整理----在项目中使用图片(初)

cocos2dx有多种使用图片的方法,先来个最简单的:用CCSprite直接使用图片. 首先,进入到之前建立的项目,把你将要使用的图片放入到目录下的Resources文件夹里面.项目中以相对路径使用资源皆是以Resources文件夹为根目录参考的. 然后进入到HelloWorldScene.cpp的init方法的最后面加入以下代码: ? 1 2 3 CCSprite * sprite = CCSprite::create("bl_24.png"); sprite->setPosi

PHP初入,div知识点整理(特效&字体等元素的使用整理)

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <!--<style> /*.nav{ background-color: red;/*背景颜色*/ background-image: url(../01.jpg); /*加背景图片*/ border: 2px solid black; width: 200px

PHP初入,简易网页整理(布局&amp;特效的使用)

html><html> <head> <meta charset="UTF-8"> <title></title> <style> /*全局设置*/ *{ margin: 0px; padding: 0px; } .all{ width: 100%; height: 100%; border: 0px solid black; position: absolute; } .top{ width: 950px;

js 面向对象方法初整理

<script> function f1(){ alert(1); } function f2(){ alert(2); } var func = ""; function f(id){ if(id%2 == 0){ func = f1;//将F1指针指向对应的函数 }else{ func = f2; } func();//调用相应的方法 } f(0); </script> <script> var anim = function(){} anim.

函数基本用法初整理

1. 区分形参和实参 2. 作用域链:主要描述的就是局部变量里的值,如果在自己的作用域找不到的话,就要向上一个作用域去 搜索.但是反过来全局变量没有的不能去局部作用域里去找 3  函数中的arguments 1)是一个数组,里面储存的是传入的实参   (可以0,可以很多) 2)不知道传进来的值是几个的时候,用arguments比较合适,如果确定传的参数,就用实参 4. 函数的预解析(都是提升到本作用域的最上方) 1)var 变量的提升 有var的才能提升,不带var的是全局变量 且提升的是函数名

大数据与机器学习的一些博文整理

Spark VS MapReduce 时间节约66%,计算节约40% http://mp.weixin.qq.com/s?__biz=MzA3MjY1MTQwNQ==&mid=200820787&idx=1&sn=638a4b16445a5ee7a184b7a9becf4d5d&scene=2&from=timeline&isappinstalled=0#rd 数据挖掘十大算法总结--核心思想,算法优缺点,应用领域 http://mp.weixin.qq.c