越来越多的网站把图片从应用服务器中剥离出来,放到专门的图片服务器上。
那么,为什么使用独立的图片服务器?
(1)与应用服务器分离后,减轻应用服务器的I/O负载,提高应用服务器的性能和稳定性。
(2)与应用服务器分离后,可以专门对图片服务器进行优化。
(3)与应用服务器分离后,图片服务器可以横向扩展。
搭建图片服务器要考虑以下问题:
1. 使用物理上独立的图片服务器
一个基本的事实是:图片比文字消耗的系统资源更多,如果将图片服务和应用服务放在同一个服务器的话,应用服务器很容易会因为图片的高I/O负载而崩溃,因此有必要将图片服务器和应用服务器分离。
2. 选择适合图片存储的物理介质和文件系统
有了独立的图片服务器后,才能对图片服务器做更有针对性的性能优化。
(1)从硬件角度说,为图片服务器配置高端硬盘,而CPU一般配置即可。
(2)从软件角度说,为图片服务器配置特殊的文件系统来满足对图片的I/O请求,比如淘宝的TFS,就很好地解决了大规模小图片文件带来的I/O噩梦。
3. 合理的缓存策略
6. 高效的图片处理功能
这里的图片处理功能主要指的是文件上传功能、不同规格的缩略图生成功能、加水印功能等等。
网上应该有一些比较好的文件上传功能实现(支持多文件,支持断点续传)和缩略图生成功能实现。
可以压力测试一下,看看效率怎样。
这里有一个问题要权衡一下:是把所有的缩略图都生成静态图片保存,以后访问时速度会快些,但是占用磁盘空间;还是只保留原图,每次动态生成缩略图。
7. 图片的URL与所在图片服务器的关系
在上传图片时,要决定图片上传到哪个图片服务器上。
当然,我们可以根据图片的时间和分类放到不同服务器上。
但为了提高效率,有必要使用URL Hash一致性算法。这样,图片会平均的分配到各个图片服务器上。
一般来说,我们可以直接使用图片的名称来计算出这些信息。
8. 国内图片网站Yupoo的架构图
9. 淘宝图片服务的架构图
参考文献:
1. http://wenku.baidu.com/view/3594f573168884868762d69d.html
2. http://zimg.buaa.us/arch_design.html
3. http://blog.csdn.net/21aspnet/article/details/6584793
4. http://blog.csdn.net/lixinso/article/details/6639643
5. http://houxiyang.com/archives/113/
6. http://houxiyang.com/archives/23/
7. http://houxiyang.com/archives/107/
8. http://www.biaodianfu.com/facebook-efficient-storage-of-billions-of-photos.html
9. http://www.uml.org.cn/zjjs/201111285.asp
10. 《淘宝技术这十年》
那么,为什么使用独立的图片服务器?
(1)与应用服务器分离后,减轻应用服务器的I/O负载,提高应用服务器的性能和稳定性。
(2)与应用服务器分离后,可以专门对图片服务器进行优化。
(3)与应用服务器分离后,图片服务器可以横向扩展。
搭建图片服务器要考虑以下问题:
1. 使用物理上独立的图片服务器
一个基本的事实是:图片比文字消耗的系统资源更多,如果将图片服务和应用服务放在同一个服务器的话,应用服务器很容易会因为图片的高I/O负载而崩溃,因此有必要将图片服务器和应用服务器分离。
2. 选择适合图片存储的物理介质和文件系统
有了独立的图片服务器后,才能对图片服务器做更有针对性的性能优化。
(1)从硬件角度说,为图片服务器配置高端硬盘,而CPU一般配置即可。
(2)从软件角度说,为图片服务器配置特殊的文件系统来满足对图片的I/O请求,比如淘宝的TFS,就很好地解决了大规模小图片文件带来的I/O噩梦。
3. 合理的缓存策略
使用Squid或Varnish作为Web缓存服务器。
4. 使用独立域名
注意,这里指的是独立域名,不是二级域名,比如yahoo.com图片服务器用了yimg.com的域名,而不是用二级域名img.yahoo.com。
原因如下:
(1)浏览器对同一域名下的并发连接数有限制,一般不超过30个。
如果给图片服务器配置独立的域名,那么在一个页面中加载图片时,就可以突破浏览器连接数的限制,理论上,增加一个独立域名,并发连接数加倍。
(2)同一域名下,由于cookie未被缓存,导致图片即使在缓存中,也无法命中。
说明,这一问题也可以通过清除Web缓存服务器(如Varnish)中cookie来解决。
(3)域名不同可以方便CDN的解析与同步(如果使用CDN)。
5. 多台图片服务器之间如何同步?
(1)NFS共享方式
如果你不想在每台图片服务器同步所有图片,那NFS共享是最简单也最实用的方式。
NFS是个分布式的客户机/服务器文件系统,NFS的实质在于用户间计算机的共享,用户可以连接到共享计算机,然后象访问本地硬盘一样访问共享计算机上的文件。
具体实现思路是:Web服务器通过nfs挂载多台图片服务器export出来的目录,用户先将图片上传到Web服务器,然后将上传的图片通过程序拷贝到这个mount目录中去,这样那几台图片服务器就也能访问到刚上传的图片了。
这种方式好处是几乎没有延时(除了拷贝的时间),不好的地方是依赖NFS服务,NFS服务挂了,同步机制就失效了。
(2)使用FTP同步
上传完图片后使用FTP同步到各个图片服务器,php、java、asp.net都能操作FTP。
这种方式的缺点是将图片FTP到服务器比较耗时,如果用异步方式同步又会有延时。
(3)使用分布式存储软件
注意,这里指的是独立域名,不是二级域名,比如yahoo.com图片服务器用了yimg.com的域名,而不是用二级域名img.yahoo.com。
原因如下:
(1)浏览器对同一域名下的并发连接数有限制,一般不超过30个。
如果给图片服务器配置独立的域名,那么在一个页面中加载图片时,就可以突破浏览器连接数的限制,理论上,增加一个独立域名,并发连接数加倍。
(2)同一域名下,由于cookie未被缓存,导致图片即使在缓存中,也无法命中。
说明,这一问题也可以通过清除Web缓存服务器(如Varnish)中cookie来解决。
(3)域名不同可以方便CDN的解析与同步(如果使用CDN)。
5. 多台图片服务器之间如何同步?
(1)NFS共享方式
如果你不想在每台图片服务器同步所有图片,那NFS共享是最简单也最实用的方式。
NFS是个分布式的客户机/服务器文件系统,NFS的实质在于用户间计算机的共享,用户可以连接到共享计算机,然后象访问本地硬盘一样访问共享计算机上的文件。
具体实现思路是:Web服务器通过nfs挂载多台图片服务器export出来的目录,用户先将图片上传到Web服务器,然后将上传的图片通过程序拷贝到这个mount目录中去,这样那几台图片服务器就也能访问到刚上传的图片了。
这种方式好处是几乎没有延时(除了拷贝的时间),不好的地方是依赖NFS服务,NFS服务挂了,同步机制就失效了。
(2)使用FTP同步
上传完图片后使用FTP同步到各个图片服务器,php、java、asp.net都能操作FTP。
这种方式的缺点是将图片FTP到服务器比较耗时,如果用异步方式同步又会有延时。
(3)使用分布式存储软件
6. 高效的图片处理功能
这里的图片处理功能主要指的是文件上传功能、不同规格的缩略图生成功能、加水印功能等等。
网上应该有一些比较好的文件上传功能实现(支持多文件,支持断点续传)和缩略图生成功能实现。
可以压力测试一下,看看效率怎样。
这里有一个问题要权衡一下:是把所有的缩略图都生成静态图片保存,以后访问时速度会快些,但是占用磁盘空间;还是只保留原图,每次动态生成缩略图。
7. 图片的URL与所在图片服务器的关系
在上传图片时,要决定图片上传到哪个图片服务器上。
当然,我们可以根据图片的时间和分类放到不同服务器上。
但为了提高效率,有必要使用URL Hash一致性算法。这样,图片会平均的分配到各个图片服务器上。
一般来说,我们可以直接使用图片的名称来计算出这些信息。
8. 国内图片网站Yupoo的架构图
9. 淘宝图片服务的架构图
参考文献:
1. http://wenku.baidu.com/view/3594f573168884868762d69d.html
2. http://zimg.buaa.us/arch_design.html
3. http://blog.csdn.net/21aspnet/article/details/6584793
4. http://blog.csdn.net/lixinso/article/details/6639643
5. http://houxiyang.com/archives/113/
6. http://houxiyang.com/archives/23/
7. http://houxiyang.com/archives/107/
8. http://www.biaodianfu.com/facebook-efficient-storage-of-billions-of-photos.html
9. http://www.uml.org.cn/zjjs/201111285.asp
10. 《淘宝技术这十年》
没有评论:
发表评论