图片在很多的应用中会使用到,在论坛和图片分享等应用中会有大规模的使用,在这些应用中的图片的量是很吓人的,并且对图片访问的并发也会非常高,单个的服务器已经无法满足需要了,这个时候需要考虑搭建一个分布式的图片存储系统以保存这么大量的图片信息,并且能支撑高并发的访问。
分析图片的访问,主要问题在于两个方面,一是当高并发时,带宽占用会非常多;二是高并发时硬件的IO会非常高。如何解决这两个问题就是解决问题的方案。
先来解决下硬件的高IO,如果使用分布式的部署,将高并发访问的IO分散到多台图片服务器上去,那么单台服务器的IO就会下来。那如何才能将图片分散存储到多台服务器上,客户端访问图片的时候又如何才能准确的路由到正确的服务器上?这就需要有一个目录服务,目录服务保存和提供图片存放位置的信息,客户端通过目录服务获取图片应该存放在哪台服务器上,以及应从哪台服务器上读取或下载图片。有了目录服务器在服务器端确实可以将图片分布式存储了,但客户端使用图片服务的步骤复杂了,需要先调用目录服务器获取图片上传或下载的服务器信息,再访问对应的服务器上传或下载图片。为了客户端调用能相对简单,系统应该提供一个客户端的封装,以js或jar的方式提供,以简化客户端的使用。这里不再考虑分布式存储的高可用。
根据以上分析,一个可实现的分布式图片存储系统的架构如下:
再来看下带宽占用的问题,一个可行的想法是可以考虑对图片进行压缩传输,但图片的压缩和解压会占用机器的cpu,降低处理性能,在高并发时甚至可能会让服务器崩溃。另外,CDN(内容分发网络)也是一个办法,这样可以分散带宽需求,比如在网通网络和电信网络都建一个节点,两个节点间进行同步(这或许是个难点,需要精细的分析)。使用网通网络的客户端访问时路由到网通的节点,使用电信网络的客户端访问时路由到电信的节点,这样就分散了带宽需求,在网通或电信的内部网络带宽要远高于网通与电信间的带宽。