Flickr 网站架构分析

news/2024/5/20 4:02:46/文章来源:https://blog.csdn.net/weixin_30398227/article/details/97933539
1
2
3
4
5
6
7
8
9
10
11
。。。。。。。。。。。。。。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
。。。。。。。。。。。。。。。。。。。。
<Proxy balancer://mycluster>
BalancerMember "http://slave1:8008/App"   loadfactor=4
BalancerMember "http://slave2:8008/App"   loadfactor=3
BalancerMember "http://slave3:8008/App"   loadfactor=3
....................
///slave load ratio 4:3:3.
最终,Flickr采用了一种非常“轻量”但有效的“简易”PHP实现,基本的代码只有10几行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function db_connect($hosts, $user, $pass){
shuffle($hosts);     //shuffle()是PHP函数,作用是将数组中每个元素的顺序随机打乱。
foreach($hosts as $host){
debug("Trying to connect to $host...");
$dbh = @mysql_connect($host, $user, $pass, 1);
if ($dbh){
debug("Connected to $host!");
return $dbh;
}
debug("Failed to connect to $host!");
}
debug("Failed to connect to all hosts in list - giving up!");
return 0;
}
在上述代码中,如果需要对特定的Slave赋予更高的负载,只要在$hosts中多出现一次或多次就可以了。这段代码只要稍稍改进,就可以实现更复杂的功能,如当connect失败时自动将host从hosts列表中去除等。
“Master”-"Slave"模式的缺点是它并没有对于“写'操作提供扩展能力,而且存在单点故障,即一旦Master故障,整个网站将丧失“更新” 的能力。解决的办法采用“Master"-"Master"模式,即两台服务器互为”Master“-"Slave",这样不仅”读/写“能力扩展了一 倍,而且有效避免了”单点故障“,结合已有的“Master"-"Slave",整个数据库的架构就变成了下面的”双树“结构,
点看全图

“双树”架构并没有支撑太久的时间,大概6个月后,随着用户的激增,系统再一次达到了极限,不仅”写”操作成为了瓶颈,而且“异步复制"也由于 ”Slave“服务器过于繁忙而出现了严重的滞后而造成读数据的不一致。那么,能不能在现有架构加以解决,比如说增加新的”Master“服务器和考虑采 用”同步复制“呢?答案是否定的,在Master超过两台的设置中,只能采用”闭环链“的方式进行复制,在大数据量的生产环境中,很容易造成在任意时刻没 有一个Master或Slave节点是具有全部最新数据的(有点类似于”人一次也不能踏进同一条河“?),这样很难保障数据的一致性,而且一旦其中一个Master出现故障,将中断整个复制链;而对于”同步复制“,当然这是消除”复制滞后“的最好办法,不过在当时MySQL的同步复制还远没有成熟到可以运用在投产环境中。

Flickr网站的架构,需要一次大的变化来解决长期持续扩展的问题。

Shard - 大型网站数据库扩展的终极武器?

2005年7月,另一位大牛(MySQL 2005、2006年度 "Application of the Year Award"获得者)Dathan Pattishall加入了Flickr团队。一个星期之内,Dathan解决了Flickr数据库40%的问题,更重要的是,他为Flickr引进了 Shard架构,从而使Flickr网站具备了真正“线性”Scale-Out的增长能力,并一直沿用至今,取得了巨大的成功。
Shard主要是为了解决传统数据库Master/Slave模式下单一Master数据库的“写”瓶颈而出现的,简单的说Shard就是将一个大表分 割成多个小表,每个小表存储在不同机器的数据库上,从而将负载分散到多个机器并行处理而极大的提高整个系统的“写”扩展能力。相比传统方式,由于每个数据 库都相对较小,不仅读写操作更快,甚至可以将整个小数据库缓存到内存中,而且每个小数据库的备份,恢复也变得相对容易,同时由于分散了风险,单个小数据库 的故障不会影响其他的数据库,使整个系统的可靠性也得到了显著的提高。
对于大多数网站来说,以用户为单位进行Shard分割是最合适不过的,常见的分割方法有按地域(比如邮编),按Key值(比如Hash用户ID),这些 方法可以简单的通过应用配置文件或算法来实现,一般不需要另外的数据库,缺点是一旦业务增加,需要再次分割Shard时要修改现有的应用算法和重新计算所 有的Shard KEY值;而最为灵活的做法是以“目录”服务为基础的分割,即在Shard之前加一个中央数据库(Global Lookup Cluster),应用要先根据用户主键值查询中央数据库,获得用户数据所在的Shard,随后的操作再转向Shard所在数据库,例如下图:

点看全图

而应用的主要修改在于要添加一个Lookup访问层,例如将以下的代码:

1
2
3
string connectionString = @"Driver={MySQL};SERVER=dbserver;DATABASE=CustomerDB;";      
OdbcConnection conn = new OdbcConnection(connectionString);
conn.Open();
变为:
1
2
3
string connectionString = GetDatabaseFor(customerId);          
OdbcConnection conn = new OdbcConnection(connectionString);
conn.Open();
GetDatabaseFor()函数完成根据用户ID获取Shard connectionString的作用。
对应我们前面所提到过的Flickr架构
点看全图

Dual Tree Central Database就是中央数据库,存放用户表,记录的信息是用户主键以及此用户对以的数据库Shard区;而Master-Master Shards就是一个个的Shard用户数据库,存储实际的用户数据和照片的元数据(Meta Data)。

Flickr Shard的设计我们在Flickr 网站架构研究(1)中已经总结过了,在此不再赘述。我们在此谈一下Shard架构的主要问题和Flickr的解决办法:1)Shard只适用于不需要 join操作的表,因为跨Shard join操作的开销太大,解决的办法是将一个用户的所有数据全部存放在同一个Shard里,对于一些传统方式下需要 跨Shard查询的数据,只能采取冗余的方法,比如Shard1的用户A对Shard2的用户B的照片进行了评论,那么这条评论将同时存放在Shard1 和Shard2中。这样就存在一个数据一致性的问题,常规的做法是用数据库事务(Transaction)、”两阶段提交“(2 phase commit)来解决,但做过两阶段提交(2PC)应用的都知道,2PC的效率相对较差,而且实际上也不能100%保证数据的完整性和一致性;另外,一旦 由于其中一个Shard故障而提交失败回滚,用户只能放弃或再试一遍,用户体验较差。Flickr对于数据一致性的解决方案是Queue(Flickr用 PHP开发了一个强大的Queue系统,将所有可以异步的任务都用Queue来实现,每天处理高达1千万以上的任务。),事实上当用户A对用户B的照片进 行评论时,他并不关心这条评论什么时候出现在用户B的界面上,即将这条评论添加到用户B的交易是可以异步的,允许一定的迟延,通过Queue处理,既保证 了数据的一致性,又缩短了用户端的相应时间,提高了系统性能。2)Shard的另一个主要问题Rebalancing,既当现有Shard的负载达到一定 的阀值,如何将现有数据再次分割,Flickr目前的方式依然是手工的,既人工来确定哪些用户需要迁移,然后运行一个后台程序进行数据迁移,迁移的过程用 户账户将被锁住。(据说Google做到了完全自动的Rebalancing,本着”萨大“坑里不再挖坑的原则,如果有机会的话,留到下一个系列再研究 吧)

Memcached的应用和争论

大家应该已经注意到,Flickr为中央数据库配置了Memcached作为数据库缓存,接下来的问题是,为什么用Memcached?为什么 Shard不需要Memcached?Memcached和Master,Slave的关系怎样?笔者将试图回答这些问题供大家参考,网上的相关争论很 多,有些问题尚未有定论。
Memecached是一个高性能的,分布式的,开源的内存对象缓存系统,顾名思义,它的主要目的是将经常读取的对象放入内存以提高整个系统,尤其是数 据库的扩展能力。Memcached的主要结构是两个Hash Table,Server端的HashTable以key-value pair的方式存放对象值,而Client端的HashTable的则决定某一对象存放在哪一个Memcached Server.举个例子说,后台有3个Memecached Server,A、B、C,Client1需要将一个对象名为”userid123456“,值为“鲁丁"的存入,经过Client1的Hash计 算,"userid123456"的值应该放入Memcached ServerB, 而这之后,Client2需要读取"userid123456"的值,经过同样的Hash计算,得出"userid123456"的值如果存在的话应该在 Memcached ServerB,并从中取出。最妙的是Server之间彼此是完全独立的,完全不知道对方的存在,没有一个类似与Master或Admin Server的存在,增加和减少Server只需在Client端"注册"并重新Hash就可以了。
Memcached作为数据库缓存的作用主要在于减轻甚至消除高负载数据库情况下频繁读取所带来的Disk I/O瓶颈,相对于数据库自身的缓存来说,具有以下优点:1)Memecached的缓存是分布式的,而数据库的缓存只限于本机;2)Memcached 缓存的是对象,可以是经过复杂运算和查询的最终结果,并且不限于数据,可以是任何小于1MB的对象,比如html文件等;而数据库缓存是以"row"为单 位的,一旦"row"中的任何数据更新,整个“row"将进行可能是对应用来说不必要的更新;3)Memcached的存取是轻量的,而数据库的则相对较 重,在低负载的情况下,一对一的比较,Memcached的性能未必能超过数据库,而在高负载的情况下则优势明显。
Memcached并不适用于更新频繁的数据,因为频繁更新的数据导致大量的Memcached更新和较低的缓冲命中率,这可能也是为什么Shard没 有集成它的原因;Memcached更多的是扩展了数据库的”读“操作,这一点上它和Slave的作用有重叠,以至于有人争论说应该 让"Relication"回到它最初的目的”Online Backup"数据库上,而通过Memcached来提供数据库的“读”扩展。(当然也有人说,考虑到Memcached的对应用带来的复杂性,还是慎 用。)
然而,在体系架构中增加Memecached并不是没有代价的,现有的应用要做适当的修改来同步Memcached和数据库中的数据,同时Memcached不提供任何冗余和“failover”功能,这些复杂的控制都需要应用来实现。基本的应用逻辑如下:

对于读操作:

1
2
3
4
5
$data = memcached_fetch( $id );
return $data if $data
$data = db_fetch( $id );
memcached_store( $id, $data );
return $data;
对于写操作:
1
2
db_store( $id, $data );
memcached_store( $id, $data );
我们看到在每一次数据更新都需要更新Memcached,而且数据库或Memcached任何一点写错误应用就可能取得“过期”的数据而得到错误的结果,如何保证数据库和Memcached的同步呢?

复制滞后和同步问题的解决

我们知道复制滞后的主要原因是数据库负载过大而造成异步复制的延迟,Shard架构有效的分散了系统负载,从而大大减轻了这一现象,但是并不能从根本上消除,解决这一问题还是要靠良好的应用设计。
当用户访问并更新Shard数据时,Flickr采用了将用户“粘”到某一机器的做法,
$id = intval(substr($user_id, -10));
$id % $count_of_hosts_in_shard
即同一用户每次登录的所有操作其实都是在Shard中的一个Master上运行的,这样即使复制到Slave,也就是另一台Master的时候有延时,也不会对用户有影响,除非是用户刚刚更新,尚未复制而这台Master就出现故障了,不过这种几率应该很小吧。
对于Central Database的复制滞后和同步问题,Flickr采用了一种复杂的“Write Through Cache"的机制来处理:

点看全图

"Write Through Cache"就是将所有的数据库”写“操作都先写入”Cache",然后由Cache统一去更新数据库的各个Node,“Write Through Cache"维护每一个Node的更新状态,当有读请求时,即将请求转向状态为”已同步“的Node,这样即避免了复制滞后和Memcached的同步问 题,但缺点是其实现极为复杂,“Write Throug Cache"层的代码需要考虑和实现所有”journal","Transaction“,“failover”,和“recovery"这些数据库已经 实现的功能,另外还要考虑自身的"failover"问题。我没有找到有关具体实现的说明,只能猜测这一部分的处理可能也是直接利用或是实现了类似于 Flickr的Queue系统吧。


转载于:https://www.cnblogs.com/Wolves/archive/2011/03/12/1982358.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_715523.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux快速构建LAMP网站平台

1.1 问题本例要求基于Linux主机快速构建LAMP动态网站平台&#xff0c;并确保可以支撑PHP应用及数据库&#xff0c;完成下列任务&#xff1a; 1&#xff09;安装LAMP平台各组件&#xff0c;启动LAMP平台 软件包&#xff1a;httpd、mariadb-server、mariadb、php、php-mysql系统服…

php主页备案号底部中间,如何获取公安备案号?如何将公安备案号放到网站底部?...

一、网站公安备案显示&#xff1a;网站通过了公安局备案后需要将“网站公安机关备案编号及图标”放到网站底部&#xff0c;本教程将详细指导如何操作。效果图&#xff1a;二、获取公安备案号及链接通过了公安备案后&#xff0c;获取备案编号及链接的方法&#xff1a;登录公安机…

配置Apache虚拟主机,实现在一台服务器上运行多个网站

Apache虚拟主机实现有三种方法&#xff1a;1、通过不同的IP地址2、通过不同的域名3、通过不同的端口号1、通过不同的IP地址&#xff0c;解析不同的域名&#xff08;1&#xff09;给服务器增加IP&#xff08;另一个域名解析&#xff09;[roothttp ~]# ifconfig eth0:1 192.168.2…

如何下载一些网站本身不希望你下载的文件呢

如一些学习视频之类&#xff0c;如何下载呢&#xff0c;本文主要针对一些非程序员朋友&#xff0c;对于程序员朋友其实稍微模式点的就是下面提到的右击&#xff0c;复制下载地址 其实很简单&#xff0c;打开对应的网站&#xff0c;按F12&#xff0c;浏览器下方就会弹出一个好玩…

不可忽视的力量,插件主题网站

在当前Web2.0时代&#xff0c;Blog&#xff0c;RSS&#xff0c;Wiki等服务充斥着整个互联网。近日&#xff0c;用户个性化定制搜索巨头Google宣布&#xff0c;将向Web 开发人员开放Gadget框架&#xff0c;使其能够在自己的网页上增添Universal Gadget。 这意味这用户可以根据自…

麻烦大家反馈一下昨天的网站访问速度

昨天是我们使用阿里云RDS之后&#xff0c;经历访问高峰期的第一天&#xff0c;麻烦大家反馈一下昨天访问园子的速度&#xff08;尤其是博客站点&#xff09;。 从我们观察的情况看&#xff0c;RDS表现不错。但在16:01与16:46两个时间点出现了RDS数据库连接数突增的情况&#xf…

如何让你的网站用discuz插件变的有力量

2019独角兽企业重金招聘Python工程师标准>>> 有段时间&#xff0c;我们的网站访问量经历了以下三个阶段&#xff1a; 上线第一个月&#xff1a;迅速增长 2-4个月&#xff1a;保持平稳 5-6个月&#xff1a;访问量降低&#xff0c;日活跃度降低 之后我们做了几个动作&…

Google Analytics(分析)-的Blog/网站流量分析器

如果你想要知道你Blog的访问者是如何找到你以及他们是如何与你的Blog/网站互动的&#xff0c;Google Analytics(分析)可以告诉你所有相关信息。由此&#xff0c;你可以将自己的营销资源集中于能够带来投资回报的广告系列和活动上&#xff0c;并且改进自己的Blog/网站以促进更多…

文字选中_防止网站文章被采集:禁止F12,禁止Ctrl+s,禁止ctrl+u,禁止选中文字,禁止鼠标右键...

作为一名SEOer&#xff0c;相信大家都应该听说过“文章采集”&#xff0c;自己原创手写的文章半小时内被别人原模原样采集走了&#xff0c;最可气的是自己发布的文章没有排名&#xff0c;甚至是还没有被百度搜索引擎收录&#xff0c;而那个采集我们文章的人却已经拥有了一个很不…

LAMP网站架构分析

转自&#xff1a;http://www.williamlong.info/archives/1908.html LAMP&#xff08;Linux-Apache-MySQL-PHP&#xff09;网站架构是目前国际流行的Web框架&#xff0c;该框架包括&#xff1a;Linux操作系统&#xff0c;Apache网 络服务器&#xff0c;MySQL数据库&#xff0c;P…

推荐awstats网站分析器,很强大

AWStats简单介绍 AWStats是在Sourcefroge上发展很快的一个基于perl的web日志分析工具。与其他工具相比&#xff0c;其优势在于 1. 界面友好&#xff0c;可以根据浏览器直接调用相应的语言界面&#xff08;支持中文&#xff09;&#xff1b; 2.基于perl&#xff0c;并且很好的…

如何在电脑上测试手机网站(补充)和phonegap

颜海镜 介绍了专业人士精准测试手机网站的经验 http://www.cnblogs.com/yanhaijing/p/3557261.html, 因为太专业了&#xff0c;稍显复杂和琐碎&#xff0c;这里我介绍下我一直关注的的 inter XDK 去年的 xdk 是浏览器插件&#xff0c;今年用nodejs重写了&#xff0c;可见前端会…

配置网站所需要的服务器环境,服务器什么环境配置放的网站多

服务器什么环境配置放的网站多 内容精选换一换Atlas 500 Pro 智能边缘服务器(型号 3000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 500 Pro 智能边缘服务器 用户指南(型号 3000)》&#xff0c;安装操作系统完成后&#xff0c;配置业务网口IP地址&#xf…

千万级PV规模高性能高并发网站架构

防伪码&#xff1a;好久不见&#xff0c;你会不会突然的出现。客户端&#xff1a;缓存&#xff08;expires&#xff09;、deflate压缩缓存服务器&#xff1a;CDN/cache缓存静态内容如&#xff1a;html、jpg、gif、js等静态web服务器&#xff1a;Apache/nginx静态服务器提供html…

大型网站技术架构(六)网站的伸缩性架构

2019独角兽企业重金招聘Python工程师标准>>> 网站系统的伸缩性架构最重要的技术手段就是使用服务器集群功能&#xff0c;通过不断地向集群中添加服务器来增强整个集群的处理能力。“伸”即网站的规模和服务器的规模总是在不断扩大。 1、网站架构的伸缩性设计 网站的…

没有网站,靠什么来吸引近9亿的互联网用户

2019独角兽企业重金招聘Python工程师标准>>> 2018年水果连锁企业百果园&#xff0c;其线上销售额突破20亿元、日订单量达6万单,光小程序用户数累计达到了1300万。 数据显示&#xff0c;以互联网起家的瑞幸咖啡在2018年的互联网市场占有率在30%左右&#xff0c;而作为…

制作网站以及发布的流程

本来我也没有自己做网站的打算的&#xff0c;但是前段时间无意中浏览CSDN的时候看到一个在校的学生为他的女朋友做了一个网站&#xff0c;受此启发&#xff0c;也想做一个送给一直暗恋着的她。于是自己也做了一个网站&#xff0c;前后花费了大约三天的时间。 好了&#xff0c;…

世界最大的两个BT网站被迫下线 ExtraTorrent遭遇DDoS攻击

海盗湾和ExtraTorrent遭遇DDoS网络攻击&#xff0c;被迫下线&#xff0c;这2个网站已经无法访问。根据TorrentFreak报道&#xff0c;ExtraTorrent这次被攻击与其新上线的代理保护措施有关&#xff0c;而海盗湾网站为什么无法访问&#xff0c;目前还不清楚。 ExtraTorrent为什么…

《社交网站界面设计(原书第2版)》——3.16 欢迎界面

3.16 欢迎界面 是什么 用户注册一个新的网络服务后&#xff0c;需要弄清楚可以在网站上干什么以及如何开始&#xff08;见图3-29&#xff09;。 何时使用新用户第一次访问你的网站。你想让用户熟悉重要或者有用的功能。如何使用 热烈而又亲切地欢迎新用户的到来。可以在用户注…