分布式存储初认识

背景:随着计算机网络技术的发展和普及,出现了越来越多像”淘宝“,”京东“等大型电子商务网站。这类网站都保存有大量图片资源。用户在访问这些站 点网页时,网页中图片信息占到页面数据流量的大部分。由于受客户端浏览器限制,无法从一台服务器上同时下载页面中的所有图片信息,因此即使服务器又很高带 宽,用户的放弃问速度还是会受到很大影响,由于图片保存在物理硬盘上,访问图片需要频繁进行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等技术请求即可。额,好像完事儿了,确实很简单。

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

  

两张表的设计:

  

  补充:上面提到的满足负载均衡的算法,这里给个小例子:

  

var list = db.ImageServerInfo.Where<ImageServerInfo>(c=>c.State==1).ToList();
int serverCount = list.Count();
Random r = new Random();
int i = r.Next();
int j = i%r;
//获取状态为1(normal)的图片服务器总数,随机数去对其取余。得到的就是我们的随机索引,于是就可通过list[j]去获取ServerId,然后再去获取ServerIP

时间: 2024-11-06 02:14:39

分布式存储初认识的相关文章

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

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

基于MongoDB分布式存储进行MapReduce并行查询

中介绍了如何基于Mongodb进行关系型数据的分布式存储,有了存储就会牵扯到查询.虽然用普通的方式也可以进行查询,但今天要介绍的是如何使用MONGODB中提供的MapReduce功能进行查询.      有关MongoDb的MapReduce之前我写过一篇文章 Mongodb Mapreduce 初窥, 今天介绍如何基于sharding机制进行mapreduce查询.在MongoDB的官方文档中,这么一句话: Sharded Environments      In sharded enviro

Hadoop架构的初略总结(1)

Hadoop架构的初略总结(1) Hadoop是一个开源的分布式系统基础架构,此架构可以帮助用户可以在不了解分布式底层细节的情况下开发分布式程序. 首先我们要理清楚几个问题. 1.我们为什么需要Hadoop? 解: 简单来说,我们每天上网浏览,上街购物,都会产生数据.我们处于一个数据量呈爆发式增长的时代.我们需要对这些数据进行分析处理,以获得更多有价值的东西.而Hadoop应时代而生.其次我们应该比较了解传统型关系数据库跟Hadoop之间有何区别.这些在前面的Hadoop第二课我们都有所提到.

VMware vSAN分布式存储安装配置

作者:在路上(老李) DCD|DCA   QQ群:384423770 一.环境说明 管理地址: AD:        192.168.1.254 ESXi01:        192.168.1.201 ESXi02:        192.168.1.202 ESXi03:        192.168.1.203 ESXi04:        192.168.1.204 vCenter:        192.168.1.200 VSAN地址: esxi01:        172.16.2

初笋科技:天阔资本穆延飞:只有你擅长的才是真正的风口

初笋科技:天阔资本穆延飞:只有你擅长的才是真正的风口 这个已过了不惑之年的西北汉子,军人出身的他和现在的资本家------天阔资本首席执行官,似乎八竿子打不到一块儿.但是,在投资市场上的战绩却历历在目.算起来,天阔资本是从06年开始,在投资行业涉入的时间还是比较早,一开始主要是实体投资,主要与政府间用BOT合作,今年还斥资9800万做了一个BOT项目.而互联网的投资主要在大热的时候开始,是从14年开始,就做到了新三板.也许,多年的军队行政管理,专业技术,机关参谋多岗位工作经历,养就了穆延飞对待投

cocos2d-x ios游戏开发初认识(五) CCsprite精灵类

这次写一下精灵创建的几种类型: 一.通过文件创建: 在原有的基础上添加如下代码: //一.通过文件创建精灵 CCSprite *bg =CCSprite::create("map.png"); CCSize winSize  =CCDirector::sharedDirector()->getWinSize(); //得到屏幕的尺寸 bg->setPosition(ccp(winSize.width/2, winSize.height/2)); this->addCh

erlang 初体验

最近测试了一下 erlang的坑... 如不出意外.... 大家第一眼看到这语法... 心里第一句一定是"我擦.这TM都是啥!!!!!" 没有变量!!! 没有结构体!!! 没有循环!!! 好吧,至少我是这样想的. 找了半天..连个if也不知道怎么写.. 这记录一些基本常识.. -module(module_name)  %%定义模块 括号内的要和文件名相同. -export([fun1/1 fun2/2]) %%这里是导出2个函数对外使用  函数名/参数名. 一个简单的函数定义如下 f

linux初体验

第一次听到linux这个'词语'是在一次偶然的朋友聊天中朋友提到的,之前压根没听到过'这个东西',所以我可以说是个linux的新新手,菜鸟都不算. 截至到目前,我已经开始linux系统运维学习有差不多10天时间了.在没接触linux之前,我对它的认识仅仅是:它是个计算机系统.决定学习linux系统运维之前,自我以为运维应该是对系统的一些日常维护之类的,不会很难的东西,我更希望运维是个不难的东西,我个人很笨,对难的东西可能接受的很慢,所以我愿意认为运维是很简单的,这样我就可以轻轻松松的掌握运维相关

初尝Mcafee之在ePO中进行策略和客户端任务设置【06】

一.策略和客户端任务概述 在ePO中点击"菜单",可以看到一个策略的大分类:ePO就是通过分配策略和客户端任务给客户端代理,然后代理将这些策略和客户端任务分配给本地相应的Mcafee杀毒防护软件进行执行: 策略是针对软件的内在参数和计划任务的配置,例如VirusScan是否扫描压缩文件,VirusScan的扫描计划的设置: 客户端任务是针对软件的外在交互,例如安装,部署,更新,信息统计等: 二.策略和客户端任务的分配结构: 策略和客户端任务的分配结构有点跟Windows Server的