- 浏览: 1560087 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
nich002:
原网站失效了。撸主简单粗暴的复制过来,可读性极差!差评!
Apache配置详解(最好的APACHE配置教程) -
107x:
不错,谢谢!
LINUX下查看文件夹下的文件个数! -
Hypereo:
好你妹,连个格式都没有!
Apache配置详解(最好的APACHE配置教程) -
resteater:
代码排版感觉有点乱!收发信息代码可读性不强!请问第一次发服务器 ...
java socket例子 -
resteater:
代码排版感觉有点乱!收发信息代码可读性不强!请问第一次发服务器 ...
java socket例子
From: http://www.cyask.com/question.php?qid=432
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/
常见的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数据库存储用户名和密码,这样登录起来就不用去查那个大表了),从中心用户表 中查出用户数据所在位置,然后直接从目标位置中取出数据。
- 不要预先去为性能扩展,出现问题之后找到问题再寻扩展;
- 不要想寻找到一个一劳永逸的方案,因为你不知道下一个瓶颈在哪里;
- 访问量大了,出了问题,修改架构,稳定运行,访问量再大了,又出问题了,再修改,这个是解决问题的唯一方案。
- “Statelessness”设计,原文用的是这个词,字面上的意思是“无国家的”,看了一些相关文档,我觉得Statelessness的含 义是“无界限的”设计,一个简单的例子,现在很多架构设计用到分表,比如用户信息表,怎么分呢?直接hash分表,两张表就按奇偶分,n张表就按n的模进 行分,这种设计就是Statelessness的反向,你把你的用户绑定在一张固定的表或者固定的机器上了,如果你的用户里面有付费用户,你希望把他们的 数据单独存储或者用专门的机器处理,你怎么办?你设计的太死了,你的付费用户只能和免费用户绑定在一起,提供一样的服务器支持,当然,你可以骗用户说他们 的服务是有差别的。
- 通过master-save的设计能解决一部分问题,但很快你就会发现不行了,常见的master-slave只能解决读的问题,但存在单点失败故障,而且当负载比较重的时候会存在复制延迟的问题,很多公司都会碰到。
- 搜索功能由专门的服务器群来支持,通过复制需要搜索的内容到搜索服务器去搜索,和App servers分开。
集群
1、分表:按照一定主键拆分数据表,比如按照用户划分;
2、一个用户的所有信息在同一组服务器上
3、数据能够在不同的服务器组上迁移(Statelessness)
4、一组中心服务器负责查询,比如定位某个用户在哪个服务器组
5、不要以用户ID作为分组的依据(Non-Statelessness)
Todd Hoff总结的经验:
- 不要把你的应用简单的看成一个Web应用,可能会有REST APIs, SOAP APIs, RSS feeds, Atom feeds等等的应用
- “无界限”设计,不要把你的用户死死的绑定在某个服务器上
- 产品设计时需要做扩容的计划以及预算
- 慢慢来,不要一开始就买一堆服务器
- 实地考察,不要臆想,获得实际数据之后再做决定
- 内建日志系统,记录服务器和应用日志
- Cache,缓存是必不可少的
- 抽象层,由于你的架构随时可能变,架构的变化必定要带来底层的变化,这就需要你在底层的基础上根据业务封装一层中间层,这样底层的改动不至于影响业务(这个太重要了,不要因为扩展把原来的程序推倒重来)
- 迭代开发,随时改进
- 忘记那些调优的小技巧吧,比如很多人对与PHP里面的require和require_once的性能差别,这些性能的差异和架构上的短板比起来根本不足为道
- 在线上测试你的效果
- 忘记用工具测试出来的结果,这些结果只能给你一个大概的印象而已
- 找出你的系统短板,一台服务器的最大处理能力是多少?现在离最大负载还有多远?mysql的瓶颈在哪里?是不是磁盘IO?memcache的瓶颈在哪里?CPU还是网络传输?
- 注意你的用户使用规律,比如Flickr发现每年的第一个工作日比平时多20%~40%的上传量,周日的访问量比平时要多40%~50%
- 要注意指数型的增长
- 你的计划是为你访问的峰值设计的
Flickr如何存储图片的呢?
标准的Flickr图片Url是这样的http://farm1.static.flickr.com /104/301293250_dc284905d0_m.jpg,其中farm1是Flickr的服务器群,static.flickr.com是 Flickr静态图片服务器,104是服务器ID,301293250是图片ID,dc284905d0是Flickr的加密串,防止盗链,m表示图片的 尺寸。m表示中等尺寸
后记:
终于“翻译”(姑且用这个词)完了,看到原文的一个评论是”Hmm… i can not beleive flickr written on php…”,借用好像也是Flickr的人说的一句话:扩展的不是语言,而是架构。国内很多大的企业都在用PHP(比如我所在的sina),PHP总给人 是草根语言的感觉,是因为没有人肯分享自己的架构,以及程序员写程序的时候不注意自己的结构(设计模式),好的架构只能让你的程序跑的更快,好的结构让你 的程序更易于维护,更容易让别人看的懂,更容易团队合作。
发表评论
-
JVM问题追查与调优
2012-03-27 14:44 1116JDK的几种分析工具 http://liudaoru ... -
NodeJs相关资料
2011-08-18 14:55 2946NodeJs获取参数: proces ... -
jprofiler追踪问题
2011-08-12 18:20 1016Jprofiler下载页: http://www.ej ... -
Linux服务器性能评估与优化【z】
2011-07-01 10:05 1515来自:http://www.itlearner.com/ ... -
Java 理论与实践: 非阻塞算法简介【z】
2011-03-26 20:39 1248From: http://www.ibm.com/develo ... -
Java Crash问题分析[z]
2011-03-23 14:41 5938参考: http://www.ibm.com/develop ... -
Berkeley DB相关
2010-09-25 22:17 1024为什么要使用Berkeley DB,它适合什么场合应用?Ber ... -
熟悉系统方法总结
2010-07-06 14:26 789了解一个陌生的系统是我们经常碰到的事情,下面总结一下自己的一些 ... -
Java缓存框架 EhCache
2010-07-06 14:09 4694From: http://www.oschina.net/p/ ... -
【nio】使用 ServerSocketChannel 实现的 File 服务器[z]
2010-05-21 17:31 3925From: http://www.java2000.net/p ... -
Memcached命令行管理
2010-03-15 11:18 4456From: http://www.exp2up.com/2 ... -
(转)Resin服务器配置指南
2010-01-21 15:35 3416From:http://blog.21cn.com/super ... -
JDK的几种分析工具
2009-12-04 12:13 10876From: http://blog.csdn.net/hant ... -
XMemcached——一个新的开源Java memcached客户端
2009-10-23 09:27 1866From: http://www.infoq.com/cn/ ... -
多线程任务调度学习
2009-10-16 13:58 2271昨天找到一套多线程任务调度的代码,相当的不错,先把思路总结一下 ... -
用HSCALE实现MySQL的数据分布式存储
2009-10-15 12:47 2982From:http://www.ningoo.net/ht ... -
马化腾:搜索、电子商务硬仗一定要坚持打
2009-10-15 12:09 1691From:http://www.techweb.com.c ... -
MySQL分表实现上百万上千万记录分布存储的批量查询设计模式【z】
2009-10-15 09:56 3142From:http://hi.baidu.com/jabber ... -
nginx负载均衡和lvs负载均衡的比较分析【z】
2009-10-13 20:02 1432From:http://www.shouker.com/u ... -
新型的大型bbs架构(squid+nginx)【z】
2009-10-13 19:53 1586From:http://www.fovweb.com/opti ...
相关推荐
图文并茂的说明了flickr系统的架构
亿万用户网站MySpace的成功秘密、Flickr架构、YouTube网站架构、PlentyOfFish 网站架构学习、WikiPedia技术架构学习笔记。这几个都很典型,我们可以从中获取很多有关网站架构方面的知识,看了之后你会发现你原来的...
5 Flickr架构经验 5 Twitter运维经验 5 运维经验 5 Metrics 5 配置管理 5 Darkmode 5 进程管理 5 硬件 5 代码协同经验 5 Review制度 5 部署管理 5 团队沟通 5 Cache 5 云计算架构 5 反模式 5 单点失败(Single Point...
大型网站架构flickr网站体系
之前我简单向大家介绍了各个知名大型网站的架构,亿万用户网站MySpace的成功秘密、Flickr架构、YouTube网站架构、PlentyOfFish网站架构学习、WikiPedia技术架构学习笔记。这几个都很典型,我们可以从中获取很多有关...
基于Python的关于Flickr图片网站的爬虫.pdf
基于python的Flickr地理标签照片信息的爬虫.pdf
Flickr Architecture 309 Information Sources 309 Platform 310 The Stats 310 The Architecture 311 Lessons Learned 316 Comments 318 How to store images? 318 RE: How to store images? 318 ...
之前向大家介绍过全球最大在线图片服务网站Flickr网站架构,Yupoo(又拍网)作为国内最大的图片服务提供商,我们也一起来看看它的架构,同样是提供图片服务,看看他与Flickr的差别在哪里,大家看完本文可以思考一下...
在互联网上,那些掌握了大量用户活动信息、用户关系网或语料库的网站,比如digg,friendfeed,flickr或大型电子商务网站等,都有实验性的可视化项目。可惜在中国在这方面的商用或实验项目还是比较空白的。 数据可视...
很多时候,即使没有使用框架,一样能 写出好的程序来,比如Flickr据说就是用Pear+Smarty这样的类库写出来的,所以,是否 用框架,用什么框架,一般不是最重要的,重要的是我们 的编程思想里要有框架的意识。...
● A pretty picture of Flickr's architecture can be found on this slide . A simple depiction is: -- Pair of ServerIron's ---- Squid Caches ------ Net App's ---- PHP App Servers ------ Storage ...
清洁Flickr公共提要用例简短的实验,这是一个Android应用,可显示来自的最新照片。 单击您要添加基于标签的更多相似性的图像。架构我决定编写足够的代码来显示一个简单但干净且可测试的体系结构。 我是罗伯特·C·...
flickrassignment版本1.0 使用Xcode 12.4进行编译支持iOS 13及更高版本使用Swift 没有使用第三方库支持纵向和横向使用MVVM架构编写了一些单元测试和UI测试避免过度工程功能•用户可以通过在搜索栏中写入带有特定搜索...
案例: Friendster Myspace Facebook Flickr LiveJournal 猫扑大杂烩 校内网
由Kotlin开发的具有Clean架构的MVVM模式。 干净的体系结构包括三层: 数据,包括数据对象,数据库,网络客户端,存储库。 域,包括业务逻辑的用例。 该层协调从“数据层”到“表示”的数据流,以及另一种方式。 ...
作者通过自身实践给你提供所需要的相关知识和工具,来帮助你预知一些有威胁性的瓶颈问题和突然的网络增长,从而测量、部署并提前设计好网站应用的基本架构。 本书由John Allspaw(Filickr的工程运营经理)撰写,结合了...
二、 Flickr的幕后故事 三、 YouTube 的架构扩展 四、 mixi.jp:使用开源软件搭建的可扩展SNS网站 五、 Technorati的后台数据库架构 六、 通过了解MySpace的六次重构经历,来认识分布式系统到底该如何创建 七、 ...