Flickr架构(一)
August 4th, 2008 | by 超群.com | 知识共享署名-非商业性使用-相同方式共享,转载请保留链接。本博客所有原创文章采用知识共享署名-非商业性使用-相同方式共享,转载请保留链接http://chaoqun.17348.com/2008/08/flickr_architecture_part_i/
Flickr(http://www.flickr.com/)是国外一个领先的图片分享网站,现在应该在yahoo门下,感觉yahoo还是有很多好东西,奈何资本要抛弃他了。这个轮回其实挺有意思的,起先是做实业被microsoft郁闷了,说软件是虚的值不能那么多钱,然后microsoft被yahoo郁闷了,说互联网是虚的不值那么多钱,然后是yahoo被google郁闷了,yahoo比较厚道没说什么,现在microsoft要收购yahoo了(折腾好久了,估计要落听了吧),不知道google将来要被谁郁闷了。成功建立在相同的失败上,反过来失败都是建立在相同的成功上也成立,进入正题吧。
原文地址是http://highscalability.com/flickr-architecture,本文不是原文的严谨翻译,带有我的理解以及补充,由于水平有限,文中的错误请各位斧正。
Flickr处理的数据:
- 多达40亿次的请求(http request or database query?不知道了,不管是哪个,都够大的吧。)
- squid总计约有3500万张图片(硬盘+内存)
- squid内存中约有200万张图片
- 总计有大约4亿7000万张图片,每张图片大概4~5MB
- 每秒3,8000次请求 (存储了1200万对象在里面)
- 2 PB 存储(星期天要消费~1.5TB)
- 每天新增图片超过 400,000
吓死人不偿命….
Flickr用到的技术:
- PHP
- MySQL
- Shards
- Memcached 作为中间缓存层,memcached在web2.0网站中可能是引用最广泛的产品之一,开源&强大.
- Squid 作反向代理服务器(reverse-proxy for html and images).
- Linux (RedHat),如果你想用RedHat企业版又不想付费,试试这个CentOS,基本上100%克隆RedHat企业版(估计传说中1%的RedHat代码没有),我用的就是这个。
- Smarty 作为模板解析,很多人在讨论smarty这不好那不好,但是大网站都在用,稳定而且功能强大,系统的瓶颈从来不会再smarty这里,我保证。
- Perl 估计用perl做一些系统层面的东西吧,比如日志处理(猜测)
- PEAR 做XML和Email解析,和我们一样,Flickr用的也是PHP4,不过新项目还是用PHP5吧
- ImageMagick 图像处理的不二选择
- Java, for the node service,Java就不太了解了,希望读者补充
- Apache 大家都在用,尝鲜的用户nginx或者lighttpd(适合静态文件,youtube用它做媒体文件服务器),出了问题你会抓狂的。
- SystemImager 作为服务器部署
- Ganglia 分布式系统监控,或者你可以试试nagios,据我所知也很多公司在用
- Subcon 用SVN维护服务器配置文件并且可以部署不同的配置文件到服务器集群中去(这个我没用过,系统运维的可能会喜欢)
- Cvsup 文件分发,是否类似rsync?
- Wackamole前端负载均衡,类似的产品有http://haproxy.1wt.eu/
Flickr架构
常见的Squid反向代理、PHP App Servers、Net App’s、Storage Manager我在这里就不讲,我们关注一些让人兴奋的特征:
- Mysql的Master-Master结构,mysql的常见的master-slave结构,大家都知道存在”single point of failure”(单点故障的问题),且只对读操作有好处,对于写频繁的网站却不是一个好的解决方案,Flickr的双master方案据我推测用的就是这个http://code.google.com/p/mysql-master-master/,原理就是master轮询,保证同时只有一个master负责写,解决了单点故障的问题。
- Dual Tree Structure,看看下面的图就知道什么是“双树结构”(姑且这么翻译)

示例图中上方的2台机器为master,下方的4台为slave,这种“双树结构”的设计保证一个slave只有一台master,易于扩展也不会形成环路。原文中说这种设计是1+1=200%的设计,简单高效。为了防止自增长冲突,数据表中无自增长列。
补充:对于大型应用的分表设计,防止自增长冲突是个问题,有个简单的方案:比如分3张表,可以设第一张表从1开始以3跳跃递增,那么第一张表存储的序列为1,4,7,10……,第二张表从2开始也以3跳跃递增,第二张表存储的序列为2,5,8,11……,第三张表从3开始以3跳跃递增,第三张表存储的序列为3,6,9,12……,保证不会有重复的序号,但这种方案的缺点是如果数据爆炸,3张表不够,你分4张表呢?需要手工迁移数据,如果程序写的不好,底层又要大动了。
Flickr采用的方案是一个中心’users’ table(用户表),记录的信息是用户主键以及此用户对以的数据库片区(有点类似Key->Value的设计,这样的数据结构查询起来是非常迅速的,据说Google的用户登录数据用的就是这样的设计,通过改进版的BDB数据库存储用户名和密码,这样登录起来就不用去查那个大表了),从中心用户表中查出用户数据所在位置,然后直接从目标位置中取出数据。 - 用专门的服务器存储静态内容,这个容易做到,比如专门的图片服务器。
- “Use a share nothing architecture”这个比较费解了,字面上的意思是使用一个无共享的架构,其实就是解除架构上的依赖,类似我们写程序解耦合一样。
- 除图片外,所有的数据都存在数据库中,这里他们提到了PHP session,我们知道php的session是存储在服务器文件系统的,而且默认没有做hash目录,这就意味着如果你的网站访问量大,比如有10万个人在线,你的session目录下就有10万个文件,如果你的文件格式是NTFS(windows)或者Ext3(Linux),你要定位到某个文件,系统基本上会假死,有个好的建议是不要在一个文件夹下放超过1000个文件。使用默认的php session还有另外一个问题:服务器session同步,用户在A服务器登录后,session存储在A服务器上,然后应用跳转到B服务器,B服务器上的session没有同步就出问题了,当然解决这个问题的方法很多,比如统一存储session,所有服务器的session都存储在一个vfs设备上,或者通过cookie重新生成一个session在B服务器上
写一篇这样的文章非常的辛苦,第一部分就先写到这里,待续……
6 Responses to “Flickr架构(一)”
By 赵章虎 on Aug 4, 2008 | Reply
博主用轻松而诙谐的文字把原本枯燥的东西表现得淋漓尽致。感谢博主。
By Anonymous on Aug 27, 2008 | Reply
share nothing architecture,并非“解除架构上的依赖”,而是指一个无状态的架构,节点之间的信息共享都用memcached之类分布Cache完成,这样可以最大程度的保证系统的伸缩性
By 花开 on Jun 20, 2010 | Reply
关于 Wackamole ,并非如楼主所言,与 Haproxy 相类似。
Wackamole : virtual IP management for clusters
详见:
http://www.backhand.org/wackamole/
http://www.howtoforge.com/setting-up-a-high-availability-load-balancer-with-haproxy-wackamole-spread-on-debian-etch