今天记录下图片的分布式存储和负载均衡实现原理。
对于Web服务器而言,用户对图片信息的访问是很消耗服务器资源的。当一个网页被浏览时,Web服务器与浏览器建立连接,每个连接表示一个并发。当页面包含多个图片时,Web服务器与浏览器会产生多个连接,同时发送文字和图片以提高浏览速度。因此,页面中图片越多Web服务器受到的压力也就越大。
一般小型网站是把所有页面和图片统一存放在一个主目录下,这样的网站对系统架构、性能要求都很简单。下面是原理图
一些稍有规模的网站都保存有大量图片资源。用户在访问这些站点网页时,网页中图片信息占到页面数据流量的大部分。由于受客户端浏览器限制,无法从一台服务器上同时下载页面中所有图片信息,因此即使服务器有很高带宽,用户的访问速度还是会受到很大影响。由于图片保存在物理硬盘上,访问图片需要频繁进行I/O 操作,因此当并发用户数越来越多时,I/O操作就会成为整个系统的性能瓶颈。这个时候我们就要考虑把这些图片信息进行分布式存储了。
下面说一个适用于中等规模商务网站的图片数据分布式动态存储及负载均衡的解决方案的思路。这种思想只需增加很少的硬件成本,即可提升网站的访问速度,并且可以根据需要动态调整图片服务器的数量及图片的存储目录,确保系统具有可扩展性和伸缩性。但对于大型的网站系统来说,他们可能会有更好的技术来实现数据的分布式存储。
增加了图片服务器后,对于客户端而言,整个网站系统执行过程应该仍然是透明的,不会给用户带来任何影响。但后台系统需要解决以下4个问题:
(1)如何实现图片的分布式部署,图片上传时如何动态确定保存到哪台图片服务器;
(2)如何做到图片服务器的负载均衡,既要保证所有图片服务器都有均等的机会来保存图片.
(3)如何把一台图片服务器上图片均衡保存到多个子目录中以便突破操作系统在同一个目录中保存文件数的限制,对图片进行更好的管理和维护;
(4)如何能根据性能需要和图片数量的增加实现图片服务器的动态扩充。
下面是原理图
Web服务器部署网站的Web页面,用于响应客户端用户的请求。当用户浏览网页时,Web服务器响应请求并访问数据库服务器,获得网页中所有图片的URL路径,然后生成页面并返回给客户端,客户端接收该页面并根据页面中的图片URL路径自动从不同的图片服务器下载并显示相应图片。当用户上传图片时,Web服务器首先从数据库服务器中获取所有图片服务器的当前状态,并根据相关算法选择一个图片服务器及保存的目录,再调用该图片服务器的Web Service方法把图片保存到该服务器,最后在数据库服务器中纪录该图片的编号及URL路径等信息。数据库服务器用于记录所有图片的编号以及图片的存放位置等信息,同时需要记录所有图片服务器的配置及当前状态信息。图片服务器集群用于存放网站的所有图片信息,该集群的服务器数量可以根据需要动态增加。
图片服务器信息表
![](https://images2015.cnblogs.com/blog/825618/201511/825618-20151123221201967-1526492966.png)
Web服务器需要及时掌握所有图片服务器的状态和信息才能动态决定把图片保存到哪一台图片服务器,因此,需要把所有的图片服务器的状态信息全部纪录到数据库服务器中, 状态信息表中的ServerId字段为主键自增列,唯一代表一条图片服务器纪录。ServerName字段记录服务器的名称,方便管理员识别该记录代表哪台服务器。ServerUrl字段标识了图片服务器上图片主目录的URL根路径。PicRootPath字段标识了保存图片的物理主目录。MaxPicAmount字段表示图片服务器能保存的最大图片数,该数可以根据图片服务器的硬件配置和性能以及用户实际需要而进行动态调整。CurPicAmount字段表示当前已保存的图片数,当CurPicAmount≥MaxPicAmount时系统将不再把图片上传到该服务器。FlgUsable字段表示图片服务器是否可用。
把图片保存到图片服务器上
可以在图片服务器上部署相应的服务,实现方式有web service、WCF、webclient类,共享文件等等。
获取图片服务器的随机算法
从状态表筛选出可用的图片服务器集合记作C,并获取集合的总记录数N。然后用随机函数产生一个随机数R1并用R1与N进行取余运算记作I=R1%N。则C[I]即为要保存图片的图片服务器
检测图片服务器是否正常运行
可以利用心跳机制
客户端用户通过浏览器向Web服务器发出浏览某页面的请求,Web服务器从数据库服务器中获取该页面的所有图片URL信息,并根据URL信息去搜索图片服务器的状态信息表,判断该URL所指向的图片服务器的状态字段FlgUsable,若FlgUsable == false表示该图片服务器当前因某种原因处于不可用状态,则把该图片的URL替换成Web服务器上保存的一个默认图片的URL,否则把该URL直接返回给客户端。客户端再根据图片的URL路径自动从不同的图片服务器上下载并显示相应的图片。由于图片URL路径直接指向具体的图片服务器,因此需要在每个图片服务器的保存图片的主目录上建立一个Web站点。由于客户端浏览器所需要的图片是从多个图片服务器上直接下载,因此浏览器可以并发地从多台服务器上同时下载图片,这样就缩短了图片下载时间,同时也减轻了Web服务器的I/O请求及性能压力,因此,提高了网站的访问速度 .
写在后面:这里讲的只是思路,需要考虑的细节点还是挺多的。这个就需要在实践中体会了。写的不好或不对的地方请大家指正!