??xml version="1.0" encoding="utf-8" standalone="yes"?> 架构演变W一步:物理分离webserver和数据库 最开始,׃某些xQ于是在互联|上搭徏了一个网站,q个时候甚x可能L都是U借的Q但׃q篇文章我们只关注架构的演变历程Q因此就假设q个时候已l是托管了一C机,q且有一定的带宽了,q个时候由于网站具备了一定的特色Q吸引了部分问,逐渐你发现系l的压力来高Q响应速度来慢Q而这个时候比较明昄是数据库和应用互相媄响,应用出问题了Q数据库也很Ҏ出现问题Q而数据库出问题的时候,应用也容易出问题Q于是进入了W一步演变阶D:应用和数据库从物理上分,变成了两台机器,q个时候技术上没有什么新的要求,但你发现实起到效果了,pȝ又恢复到以前的响应速度了,q且支撑住了更高的流量,q且不会因ؓ数据库和应用形成互相的媄响?/span> q一步涉及到了这些知识体p: 架构演变W二步:增加面~存 好景不长Q随着讉K的h来多Q你发现响应速度又开始变慢了Q查扑֎因,发现是访问数据库的操作太多,D数据q接竞争Ȁ烈,所以响应变慢,但数据库q接又不能开太多Q否则数据库机器压力会很高,因此考虑采用~存机制来减数据库q接资源的竞争和Ҏ据库ȝ压力Q这个时候首先也怼选择采用squid {类似的机制来将pȝ中相寚w态的面Q例如一两天才会有更新的面Q进行缓存(当然Q也可以采用页面静态化的方案)Q这L序上可以不做修改Q就能够很好的减对webserver的压力以及减数据库q接资源的竞争,OKQ于是开始采用squid来做相对静态的面的缓存?/span> 看看q一步完成后pȝ的图C: q一步涉及到了这些知识体p: 前端面~存技术,例如squidQ如想用好的话还得深入掌握下squid的实现方式以及缓存的失效法{?br />
架构演变W三步:增加面片段~存 增加了squid做缓存后Q整体系l的速度实是提升了Qwebserver的压力也开始下降了Q但随着讉K量的增加Q发现系l又开始变的有些慢了,在尝Csquid之类的动态缓存带来的好处后,开始想能不能让现在那些动态页面里相对静态的部分也缓存v来呢Q因此考虑采用cMESI之类的页面片D늼存策略,OKQ于是开始采用ESI来做动态页面中相对静态的片段部分的缓存?/span> 看看q一步完成后pȝ的图C: q一步涉及到了这些知识体p: 面片段~存技术,例如ESI{,想用好的话同样需要掌握ESI的实现方式等Q?/span> 架构演变W四步:数据~存 在采用ESI之类的技术再ơ提高了pȝ的缓存效果后Q系l的压力实q一步降低了Q但同样Q随着讉K量的增加Q系l还是开始变慢,l过查找Q可能会发现pȝ中存在一些重复获取数据信息的地方Q像获取用户信息{,q个时候开始考虑是不是可以将q些数据信息也缓存v来呢Q于是将q些数据~存到本地内存,改变完毕后,完全W合预期Q系l的响应速度又恢复了Q数据库的压力也再度降低了不?/span> 看看q一步完成后pȝ的图C: ~存技术,包括像Map数据l构、缓存算法、所选用的框架本w的实现机制{?/span> 架构演变W五步: 增加webserver 好景不长Q发现随着pȝ讉K量的再度增加Qwebserver机器的压力在高峰期会上升到比较高Q这个时候开始考虑增加一台webserverQ这也是Z同时解决可用性的问题Q避免单台的webserver down机的话就没法使用了,在做了这些考虑后,军_增加一台webserverQ增加一台webserverӞ会碰C些问题,典型的有Q?br />
1、如何让讉K分配到这两台机器上,q个时候通常会考虑的方案是Apache自带的负载均衡方案,或LVSq类的Y件负载均衡方案; 看看q一步完成后pȝ的图C: q一步涉及到了这些知识体p: 负蝲均衡技术(包括但不限于g负蝲均衡、Y件负载均衡、负载算法、linux转发协议、所选用的技术的实现l节{)、主备技术(包括但不限于ARPƺ骗、linux heart-beat{)、状态信息或~存同步技术(包括但不限于Cookie技术、UDP协议、状态信息广播、所选用的缓存同步技术的实现l节{)、共享文件技术(包括但不限于NFS{)、存储技术(包括但不限于存储讑֤{)?/span> 架构演变W六步:分库 享受了一D|间的pȝ讉K量高速增长的q福后,发现pȝ又开始变慢了Q这ơ又是什么状况呢Q经q查找,发现数据库写入、更新的q些操作的部分数据库q接的资源竞争非常激烈,D了系l变慢,q下怎么办呢Q此时可选的Ҏ有数据库集群和分库策略,集群斚w像有些数据库支持的ƈ不是很好Q因此分库会成ؓ比较普遍的策略,分库也就意味着要对原有E序q行修改Q一通修改实现分库后Q不错,目标辑ֈ了,pȝ恢复甚至速度比以前还快了?/span> 看看q一步完成后pȝ的图C: q一步更多的是需要从业务上做合理的划分,以实现分库,具体技术细节上没有其他的要求; 但同旉着数据量的增大和分库的q行Q在数据库的设计、调优以及维护上需要做的更好,因此对这些方面的技术还是提Z很高的要求的?/span> 架构演变W七步:分表、DAL和分布式~存 看看q一步完成后pȝ的图C: 分表更多的同h业务上的划分Q技术上涉及到的会有动态hash法、consistent hash法{; DAL涉及到比较多的复杂技术,例如数据库连接的理Q超时、异常)、数据库操作的控Ӟ时、异常)、分库分表规则的装{; 架构演变W八步:增加更多的webserver 在做完分库分表这些工作后Q数据库上的压力已经降到比较低了Q又开始过着每天看着讉K量暴增的q福生活了,H然有一天,发现pȝ的访问又开始有变慢的趋势了Q这个时候首先查看数据库Q压力一切正常,之后查看webserverQ发现apached了很多的hQ而应用服务器Ҏ个请求也是比较快的,看来是请求数太高D需要排队等待,响应速度变慢Q这q好办,一般来_q个时候也会有些钱了,于是d一些webserver服务器,在这个添?webserver服务器的q程Q有可能会出现几U挑战: 看看q一步完成后pȝ的图C: Cq一步,随着机器数的不断增长、数据量的不断增长和对系l可用性的要求来高Q这个时候要求对所采用的技术都要有更ؓ深入的理解,q要根据网站的需求来做更加定制性质的品?/span> 架构演变W九步:数据d分离和廉价存储方?/span> H然有一天,发现q个完美的时代也要结束了Q数据库的噩梦又一ơ出现在眼前了,׃d的webserver太多了,D数据库连接的资源q是不够用,而这个时候又已经分库分表了,开始分析数据库的压力状况,可能会发现数据库的读写比很高Q这个时候通常会想到数据读写分ȝҎQ当Ӟq个Ҏ要实现ƈ不容易,另外Q可能会发现一些数据存储在数据库上有些费Q或者说q于占用数据库资源,因此在这个阶D可能会形成的架构演变是实现数据d分离Q同时编写一些更为廉L存储ҎQ例如BigTableq种?/span> 看看q一步完成后pȝ的图C: 数据d分离要求Ҏ据库的复制、standby{策略有深入的掌握和理解Q同时会要求具备自行实现的技术; 廉h存储Ҏ要求对OS的文件存储有深入的掌握和理解Q同时要求对采用的语a在文件这块的实现有深入的掌握?/span> 架构演变W十步:q入大型分布式应用时代和廉h服务器群梦想时代 l过上面q个漫长而痛苦的q程Q终于是再度q来了完的时代Q不断的增加webserver可以支撑越来越高的讉K量了Q对于大型网站而言Qh气的重要?庸置疑,随着人气的越来越高,各种各样的功能需求也开始爆发性的增长Q这个时候突然发玎ͼ原来部v在webserver上的那个web应用已经非常庞大 了,当多个团队都开始对其进行改动时Q可真是相当的不方便Q复用性也相当p糕Q基本是每个团队都做了或多或重复的事情Q而且部v和维护也是相当的ȝQ因为庞大的应用包在N台机器上复制、启动都需要耗费不少的时_出问题的时候也不是很好查,另外一个更p糕的状冉|很有可能会出现某个应用上的bug导 致了全站都不可用Q还有其他的像调优不好操作(因ؓ机器上部|的应用什么都要做Q根本就无法q行针对性的调优Q等因素Q根据这L分析Q开始痛下决心,系l根据职责进行拆分,于是一个大型的分布式应用就诞生了,通常Q这个步骤需要耗费相当长的旉Q因Z到很多的挑战: 看看q一步完成后pȝ的图C: q一步涉及的知识体系非常的多Q要求对通信、远E调用、消息机制等有深入的理解和掌握,要求的都是从理论、硬件、操作系l以及所采用的语a的实现都有清楚的理解?/span> q维q块涉及的知识体pM非常的多Q多数情况下需要掌握分布式q行计算、报表、监控技术以及规则策略等{?/span>
之前也有一些介l大型网站架构演变的文章Q例如LiveJournal的、ebay的,都是非常值得参考的Q不q感觉他们讲的更多的是每ơ演变的l果Q而没有很详细的讲Z么需要做q样的演变,再加上近来感觉有不少同学都很难明白ؓ什么一个网站需要那么复杂的技术,于是有了写这文章的xQ在q篇文章中将阐述一个普通的|站发展成大型网站过E中的一U较为典型的架构演变历程和所需掌握的知识体p,希望能给想从事互联网行业的同学一点初步的概念Q?)Q文中的不对之处也请各位多给点徏议,让本文真正v到抛砖引玉的效果?br />
q一步涉及到了这些知识体p:
2、如何保持状态信息的同步Q例如用户session{,q个时候会考虑的方案有写入数据库、写入存储、cookie或同步session信息{机制等Q?br />
3、如何保持数据缓存信息的同步Q例如之前缓存的用户数据{,q个时候通常会考虑的机制有~存同步或分布式~存Q?br />
4、如何让上传文gq些cM的功能l正常,q个时候通常会考虑的机制是使用׃n文gpȝ或存储等Q?br />
在解决了q些问题后,l于是把webserver增加Z两台Q系l终于是又恢复到了以往的速度?/span>
q一步涉及到了这些知识体p:
随着pȝ的不断运行,数据量开始大q度增长Q这个时候发现分库后查询仍然会有些慢Q于是按照分库的思想开始做分表的工作,当然Q这不可避免的会需要对E序q行一些修改,也许在这个时候就会发现应用自p兛_分库分表的规则等Q还是有些复杂的Q于是萌生能否增加一个通用的框架来实现分库分表的数据访问,q个在ebay的架构中对应的就是DALQ这个演变的q程相对而言需要花费较长的旉Q当Ӟ也有可能q个通用的框架会{到分表做完后才开始做Q同Ӟ在这个阶D可能会发现之前的缓存同步方案出现问题,因ؓ数据量太大,D现在不太可能缓存存在本圎ͼ然后同步的方式,需要采用分布式~存Ҏ了,于是Q又是一通考察和折,l于是将大量的数据缓存{Ud分布式缓存上了?/span>
q一步涉及到了这些知识体p:
1、Apache的Y负蝲或LVS软负载等无法承担巨大的web讉K量(hq接数、网l流量等Q的调度了,q个时候如果经费允许的话,会采取的Ҏ是购 买硬件负载,例如F5、Netsclar、Athelon之类的,如经费不允许的话Q会采取的方案是应用从逻辑上做一定的分类Q然后分散到不同的Y负蝲集群中;
2、原有的一些状态信息同步、文件共享等Ҏ可能会出现瓶颈,需要进行改q,也许q个时候会Ҏ情况~写W合|站业务需求的分布式文件系l等Q?br />
在做完这些工作后Q开始进入一个看似完的无限伸羃的时代,当网站流量增加时Q应对的解决Ҏ是不断的添加webserver?/span>
q一步涉及到了这些知识体p:
q一步涉及到了这些知识体p:
1、拆成分布式后需要提供一个高性能、稳定的通信框架Qƈ且需要支持多U不同的通信和远E调用方式;
2、将一个庞大的应用拆分需要耗费很长的时_需要进行业务的整理和系l依赖关pȝ控制{;
3、如何运l_依赖理、运行状늮理、错误追t、调优、监控和报警{)好这个庞大的分布式应用?br />
l过q一步,差不多系l的架构q入相对E_的阶D,同时也能开始采用大量的廉h机器来支撑着巨大的访问量和数据量Q结合这套架构以及这么多ơ演变过E吸取的l验来采用其他各U各LҎ来支撑着来高的访问量?/span>
q一步涉及到了这些知识体p:
]]>
]]>
各位在看q篇文章之前请先?/span>w3school来了解一?/span><img>标签中的usemap属性是什?/span>:
http://www.w3school.com.cn/tags/tag_img_prop_ismap_usemap.asp
在有些概念之?/span>,文章要开始介l?/span><img>标签?/span>usemap详细使用Ҏ?/span>.
usemap属性在w3school描述?/span>: usemap 属性提供了一U?/span>“客户?/span>”的图像映机?/span>.
事实上我个h觉得它就是在一个图像上描绘了多?#8220;热点”.q样解释好像比较Ҏ理解一?/span>.
让我们先来看看在Dreamweaver中一个图像上被描l上了两个热点的最l效果吧:
我们可以在上囑־明显的看?/span>,q个囄上有两个热点,分别在图像的左上角和右下?/span>.只要点击不同区域?/span>,可以超链接C同的地方.
现来看看面中的代码?/span>,q个应该比较重要?/span>,代码如下:
<body>
<img src="images/loginfoot.jpg" border="0" usemap="#Map1" name="foot" width="100" height="100"/>
<map name="Map1">
<area shape="rect" coords="50,50,100,100" style="cursor:hand" href="login.jsp" />
<area shape="rect" coords="0,0,50,50" style="cursor:hand" href="main.jsp"/>
</map>
</body>
让我来解释一下这D代码吧:
先解释这一D?/span>:<img src="images/loginfoot.jpg" border="0" usemap="#Map1" name="foot" width="100" height="100"/>
其实不用多说,q段是在页面上插入一个图?/span>.
囑փ?/span>: images目录下的loginfoot.jpg.
Ҏ?/span>0,面中名UCؓfoot,?/span>100,?/span>100:( border="0" name="foot" width="100" height="100")
重点是这?/span>: usemap="#Map1",我想它应该描qCؓ在此囑փ中用图像映?/span>,映射的具体描qCؓ面中的一?/span><map>,而它的名UCؓMap1.
接下来就要讲?/span><map>?/span>, q个<map>的名字ؓMap1,?/span><map></map>之间有两?/span><area/>,q两?/span><area/>分别代表了图片上的两个热点区?/span>.
下面?/span><area/>标签的属性来作一些介l?/span>:
shape="rect":热点的Ş?/span>shape为矩?/span>rect(rectangular);
style="cursor:hand":鼠标指针cursor的样式ؓ?/span>hand;
href="login.jsp":连接到login.jsp面;
coords="50,50,100,100":q用属性用来描q这个指点区域的具体位置.
我不知道描述位置的属性ؓ什么要使用coords ,q很让h想不明白.如果你不明白coords里面几个值具体是什么意?/span>,我按照个人理?/span>,M下面q张?/span>.希望你看完之后能够明?/span>:
(?/span>coords="a,b,c,d"里面的几个值分别看作是a,b,c,d ).
q副囑փ大小?/span>100*100,中只有一个热?/span><area/>位于囑փ的右下角.中间用来描述位置的属性及其gؓ: coords="50,50,100,100",?/span>:a=50,b=50,c=100,d=100.
看完之后不知道你明白了吗?
以上均ؓ我个人的理解,我将他分享出?/span>.如有错误,q请各位帮忙指正,谢谢!!