现在很多电子商务的网站上都会用到大量的图片,而图片是网页传输中占主要的数据量,也是影响网站性能的主要因素。因此很多网站都会将图片存储从网站中分离出来,另外架构一个或多个服务器来存储图片,将图片放到一个虚拟目录中,而网页上的图片都用一个URL地址来指向这些服务器上的图片的地址,这样的话网站的性能就明显提高了,图片服务器(ImageServer)的概念也就产生了。
那么这种方案对一个轻量级的网站来说应该是没有什么问题了,但是对于一些大的网站来说,还是有问题的。如果网站的访问量很高的话,很多网站都会用多个服务器做负载均衡来提高整个网站的性能。那么如果每个网页服务器的图片地址都指向同一个ImageServer的话,图片传输又成了一个瓶颈,当然可以可以考虑设置服务器的缓存来提高一些性能,但服务器的缓存是有限的,尤其是在图片数量很大的情况下起不到很好的效果,所以就必须用到多个ImageServer,每个网页服务器指向不同的ImageServer。设置多个
ImageServer的话又存在图片同步的问题,因为网站的图片都是在不断的更新,所以就必须要求图片上传后都实时同步到各个图片服务器上去,要做到实时同步困难而且对机器和网络性能都会有影响。当然还有一个办法就是把所有图片都放在一个服务器或是磁盘陈列上,而各个ImageServer的虚拟目录通过内部网络指到图片所在的目录。用这种方法既可以减轻ImageServer的访问压力,又解决了图片同步的问题,而且内部网络的数据传输也非常快,基本上PV(网站页面流量)在10万以内的网站应该不会有什么问题吧。
但是如果访问量更高的时候,磁盘访问的速度就会成为一个瓶颈。试想如果PV超过10万的话,平均每秒钟访问磁盘的次数就会很多了,当然读取图片的速度就会慢了。于是想到了一个办法:用一个服务器作为主图片服务器,图片上传的时候都集中上传到这个服务器上来,另外用多个ImageServer作为从服务器用以供负载均衡中各个网站服务器来访问图片。那么怎样实现图片同步呢?我设想在每一个从ImageServer上放置一个取图片URL地址的接口,当网站需要访问图片的时候,调用ImageServer上的接口工具,传入一个相对的逻辑地址,接口工具通过逻辑地址去查找图片,如果图片文件存在,则返回一个URL地址,如果图片文件不存在,则到主图片服务器上去找,如果找到就把图片拷贝到从服务器上,然后返回一个URL地址。这样的话就可以实现图片自动同步,而且各个从服务器上的图片存储量会比主服务器上的图片要少。
这个方案纯属个人想法,没有经过验证,不知道网友们有没有更好的办法,如果有的话希望跟大家交流一下想法。