﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-void-随笔分类-架构</title><link>http://www.blogjava.net/void241/category/37915.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 26 Mar 2013 02:12:13 GMT</lastBuildDate><pubDate>Tue, 26 Mar 2013 02:12:13 GMT</pubDate><ttl>60</ttl><item><title>基于查询的改进数据仓库模型研究</title><link>http://www.blogjava.net/void241/archive/2009/09/18/295529.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Fri, 18 Sep 2009 01:26:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2009/09/18/295529.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/295529.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2009/09/18/295529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/295529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/295529.html</trackback:ping><description><![CDATA[<p>转载至:<br />
<span><a href="http://www.ciotimes.com/infrastructure/database/a/database200909161049.html"><span>http://www.ciotimes.com/infrastructure/database/a/database200909161049.html</span></a><br />
<br />
<br />
导读:</span>本文提出一种改进的数据仓库体系结构，在数据仓库中添加一个辅助结构作为接收和存储更新数据的暂存库，直到数据仓库获得空闲周期，加入新的数据和更新必要的视图；通过试验模拟两种数据仓库结构，验证了新的模型在设计和性能上的优越性。&nbsp;<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 本文提出一种改进的数据仓库体系结构，在数据仓库中添加一个辅助结构作为接收和存储更新数据的暂存库，直到数据仓库获得空闲周期，加入新的数据和更新必要的视图；通过试验模拟两种数据仓库结构，验证了新的模型在设计和性能上的优越性。<br />
<br />
&nbsp;&nbsp;&nbsp; 数据仓库中的数据是从多业务处理系统中抽取转换而来的，这些数据源的数据是不断变化的。因此，数据仓库需要更新机制来不断更新和维护，以保证数据的完整和正确。同时，数据仓库面向决策支持，数据仓库的体系结构应努力保证查询和分析的实时性。<br />
<br />
&nbsp;&nbsp;&nbsp; 现在系统越来越庞大，数据源越来越多，结构也越来越复杂，这使得数据仓库的加载和更新维护工作更加困难，制定一个数据集成的计划花费的时间和精力也是越来越多。面对这种情况，开发人员的精力被调度繁杂的系统所占用，无法集中到制定合理高效的数据集成计划上来。为了使这一过程更加自动化，减少人工干预，我们引入了基于元数据库的工作流方法，使得整个数据仓库更新处理过程成为一个整体，更加简单易行，减轻了开发人员的负担，从而提高效率。<br />
<br />
<strong>&nbsp;&nbsp;&nbsp; 1 数据仓库的更新问题</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 为了对决策提供有效的支持，数据仓库中的数据需要不断地从业务数据库中得到更新。数据更新是指在原有数据仓库基础上，定期捕捉源数据库的变化数据，追加到数据仓库中。数据仓库获得所需更新信息的方法有以下3种：<br />
<br />
&nbsp;&nbsp;&nbsp; （1）由建立在源数据库上的应用程序提供更新信息给数据仓库。这种方法优点是易于执行，只要对历史遗留系统的代码稍加修改，使它提供源数据库中的更新给数据仓库。缺点是遗留系统的代码难以提供一个好的平台为数据仓库更新。<br />
<br />
&nbsp;&nbsp;&nbsp; （2）利用日志文件。这种方法的优点是对数据仓库的更新不会影响源数据库，利用日志文件效率很高，避免了扫描整个数据库。缺点是解析源数据库日志文件有困难，即：①系统日志文件通常采用软件供应商专有的形式，而不同供应商之间难于共享结构信息；②获得日志文件，需要系统管理员权限；③数据库系统不一定都有实施该方法的数据库日志类型。<br />
<br />
&nbsp;&nbsp;&nbsp; （3）前后映象文件的方法。在抽取数据前后对数据库各作一次快照，然后比较两幅快照的不同从而确定新数据。这种方法的优点和第2种方法一样，快照数据被提供给数据仓库，或者提供给独立于源数据库和数据仓库的辅助处理器，来完成快照的比较工作。缺点是快照文件会变得越来越大，导致快照的比较工作非常耗时，占用大量资源，影响性能。数据仓库更新过程牵涉的因素众多而且复杂，因此，本文的研究只限于源数据已经传递到数据仓库后的数据更新处理。<br />
<br />
<strong>&nbsp;&nbsp;&nbsp; 2 改进的数据仓库体系结构</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 常用的数据仓库体系结构如图1所示，它集成源数据库的数据，并将其存储在数据仓库中，用户直接从数据仓库访问数据。这个结构简单易行，但它不能及时地自动侦测源数据库的更新，只有当高端应用对数据仓库进行查询时，才由数据仓库的实体化视图对相关的源数据库发动查询，源数据库对更新处理处于被动状态。本文建议在数据仓库体系结构中添加一个如图2所示的更新辅助结构，来优化数据仓库的性能，减少用户查询时间。该结构假定为非易失随机存储器NVRAM，用它作为数据仓库和数据解释器之间的缓冲存储区。辅助结构和源数据库（SDB）之间的数据流是单向的，负责接收由SDB提交到数据解释器的更新数据。辅助结构和数据仓库之间的数据流是双向的，它向数据仓库提供视图维护的基本数据，数据仓库的查询和维护请求则在辅助结构中执行完成。有了这个辅助结构，避免了数据仓库在接收数据解释器中数据的同时，对数据库表和用户视图执行更新维护。使得数据仓库的更新选择在系统空闲时间，而不是在新数据由源数据库转换的同时进行。数据仓库使用具有周期性，因此必然存在接收更新数据的空闲时间。另外数据仓库可以查询辅助结构获取更新数据，反馈给用户的查询。为了防止辅助结构中数据溢出，设一个机制强制执行更新事务，将有关数据传送到数据仓库。 </p>
<p style="text-align: center"><img height="256" alt="图1 标准数据库仓库模型" src="http://www.ciotimes.com/images/200909/200909160941.jpg" width="347" border="0" /><br />
&nbsp;&nbsp;<strong>&nbsp; 图1 标准数据库仓库模型<br />
</strong><img height="248" alt="图2 数据仓库的改进模型" src="http://www.ciotimes.com/images/200909/200909160942.jpg" width="340" border="0" /><br />
<strong>&nbsp;&nbsp;&nbsp; 图2 数据仓库的改进模型</strong></p>
<p><strong><br />
<br />
&nbsp;&nbsp;&nbsp; 3 改进模型的设计实现</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 新模型结构重点在于用户查询，系统对用户查询响应拥有对系统其他进程更高的优先权。<br />
<br />
&nbsp;&nbsp;&nbsp; （1）功能结构。来自数据解释器的数据，首先存放在更新辅助结构的数据表中。这些辅助表（例如索引）是存储在数据仓库中的表的副本，但是不具有与数据仓库结构相联系的管理能力。它们是用于更新数据仓库的临时存储，而不用于用户直接访问。更新信息传送到辅助结构时，首先检查辅助结构的空间相对分配给辅助结构的NVRAM空间所占比例。当辅助结构已使用空间达到NVRAM空间的95％，标志溢出，更新辅助结构自动生成数据包和必要的查询传递给数据仓库。溢出功能触发器是一种安全措施，防止因为更新辅助结构的存储空间满，不能接收来自数据解释器的数据。操作流程为数据仓库在空闲时间请求更新辅助结构里的数据。数据仓库的系统请求或者数据溢出标志可能会触发更新进程。一旦更新进程被触发，更新辅助结构生成数据包，并发送给数据仓库，用于插入到数据仓库表中。数据仓库中相应的数据表和视图被更新，在更新完成后，事务完成信息返回给辅助结构。然后辅助结构删除临时存储表中的相关数据，从而释放其占用的空间。<br />
<br />
&nbsp;&nbsp;&nbsp; （2）处理用户查询。数据仓库接到用户查询要求后，系统暂停队列表中除了来自辅助结构的用户查询响应之外的所有队列。仓库应用程序确认用户查询，并将一个查询副本立即发送给更新辅助结构，辅助结构临时内存中可能存有与查询相关的信息。查询先在数据仓库的主数据表处理，查询的结果暂存在临时表里，该临时表用于存放以后不断积累的查询结果数据。如果辅助结构里有任何与查询有用的数据，会被立即提交给数据仓库作为对查询副本的响应。辅助结构响应用户查询的数据传输在系统信息通道中有最高优先权，以确保来自数据仓库的信息迅速地被处理，并使当前执行的用户查询较系统查询队列里其他查询最先获得所需数据。如果辅助结构中没有符合用户查询要求的数据，辅助结构提交一个空包作为响应，防止数据仓库空等待，使数据仓库能控制用户查询进程，确认查询进程的结束。来自辅助结构的数据加入到临时表里，然后发给报表／视图生成器处理成用户可读的形式。<br />
<br />
<strong>&nbsp;&nbsp;&nbsp; 4 基于XML的中间件模型</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 改进结构中提供了多种操作符，如投影、选择、连接、并、拆分等。把复杂的数据集成工作分解为很多相对简单的小步骤，使用户可以灵活地定制自己的数据集成计划，这样也为使用工作流方法来调度整个数据集成计划提供了方便，因为工作流方法对于这种流程化的处理十分方便。使用工作流方法，来操纵数据的流向，使其从数据源经过预先指定的处理过程流向目标，即数据仓库中。工作流方法离不开元数据库的支持。元数据贯穿于数据仓库的整个过程。按照数据库中的定义，元数据是关于数据的数据。在数据仓库的环境下，元数据的作用更加重要，由于数据仓库是面向主题的，所以其元数据的内容也更加丰富。初始阶段我们可以根据元数据库提供的数据源信息，来制定清洗计划，执行这个计划，能完成一次数据的抽取转换和加载任务，把各个数据源中的零散的数据整合到数据仓库中；在维护阶段，把用户在建立数据仓库的初期所制定的计划，主要包括数据库的表信息以及用到的临时表等，以XML文件的形式保存在元数据库中。这样节约了管理人员的时间，他们的精力可以更多地集中在制定一个合理高效的数据集成计划上，从而提高效率。<br />
<br />
&nbsp;&nbsp;&nbsp;<strong> 5 一种更新流实例</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 以下给出了一个具体的例子来说明改进结构如何处理凋度流程，如图3、图4所示。</p>
<p style="text-align: center"><img height="216" alt="图3 改进结构的数据集成框架" src="http://www.ciotimes.com/images/200909/200909160943.jpg" width="336" border="0" /><br />
<strong>&nbsp;&nbsp;&nbsp; 图3 改进结构的数据集成框架<br />
</strong><img height="206" alt="图4信息报送引擎数据流图" src="http://www.ciotimes.com/images/200909/200909160935.jpg" width="223" border="0" /><br />
<strong>&nbsp;&nbsp;&nbsp; 图4 计划工作流流程</strong></p>
<p><br />
<br />
&nbsp;&nbsp;&nbsp; 图4中每一个节点都是工作流的一个活动，箭头所指向的是数据流的实际流向，从数据源到目标。虚线表示的是控制流。数据流向和控制流向基本相同，重合的没有画出，只是在并操作时不同，所以用不同的箭头标注出来。本例中，要把来自3个不同数据库的原始表经过一系列的操作如投影连接等，整合成一张表加载到数据仓库中。首先通过ODBC／OLE DB标准或者数据源提供的API，把数据从源中抽取出来。然后先投影表1，再与表2进行连接，得到的表与表3进行并，形成一张表，再进行一些排序筛选，最后加载到目标数据仓库中。要注意的是，在进行并（Union）操作的2个表必须是列结构相同，否则要进行回溯，对2表进行相应的改动处理，符合Union 的要求后才能继续处理下去。<br />
<br />
&nbsp;&nbsp;&nbsp; 在改进的模型结构中，投影（Project）、连接（Join）、并（Union）等操作符都对应一个类（Class）。与此操作符相关的各种处理都封装在类的内部。工作流引擎通过工作流API接口来调用类内的相关函数，完成数据集成。下面是图4这个数据集成计划的XML文件格式，我们只关注定义活动的部分：<br />
<br />
&nbsp;&nbsp;&nbsp; &#8230;<br />
<br />
&nbsp;&nbsp;&nbsp; &#8230;<br />
<br />
&nbsp;&nbsp;&nbsp; Ying Liu<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;／Activitylnvolve&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; SELECT[reader]FROM tablenameWHERE.<br />
<br />
&nbsp;&nbsp;&nbsp; &#8230;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;／ActiVityInvolve&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;！- -活动的流向- -&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 转向6&lt;／Choice&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 转向7&lt;／Choice&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 转向8&lt;／Choice&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 结束&lt;／Choice&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;／App rovalChoices&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;／Activity&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &#8230;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;！- -活动之间的流向定义- -&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;／FlowDirection&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 其中是定义Union这个活动，包括活动的所有者，数据可能流向与条件等。是定义一个流向，即图中的一个箭头，标志了箭头的起始活动等。这个文件就可以把我们的计划保存下来，工作流引擎通过XP2DL解析器来解析这个文件，来获得最初用户制定的集成计划。<br />
<br />
&nbsp;&nbsp;&nbsp; 触发更新操作的时机。触发更新操作可以有多种方式：①可以由用户驱动，如用户发出命令来进行数据仓库的更新；②可以时间驱动，如规定在一天当中的某个时刻来更新数据仓库；③还可以用事件驱动，如数据源的日志发生改变后，启动更新操作。触发方式也保存在元数据库中，可以根据需求灵活地选择最佳方式。<br />
<br />
<strong>&nbsp;&nbsp;&nbsp; 6 结束语</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 数据仓库设计和运行过程中，数据抽取、转换和转载ETL是一个重要的问题，其中，数据更新又是一个关键点。本文讨论了在数据更新过程中，为捕获源数据库更新，提出了一种改进的数据仓库体系结构，它使数据的更新较传统结构更快速、便捷。并在提出的改进模型基础上，设计了在元数据库指导下，以工作流的方法来调度整个更新过程。</p>
  <img src ="http://www.blogjava.net/void241/aggbug/295529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2009-09-18 09:26 <a href="http://www.blogjava.net/void241/archive/2009/09/18/295529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LiveJournal 架构</title><link>http://www.blogjava.net/void241/archive/2009/09/14/295075.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Mon, 14 Sep 2009 14:15:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2009/09/14/295075.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/295075.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2009/09/14/295075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/295075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/295075.html</trackback:ping><description><![CDATA[<a href="http://www.example.net.cn/archives/2006/03/olivejournaloio.html">http://www.example.net.cn/archives/2006/03/olivejournaloio.html</a>
<img src ="http://www.blogjava.net/void241/aggbug/295075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2009-09-14 22:15 <a href="http://www.blogjava.net/void241/archive/2009/09/14/295075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大型Web2.0站点构建技术初探(转)</title><link>http://www.blogjava.net/void241/archive/2009/08/14/291179.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Fri, 14 Aug 2009 08:23:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2009/08/14/291179.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/291179.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2009/08/14/291179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/291179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/291179.html</trackback:ping><description><![CDATA[　　一、 web2.0网站常用可用性功能模块分析
<p>　　二、 Flickr的幕后故事 </p>
<p>　　三、 YouTube 的架构扩展 </p>
<p>　　四、 mixi.jp：使用开源软件搭建的可扩展SNS网站 </p>
<p>　　五、 Technorati的后台数据库架构 </p>
<p>　　六、 通过了解MySpace的六次重构经历,来认识分布式系统到底该如何创建 </p>
<p>　　七、 从LiveJournal后台发展看大规模网站性能优化方法 </p>
<p>　　八、 说说大型高并发高负载网站的系统架构 </p>
<p>　　<strong taggedby="hylanda">一、 </strong><strong taggedby="hylanda">web2.0</strong>网站常用可用性功能模块分析</p>
<p>　　Web 2.0网站是指将传统的网站构架（平台、内容源、用户、传播方式等）转化到<strong>以用户为核心</strong>的网站构架上来，包括一系列体现web2.0概念的元素、定位和创 意。web2.0网站在构架上须体现两大宗旨，即<strong>强大的后台系统和简单的前台页面</strong>，也即提供良好的用户体验，体现<strong>以人为本，技术服务人类</strong>的宗旨。 </p>
<p>　　web2.0网站常用功能块通常包括以下几大项： </p>
<p>　　<strong taggedby="hylanda">1.</strong><strong taggedby="hylanda">Tag</strong><strong taggedby="hylanda">标签功能块</strong></p>
<p>　　Tag(中文叫做"标签") 是一种新的组织和管理在线信息的方式。它不同于传统的、针对文件本身的关键字检索，而是一种模糊化、智能化的分类。 </p>
<p>　　网页使用Tag标签的好处： </p>
<p>　　为页面设置一个或者多个Tag标签可以引导读者阅读更多相关文章，为别人带去流量同理也为自己带来流量。 </p>
<p>　　可以帮助读者及时了解一些未知的概念和知识点，提高用户体验。 </p>
<p>　　Tag是人的意志和趋向的体现，Tag可以帮助你找到兴趣相投的人。 </p>
<p>　　基于以上优势，Tag标签代替了传统的分类法，成为web2.0网站使用率最高的功能块（与其说是功能块倒不如说是一种内容导航和内容组织形式）。 </p>
<p>　　一句话：Tag标签是一种更灵活的分类方法，功能在于引导，特点是无处不在，体现智能性、模糊性和趋向性。 </p>
<p>　　<strong taggedby="hylanda">2.</strong><strong taggedby="hylanda">RSS</strong><strong taggedby="hylanda">订阅功能块</strong></p>
<p>　　RSS是在线共享内容的一种简易方式（也叫聚合内容，Really Simple Syndication）。通常在时效性比较强的内容上使用RSS订阅能更快速获取信息，网站提供RSS输出，有利于让用户获取网站内容的最新更新。网络 用户可以在客户端借助于支持RSS的聚合工具软件（例如SharpReader,NewzCrawler、FeedDemon），在不打开网站内容页面的 情况下阅读支持RSS输出的网站内容。 </p>
<p>　　RSS订阅的方式： </p>
<p>　　订阅到客户端软件如周伯通、遨游浏览器RSS阅读、Foxmail RSS阅读等，此方式使用者较多 </p>
<p>　　订阅到在线阅读（聚合类）门户网站如Google Reader，Yahoo Reader，抓虾、Gougou等，省去了安装RSS阅读器的麻烦 </p>
<p>　　订阅到在线单用户聚合器如Lilina等，比较灵活 </p>
<p>　　RSS订阅功能的最大好处是定向投递，也就是说RSS机制更能体现用户的意愿和个性，获取信息的方式也最直接和简单，这是RSS订阅功能备受青睐的一大主要原因。 </p>
<p>　　<strong taggedby="hylanda">3.</strong><strong taggedby="hylanda">推荐和收藏功能块</strong></p>
<p>　　说到推荐功能，不仅web2.0网站在大量使用，传统的以cms平台为代表的内容模式的网站也在大量使用，推荐功能主要是指向一些网摘或者聚合类门户网站推荐自己所浏览到的网页。当然，一种变相的推荐就是阅读者的自我收藏行为，在共享的模式下也能起到推荐的作用。 </p>
<p>　　比较有名的推荐目标有以del.icio.us为代表的网摘类网站包括国内比较有名气的365key、和讯网摘、新浪vivi、天极网摘等。这 里值得一提的是前段时间曾涌现了大批网摘类网站，但他们坚持活下来的好像没有几个了，推荐使用前面提到的这几个网摘门户，人气基本上是使最旺的。 </p>
<p>　　<strong taggedby="hylanda">4.</strong><strong taggedby="hylanda">评论和留言功能块</strong></p>
<p>　　web2.0强调参与性，强调发挥用户的主导作用，这里的参与性除了所谓的订阅、推荐功能外更多地体现在用户对内容的评价和态度，这就要靠评论 功能块来完成。一个典型的web2.0网站或者说一个能体现人气的web2.0网站都会花大量篇幅来体现用户的观点和视觉。这里尤其要提到web2.0中 的带头老大web blog，评论功能已经成为博客主人与浏览者交流的主要阵地，是体现网站人气的最直观因素。 </p>
<p>　　评论功能块应用在博客系统中实际上已经和博客内容相分离，而更好的应用恰恰是一些以点评为主的web2.0网站比如豆瓣、点评网等，这里的评论功能块直接制造了内容也极大地体现了网站的人气，所以说<strong>评论功能块是web2.0网站最有力的武器</strong>。 </p>
<p>　　<strong taggedby="hylanda">5.</strong><strong taggedby="hylanda">站内搜索功能块</strong></p>
<p>　　搜索是信息来源最直接的方式之一，无论你的网站是否打上web2.0的烙印，搜索对于一个体系庞大、内容丰富的大型网站都是非常必要的。Tag 标签在某种程度上起到搜索的作用，它能够有效聚合以此Tag为关键词的内容，但这种情况的前提是此Tag标签对浏览者是可见的，也就是说当Tag标签摆在 浏览者的眼前时才成立，而对于那些浏览者想要的信息却没有Tag标签来引导时搜索就是达到此目的的最好方法。 </p>
<p>　　对于web2.0网站，站内搜索以标题或者Tag为搜索域都能起到好的效果，但本人不建议使用内容搜索域，因为这不符合搜索的高效性原则。同 时，具有突出关键词的内容往往都可以用Tag标签来引导，因此使用内容域来搜索实际上是一种浪费服务器资源的行为，而且搜索结果的准确性将大打折扣。 </p>
<p>　　<strong taggedby="hylanda">6.</strong><strong taggedby="hylanda">群组功能块</strong></p>
<p>　　我为什么要把群组作为web2.0网站的功能块来分析呢，因为群组是web2.0网站的一大特点，也是web2.0所要体现的服务宗旨所在。一 个web2.0网站，博客也好、播客也好、点评也好，抑或是网摘、聚合门户，他们都强调人的参与性。物以类聚、人以群分，每个参与者都有自己的兴趣趋向， web2.0网站的另一主要功能就是帮助这些人找到同样兴趣的人并形成一个活跃的群体，这是web2.0网站的根本。 </p>
<p>　　总结：web2.0网站倡导的是<strong>集体创作、共享资源</strong>，靠的是人气，体现的是参与性，一个没有参与性的web2.0网站都不足以成为 web2.0。以上提到的这几个功能块就是以吸引用户参与和引导用户参与为目的的，真正的web2.0不是什么深奥的东西，只有一点，那就是如何让浏览者 沸腾起来。 </p>
<p>　　<strong taggedby="hylanda">二、 Flickr</strong>的幕后故事</p>
<p>　　我们都看到 Flickr 的成功，而又有多少"精英"们了解过 Flickr 背后的过程是多么充满艰险。 </p>
<p>　　Flickr 是<strong>全 CGI 的动态构架</strong>(<font color="#ff9900">呀呀...</font>.)，并以一种 .gne 的脚本作为 CGI 程序语言。不管网站制作菜鸟还是高手都会疑惑：gne 是哪种程序语言？答案：gne 不是一种语言，Flickr 是以极为经典的 PHP + MySQL 方式实现的，在被 Yahoo 收购服务器搬入美国之前，使用了 21 台（69.90.111.101-121） Apache/PHP 做 Web、23 台图片服务器、另有 MySQL 服务器组成的数据库集群的服务器数量未知。现在估计使用的是 Yahoo 的负载均衡系统，对外只有一个 Web 的 IP 和图片服务器的 IP 了。 </p>
<p>　　那为何 .php 的文件要改成 .gne 呢？以往有大型网站为向后兼容性考虑，隐藏以程序语言命名的脚本文件扩展名，比如 Baidu 隐藏了 .php<font color="#ff9900">(哈哈..baidu也是php的,还以为是c)</font>（Google 的 http 服务器是自己写的，整合了脚本程序，个别页面是 .py--Python）；还有一些网站是改成自己网站名相关的扩展名，如 MSN 的群组则是 .msnw，榕树下是 .rs。 </p>
<p>　　那 Flickr 的 gne 是什么意思？我在维基百科的 Flickr 条目上找到了答案(中文 Flickr 条目上没有写明) 。原来 GNE 是 Game NeverEnding 的缩写，Flickr 的开发者 Ludicorp 在 2002-2004 年一直在开发这套以 Game NerverEnding 为名称的大型多人在线角色扮演游戏--一套<font color="#ff9900">基于浏览器的 Web 游戏系统</font>，个人以为应该就是当年九城的虚拟城市。但是开发近 3 年后该计划不得不破产，最终只发布了一个 Beta 版，而 Ludicorp 将这套系统稍加移植，就有了 Flickr。呵呵，原来 gne 是一个项目的名称。关于 GNE 的一些连接：http://del.icio.us/schee/gne。 </p>
<p>　　早期的 Flickr 想做成在类似聊天室的地方让网友分享、交流自己的照片，注重社区形式和保护照片不被外部引用（见徐子涵2004年的文章），可能是看到了 Hello 的模式吧。但是聪明的 Flickr 团队不久就改变了策略，<strong>淡化了传统的社区形式--如聊天室</strong>、而加强了现在使其功成名就的 Tag 组织形式，一种更自由更随兴更轻松好玩的大社区形式，或者叫它广义社区吧，我随便叫的，可能太学究，看着别太在意就是了。另外，将原来照片只能在 Flash 内浏览的限制区除了，并大力推荐用户将照片引用到自己的 Blog，这无疑对于挑战传统相册系统有决定性意义。减少 Flash 后的网页更多地引进了新兴的 Ajax 技术，使界面操作变得非常 Cool。 </p>
<p>　　这就是 Flickr 的历史，清晰地看到了他们对于优秀产品的执著。有了<strong>技术和经验积累</strong>(这是很必要的)，加上不断坚持，总有一天时来运转，你的产品会成为新潮流的里程碑。 </p>
<p>　　还有一句话要告诉 Yupoo 等：把 Flickr 想成一个有 Tag 功能的在线相册就已经错远了；复制粘贴者们想当然将 Flickr 去其糟粕取其精华，结果无关紧要的拿来了，将令人激动的优点都去掉了，结果剩下什么？ </p>
<p>　　<strong taggedby="hylanda">三、 YouTube</strong>的架构扩展</p>
<p>　　在西雅图扩展性的技术研讨会上，YouTube 的 Cuong Do 做了关于 YouTube Scalability 的报告。视频内容在 Google Video 上有(地址)，可惜国内用户看不到。 </p>
<p>　　Kyle Cordes 对这个视频中的内容做了介绍。里面有不少技术性的内容。值得分享一下。(Kyle Cordes 的介绍是本文的主要来源) </p>
<p>　　简单的说 YouTube 的数据流量, "一天的YouTube流量相当于发送750亿封电子邮件.", 2006 年中就有消息说每日 PV 超过 1 亿,现在? 更夸张了,"每天有10亿次下载以及6,5000次上传", 真假姑且不论, 的确是超乎寻常的海量. 国内的互联网应用,但从数据量来看,怕是只有 51.com 有这个规模. 但技术上和 YouTube 就没法子比了. </p>
<p>　　<strong taggedby="hylanda">1.</strong><strong taggedby="hylanda">Web</strong><strong taggedby="hylanda">服务器</strong></p>
<p>　　YouTube 出于开发速度的考虑，<strong>大部分代码都是 Python 开发的</strong>。Web 服务器有部分是 Apache， 用<strong> FastCGI</strong> 模式。对于视频内容则用 <strong>Lighttpd</strong> 。据我所知，MySpace 也有部分服务器用 Lighttpd ，但量不大。YouTube 是 Lighttpd 最成功的案例。(国内用 Lighttpd 站点不多，豆瓣用的比较舒服。by Fenng) </p>
<p>　　<strong taggedby="hylanda">2.</strong><strong taggedby="hylanda">视频</strong></p>
<p>　　视频的缩略图(Thumbnails)给服务器带来了很大的挑战。每个视频平均有4个缩略图，而每个 Web 页面上更是有多个，每秒钟因为这个带来的磁盘 IO 请求太大。YouTube 技术人员启用了单独的服务器群组来承担这个压力，并且针对 Cache 和 OS 做了部分优化。另一方面，缩略图请求的压力导致 Lighttpd 性能下降。通过 Hack Lighttpd 增加更多的 worker 线程很大程度解决了问题。而最新的解决方案是起用了 Google 的 BigTable， 这下子从性能、容错、缓存上都有更好表现。看人家这收购的，好钢用在了刀刃上。 </p>
<p>　　出于冗余的考虑，每个视频文件放在一组迷你 Cluster 上，所谓 "迷你 Cluster" 就是一组具有相同内容的服务器。最火的视频放在 CDN 上，这样自己的服务器只需要承担一些"漏网"的随即访问即可。YouTube 使用简单、廉价、通用的硬件，这一点和 Google 风格倒是一致。至于维护手段，也都是常见的工具，如 rsync, SSH 等，只不过人家更手熟罢了。 </p>
<p>　　<strong taggedby="hylanda">3.</strong><strong taggedby="hylanda">数据库</strong></p>
<p>　　YouTube 用 MySQL 存储元数据--用户信息、视频信息什么的。数据库服务器曾经一度遇到 SWAP 颠簸的问题，解决办法是删掉了 SWAP 分区! 管用。 </p>
<p>　　最初的 DB 只有 10 块硬盘，RAID 10 ，后来追加了一组 RAID 1。够省的。这一波 Web 2.0 公司很少有用 Oracle 的(我知道的只有 Bebo,参见这里). 在扩展性方面，路线也是和其他站点类似，复制，分散 IO。最终的解决之道是"分区",这个不是数据库层面的表分区，而是业务层面的分区(在用户名字或者 ID 上做文章,应用程序控制查找机制) </p>
<p>　　YouTube 也用 Memcached. </p>
<p>　　很想了解一下国内 Web 2.0 网站的数据信息,有谁可以提供一点 ? </p>
<p>　　<strong taggedby="hylanda">四、 mixi.jp</strong>：使用开源软件搭建的可扩展SNS网站</p>
<p>　　Mixi目前是日本排名第三的网站，全球排名42，主要提供SNS服务：日记，群组，站内消息，评论，相册等等，是日本最大的SNS网站。 Mixi从2003年12月份开始开发，由现在它的CTO - Batara Kesuma一个人焊，焊了四个月，在2004年2月份开始上线运行。两个月后就注册了1w用户，日访问量60wPV。在随后的一年里，用户增长到了 21w，第二年，增长到了200w。到今年四月份已经增长到370w注册用户，并且还在以每天1.5w人的注册量增长。这些用户中70%是活跃用户（活跃 用户：三天内至少登录一次的用户），平均每个用户每周在线时间为将近3个半小时。 </p>
<p>　　下面我们来看它的技术架构。Mixi采用开源软件作为架构的基础：Linux 2.6，Apache 2.0，MySQL，Perl 5.8，memcached，Squid等等。到目前为止已经有100多台MySQL数据库服务器，并且在以每月10多台的速度增长。Mixi的数据库连 接方式采用的是每次查询都进行连接，而不是持久连接。数据库大多数是以InnoDB方式运行。Mixi解决扩展问题主要依赖于对数据库的切分。 </p>
<p>　<strong>　首先进行垂直切分，按照表的内容将不同的表划分到不同的数据库中。然后是水平切分，根据用户的ID将不同用户的内容再划分的不同的数据库中，这 是比较通常的做法，也很管用。</strong>划分的关键还是在于应用中的实现，需要将操作封装在在数据层，而尽量不影响业务层。当然完全不改变逻辑层也不可能，这时候最 能检验以前的设计是否到位，如果以前设计的不错，那创建连接的时候传个表名，用户ID进去差不多就解决问题了，而以前如果sql代码到处飞，或者数据层封 装的不太好的话那就累了。 </p>
<p>　　这样做了以后并不能从根本上解决问题，尤其是对于像mixi这种SNS网站，页面上往往需要引用大量的用户信息，好友信息，图片，文章信息，跨 表，跨库操作相当多。这个时候就需要发挥memcached的作用了，用大内存把这些不变的数据全都缓存起来，而当修改时就通知cache过期，这样应用 层基本上就可以解决大部分问题了，只会有很小一部分请求穿透应用层，用到数据库。Mixi的经验是平均每个页面的加载时间在0.02秒左右（当然根据页面 大小情况不尽相似），可以说明这种做法是行之有效的。Mixi一共在32台机器上有缓存服务器，每个Cache Server 2G内存，这些Cache Server与App Server装在一起。因为Cache Server对CPU消耗不大，而有了Cache Server的支援，App Server对内存要求也不是太高，所以可以和平共处，更有效的利用资源。 </p>
<p>　　图片的处理就显得相对简单的多了。对于mixi而言，图像主要有两部分：一部分是经常要使用到的，像用户头像，群组的头像等等，大概有100多 GB，它们被Squid和CDN所缓存，命中率相对比较高；另一部分是用户上传的大量照片，它们的个体访问量相对而言比较小，命中率也比较低，使用 Cache不划算，所以对于这些照片的策略是直接在用户上传的时候分发到到图片存储服务器上，在用户访问的时候直接进行访问，当然图片的位置需要在数据库 中进行记录，不然找不到放在哪台服务器上就郁闷了。 </p>
<p>　　<strong taggedby="hylanda">五、 Technorati</strong>的后台数据库架构</p>
<p>　　Technorati(现在被阻尼了, 可能你访问不了)的 Dorion Carroll在 2006 MySQL 用户会议上介绍了一些关于 Technorati 后台数据库架构的情况. </p>
<p>　　<strong taggedby="hylanda">基本情况</strong></p>
<p>　　目前处理着大约 10Tb 核心数据, 分布在大约 20 台机器上.通过复制, 多增加了 100Tb 数据, 分布在 200 台机器上. 每天增长的数据 1TB. 通过 SOA 的运用, 物理与逻辑的访问相隔离,　似乎消除了数据库的瓶颈. 值得一提的是, 该扩展过程始终是利用普通的硬件与开源软件来完成的. 毕竟 , Web 2.0 站点都不是烧钱的主. 从数据量来看，这绝对是一个相对比较大的 Web 2.0 应用. </p>
<p>　　Tag 是 Technorati 最为重要的数据元素. 爆炸性的 Tag 增长给 Technorati 带来了不小的挑战. </p>
<p>　　2005 年 1 月的时候, 只有两台数据库服务器, 一主一从. 到了 06 年一月份, 已经是一主一从, 6 台 MyISAM 从数据库用来对付查询, 3 台 MyISAM 用作异步计算. </p>
<p>　　一些核心的处理方法: </p>
<p>　　1) <strong taggedby="hylanda">根据实体(tags/posttags))</strong><strong taggedby="hylanda">进行分区</strong></p>
<p>　　衡量数据访问方法，读和写的平衡.然后通过不同的维度进行分区．( Technorati 数据更新不会很多, 否则会成为数据库灾难) </p>
<p>　　2) <strong taggedby="hylanda">合理利用 InnoDB</strong><strong taggedby="hylanda">与 MyISAM</strong></p>
<p>　　InnoDB 用于数据完整性/写性能要求比较高的应用. MyISAM 适合进行 OLAP 运算. 物尽其用. </p>
<p>　　3) <strong taggedby="hylanda">MySQL</strong><strong taggedby="hylanda">复制</strong></p>
<p>　　复制数据到从主数据库到辅数据库上,平衡分布查询与异步计算, 另外一个功能是提供冗余． 如图: </p>
<p>　　</p>
<p align="center">　　<img src="http://www.360doc.com/DownloadImg/3500/754206_1" taggedby="hylanda"  alt="" /></p>
<p>　　</p>
<p>　　六、 通过了解MySpace的六次重构经历,来认识分布式系统到底该如何创建. </p>
<p>　　在每个里程碑，站点负担都会超过底层系统部分组件的最大载荷，特别是数据库和存储系统。接着，功能出现问题，用户失声尖叫。最后，技术团队必须为此修订系统策略。 </p>
<p>　　虽然自2005年早期，站点账户数超过7百万后，系统架构到目前为止保持了相对稳定，但MySpace仍然在为SQL Server支持的同时连接数等方面继续攻坚，Benedetto说，"我们已经尽可能把事情做到最好"。 </p>
<p>　　<strong taggedby="hylanda">1.</strong><strong taggedby="hylanda">里程碑一：50</strong><strong taggedby="hylanda">万账户</strong></p>
<p>　　按Benedetto 的说法，MySpace最初的系统很小，只有两台Web服务器和一个数据库服务器。那时使用的是Dell双CPU、4G内存的系统。 </p>
<p>　　单个数据库就意味着所有数据都存储在一个地方，再由两台Web服务器分担处理用户请求的工作量。但就像MySpace后来的几次底层系统修订时 的情况一样，三服务器架构很快不堪重负。此后一个时期内，MySpace基本是通过添置更多Web服务器来对付用户暴增问题的。 </p>
<p>　　但到在2004年早期，MySpace用户数增长到50万后，数据库服务器也已开始汗流浃背。 </p>
<p>　　但和Web服务器不同，增加数据库可没那么简单。如果一个站点由多个数据库支持，设计者必须考虑的是，如何在保证数据一致性的前提下，让多个数据库分担压力。 </p>
<p>　　在第二代架构中，MySpace运行在3个SQL Server数据库服务器上--一个为主，所有的新数据都向它提交，然后由它复制到其他两个；另两个全力向用户供给数据，用以在博客和个人资料栏显示。这 种方式在一段时间内效果很好--只要增加数据库服务器，加大硬盘，就可以应对用户数和访问量的增加。 </p>
<p>　　<strong taggedby="hylanda">2.</strong><strong taggedby="hylanda">里程碑二：1-2</strong><strong taggedby="hylanda">百万账户</strong></p>
<p>　　MySpace注册数到达1百万至2百万区间后，数据库服务器开始受制于I/O容量--即它们存取数据的速度。而当时才是2004年中，距离上 次数据库系统调整不过数月。用户的提交请求被阻塞，就像千人乐迷要挤进只能容纳几百人的夜总会，站点开始遭遇"主要矛盾"，Benedetto说，这意味 着MySpace永远都会轻度落后于用户需求。 </p>
<p>　　"有人花5分钟都无法完成留言，因此用户总是抱怨说网站已经完蛋了。"他补充道。 </p>
<p>　　这一次的数据库架构按照垂直分割模式设计，<strong>不同的数据库服务于站点的不同功能，如登录、用户资料和博客</strong>。于是，站点的扩展性问题看似又可以告一段落了，可以歇一阵子。 </p>
<p>　　垂直分割策略利于多个数据库分担访问压力，当用户要求增加新功能时，MySpace将投入新的数据库予以支持它。账户到达2百万后， MySpace还从存储设备与数据库服务器直接交互的方式切换到SAN（Storage Area Network，存储区域网络）--用高带宽、专门设计的网络将大量磁盘存储设备连接在一起，而数据库连接到SAN。这项措施极大提升了系统性能、正常运 行时间和可靠性，Benedetto说。 </p>
<p>　　<strong taggedby="hylanda">3.</strong><strong taggedby="hylanda">里程碑三：3</strong><strong taggedby="hylanda">百万账户</strong></p>
<p>　　当用户继续增加到3百万后，垂直分割策略也开始难以为继。尽管站点的各个应用被设计得高度独立，但有些信息必须共享。在这个架构里，每个数据库 必须有各自的用户表副本--MySpace授权用户的电子花名册。这就意味着一个用户注册时，该条账户记录必须在9个不同数据库上分别创建。但在个别情况 下，如果其中某台数据库服务器临时不可到达，对应事务就会失败，从而造成账户非完全创建，最终导致此用户的该项服务无效。 </p>
<p>　　另外一个问题是，个别应用如博客增长太快，那么专门为它服务的数据库就有巨大压力。 </p>
<p>　　2004年中，MySpace面临Web开发者称之为"向上扩展"对"向外扩展"（译者注：Scale Up和Scale Out，也称硬件扩展和软件扩展）的抉择--要么扩展到更大更强、也更昂贵的服务器上，要么部署大量相对便宜的服务器来分担数据库压力。一般来说，大型站 点倾向于向外扩展，因为这将让它们得以保留通过增加服务器以提升系统能力的后路。 </p>
<p>　　但成功地向外扩展架构必须解决复杂的分布式计算问题，大型站点如Google、Yahoo和Amazon.com，都必须自行研发大量相关技术。<strong>以Google为例，它构建了自己的分布式文件系统</strong>。 </p>
<p>　　另外，向外扩展策略还需要大量重写原来软件，以保证系统能在分布式服务器上运行。"搞不好，开发人员的所有工作都将白费"，Benedetto说。 </p>
<p>　　因此，MySpace首先将重点放在了向上扩展上，花费了大约1个半月时间研究升级到32CPU服务器以管理更大数据库的问题。Benedetto说，"那时候，这个方案看似可能解决一切问题。"如稳定性，更棒的是对现有软件几乎没有改动要求。 </p>
<p>　　糟糕的是，高端服务器极其昂贵，是购置同样处理能力和内存速度的多台服务器总和的很多倍。而且，站点架构师预测，从长期来看，即便是巨型数据库，最后也会不堪重负，Benedetto说，"换句话讲，只要增长趋势存在，我们最后无论如何都要走上向外扩展的道路。" </p>
<p>　　因此，MySpace最终将目光移到分布式计算架构--它在物理上分布的众多服务器，整体必须逻辑上等同于单台机器。拿数据库来说，就不能再像 过去那样将应用拆分，再以不同数据库分别支持，而必须将整个站点看作一个应用。现在，数据库模型里只有一个用户表，支持博客、个人资料和其他核心功能的数 据都存储在相同数据库。 </p>
<p>　　既然所有的核心数据逻辑上都组织到一个数据库，那么MySpace必须找到新的办法以分担负荷--显然，运行在普通硬件上的单个数据库服务器是 无能为力的。这次，不再按站点功能和应用分割数据库，MySpace开始将它的用户按每百万一组分割，然后将各组的全部数据分别存入独立的SQL Server实例。目前，MySpace的每台数据库服务器实际运行两个SQL Server实例，也就是说每台服务器服务大约2百万用户。Benedetto指出，以后还可以按照这种模式以更小粒度划分架构，从而优化负荷分担。 </p>
<p>　　当然，还是有一个特殊数据库保存了所有账户的名称和密码。用户登录后，保存了他们其他数据的数据库再接管服务。特殊数据库的用户表虽然庞大，但它只负责用户登录，功能单一，所以负荷还是比较容易控制的。 </p>
<p>　　<strong taggedby="hylanda">4.</strong><strong taggedby="hylanda">里程碑四：9</strong><strong taggedby="hylanda">百万到1</strong><strong taggedby="hylanda">千7</strong><strong taggedby="hylanda">百万账户</strong></p>
<p>　　2005年早期，账户达到9百万后，MySpace开始用Microsoft的C#编写ASP.NET程序。C#是C语言的最新派生语言，吸收 了C++和Java的优点，依托于Microsoft .NET框架（Microsoft为软件组件化和分布式计算而设计的模型架构）。ASP.NET则由编写Web站点脚本的ASP技术演化而来，是 Microsoft目前主推的Web站点编程环境。 </p>
<p>　　可以说是立竿见影， MySpace马上就发现ASP.NET程序运行更有效率，与ColdFusion相比，完成同样任务需消耗的处理器能力更小。据技术总监 Whitcomb说，新代码需要150台服务器完成的工作，如果用ColdFusion则需要246台。Benedetto还指出，性能上升的另一个原因 可能是在变换软件平台，并用新语言重写代码的过程中，程序员复审并优化了一些功能流程。 </p>
<p>　　最终，MySpace开始大规模迁移到ASP.NET。即便剩余的少部分ColdFusion代码，也从Cold-Fusion服务器搬到了 ASP.NET，因为他们得到了BlueDragon.NET（乔治亚州阿尔法利塔New Atlanta Communications公司的产品，它能将ColdFusion代码自动重新编译到Microsoft平台）的帮助。 </p>
<p>　　账户达到1千万时，MySpace再次遭遇存储瓶颈问题。SAN的引入解决了早期一些性能问题，但站点目前的要求已经开始周期性超越SAN的I/O容量--即它从磁盘存储系统读写数据的极限速度。 </p>
<p>　　原因之一是每数据库1百万账户的分割策略，通常情况下的确可以将压力均分到各台服务器，但现实并非一成不变。比如第七台账户数据库上线后，仅仅7天就被塞满了，主要原因是佛罗里达一个乐队的歌迷疯狂注册。 </p>
<p>　　某个数据库可能因为任何原因，在任何时候遭遇主要负荷，这时，SAN中绑定到该数据库的磁盘存储设备簇就可能过载。"SAN让磁盘I/O能力大幅提升了，但将它们绑定到特定数据库的做法是错误的。"Benedetto说。 </p>
<p>　　最初，MySpace通过定期重新分配SAN中数据，以让其更为均衡的方法基本解决了这个问题，但这是一个人工过程，"大概需要两个人全职工作。"Benedetto说。 </p>
<p>　　长期解决方案是迁移到虚拟存储体系上，这样，整个SAN被当作一个巨型存储池，不再要求每个磁盘为特定应用服务。MySpace目前采用了一种新型SAN设备--来自加利福尼亚州弗里蒙特的3PARdata。 </p>
<p>　　在3PAR的系统里，仍能在逻辑上按容量划分数据存储，但它不再被绑定到特定磁盘或磁盘簇，而是散布于大量磁盘。这就使均分数据访问负荷成为可 能。当数据库需要写入一组数据时，任何空闲磁盘都可以马上完成这项工作，而不再像以前那样阻塞在可能已经过载的磁盘阵列处。而且，因为多个磁盘都有数据副 本，读取数据时，也不会使SAN的任何组件过载。 </p>
<p>　　当2005年春天账户数达到1千7百万时，MySpace又启用了新的策略以减轻存储系统压力，即<strong>增加数据缓存层--位于Web服务器和数据库 服务器之间</strong>，其唯一职能是在内存中建立被频繁请求数据对象的副本，如此一来，不访问数据库也可以向Web应用供给数据。换句话说，100个用户请求同一份 资料，以前需要查询数据库100次，而现在只需1次，其余都可从缓存数据中获得。当然如果页面变化，缓存的数据必须从内存擦除，然后重新从数据库获取-- 但在此之前，数据库的压力已经大大减轻，整个站点的性能得到提升。 </p>
<p>　　缓存区还为那些不需要记入数据库的数据提供了驿站，比如为跟踪用户会话而创建的临时文件--Benedetto坦言他需要在这方面补课，"我是数据库存储狂热分子，因此我总是想着将万事万物都存到数据库。"但将像会话跟踪这类的数据也存到数据库，站点将陷入泥沼。 </p>
<p>　　增加缓存服务器是"一开始就应该做的事情，但我们成长太快，以致于没有时间坐下来好好研究这件事情。"Benedetto补充道。 </p>
<p>　　<strong taggedby="hylanda">5.</strong><strong taggedby="hylanda">里程碑五：2</strong><strong taggedby="hylanda">千6</strong><strong taggedby="hylanda">百万账户</strong></p>
<p>　　2005年中期，服务账户数达到2千6百万时，MySpace切换到了还处于beta测试的SQL Server 2005。转换何太急？主流看法是2005版支持64位处理器。但Benedetto说，"这不是主要原因，尽管这也很重要；主要还是因为我们对内存的渴 求。"支持64位的数据库可以管理更多内存。 </p>
<p>　　更多内存就意味着更高的性能和更大的容量。原来运行32位版本的SQL Server服务器，能同时使用的内存最多只有4G。切换到64位，就好像加粗了输水管的直径。升级到SQL Server 2005和64位Windows Server 2003后，MySpace每台服务器配备了32G内存，后于2006年再次将配置标准提升到64G。 </p>
<p>　　意外错误 </p>
<p>　　如果没有对系统架构的历次修改与升级，MySpace根本不可能走到今天。但是，为什么系统还经常吃撑着了？很多用户抱怨的"意外错误"是怎么引起的呢？ </p>
<p>　　原因之一是MySpace对Microsoft的Web技术的应用已经进入连Microsoft自己也才刚刚开始探索的领域。比如11月，超出 SQL Server最大同时连接数，MySpace系统崩溃。Benedetto说，这类可能引发系统崩溃的情况大概三天才会出现一次，但仍然过于频繁了，以致 惹人恼怒。一旦数据库罢工，"无论这种情况什么时候发生，未缓存的数据都不能从SQL Server获得，那么你就必然看到一个'意外错误'提示。"他解释说。 </p>
<p>　　去年夏天，MySpace的Windows 2003多次自动停止服务。后来发现是操作系统一个内置功能惹的祸--预防分布式拒绝服务攻击（黑客使用很多客户机向服务器发起大量连接请求，以致服务器 瘫痪）。MySpace和其他很多顶级大站点一样，肯定会经常遭受攻击，但它应该从网络级而不是依靠Windows本身的功能来解决问题--否则，大量 MySpace合法用户连接时也会引起服务器反击。 </p>
<p>　　"我们花了大约一个月时间寻找Windows 2003服务器自动停止的原因。"Benedetto说。最后，通过Microsoft的帮助，他们才知道该怎么通知服务器："别开枪，是友军。" </p>
<p>　　紧接着是在去年7月某个周日晚上，MySpace总部所在地洛杉矶停电，造成整个系统停运12小时。大型Web站点通常要在地理上分布配置多个 数据中心以预防单点故障。本来，MySpace还有其他两个数据中心以应对突发事件，但Web服务器都依赖于部署在洛杉矶的SAN。没有洛杉矶的SAN， Web服务器除了恳求你耐心等待，不能提供任何服务。 </p>
<p>　　Benedetto说，主数据中心的可靠性通过下列措施保证：可接入两张不同电网，另有后备电源和一台储备有30天燃料的发电机。但在这次事故中，不仅两张电网失效，而且在切换到备份电源的过程中，操作员烧掉了主动力线路。 </p>
<p>　　2007年中，MySpace在另两个后备站点上也建设了SAN。这对分担负荷大有帮助--正常情况下，每个SAN都能负担三分之一的数据访问量。而在紧急情况下，任何一个站点都可以独立支撑整个服务，Benedetto说。 </p>
<p>　　MySpace仍然在为提高稳定性奋斗，虽然很多用户表示了足够信任且能原谅偶现的错误页面。 </p>
<p>　　"作为开发人员，我憎恶Bug，它太气人了。"Dan Tanner这个31岁的德克萨斯软件工程师说，他通过MySpace重新联系到了高中和大学同学。"不过，MySpace对我们的用处很大，因此我们可 以原谅偶发的故障和错误。" Tanner说，如果站点某天出现故障甚至崩溃，恢复以后他还是会继续使用。 </p>
<p>　　这就是为什么Drew在论坛里咆哮时，大部分用户都告诉他应该保持平静，如果等几分钟，问题就会解决的原因。Drew无法平静，他写道，"我已 经两次给MySpace发邮件，而它说一小时前还是正常的，现在出了点问题&#8230;&#8230;完全是一堆废话。"另一个用户回复说，"毕竟它是免费的。 "Benedetto坦承100%的可靠性不是他的目标。"它不是银行，而是一个免费的服务。"他说。 </p>
<p>　　换句话说，MySpace的偶发故障可能造成某人最后更新的个人资料丢失，但并不意味着网站弄丢了用户的钱财。"关键是要认识到，与保证站点性 能相比，丢失少许数据的故障是可接受的。"Benedetto说。所以，MySpace甘冒丢失2分钟到2小时内任意点数据的危险，在SQL Server配置里延长了"checkpoint"操作--它将待更新数据永久记录到磁盘--的间隔时间，因为这样做可以加快数据库的运行。 </p>
<p>　　Benedetto说，同样，开发人员还经常在几个小时内就完成构思、编码、测试和发布全过程。这有引入Bug的风险，但这样做可以更快实现新 功能。而且，因为进行大规模真实测试不具可行性，他们的测试通常是在仅以部分活跃用户为对象，且用户对软件新功能和改进不知就里的情况下进行的。因为事实 上不可能做真实的加载测试，他们做的测试通常都是针对站点。 </p>
<p>　　"我们犯过大量错误，"Benedetto说，"但到头来，我认为我们做对的还是比做错的多。"<br />
<strong taggedby="hylanda">　　七、 从LiveJournal</strong>后台发展看大规模网站性能优化方法 </p>
<p>　　LiveJournal是99年始于校园中的项目，几个人出于爱好做了这样一个应用，以实现以下功能： </p>
<p>　　博客，论坛 </p>
<p>　　社会性网络，找到朋友 </p>
<p>　　聚合，把朋友的文章聚合在一起 </p>
<p>　　LiveJournal采用了大量的开源软件，甚至它本身也是一个开源软件。 </p>
<p>　　在上线后，LiveJournal实现了非常快速的增长： </p>
<p>　　2004年4月份：280万注册用户。 </p>
<p>　　2005年4月份：680万注册用户。 </p>
<p>　　2005年8月份：790万注册用户。 </p>
<p>　　达到了每秒钟上千次的页面请求及处理。 </p>
<p>　　使用了大量MySQL服务器。 </p>
<p>　　使用了大量通用组件。 </p>
<p>　　<strong taggedby="hylanda">二、LiveJournal</strong><strong taggedby="hylanda">架构现状概况</strong></p>
<p>　　</p>
<p align="center">　　<img src="http://www.360doc.com/DownloadImg/3500/754206_2" taggedby="hylanda"  alt="" /></p>
<p>　　</p>
<p>　　<strong taggedby="hylanda">三、从LiveJournal</strong><strong taggedby="hylanda">发展中学习</strong></p>
<p>　　LiveJournal从1台服务器发展到100台服务器，这其中经历了无数的伤痛，但同时也摸索出了解决这些问题的方法，通过对LiveJournal的学习，可以让我们避免LJ曾经犯过的错误，并且从一开始就对系统进行良好的设计，以避免后期的痛苦。 </p>
<p>　　下面我们一步一步看LJ发展的脚步。 </p>
<p>　　<strong taggedby="hylanda">1</strong><strong taggedby="hylanda">、一台服务器</strong></p>
<p>　　<strong>一台别人捐助的服务器(<font color="#ff9900">强烈ft</font>)</strong>，LJ最初就跑在上面，就像Google开始时候用的破服务器一样，值得我们尊敬。这个阶段，LJ的人以惊人的速度熟悉的 Unix的操作管理，服务器性能出现过问题，不过还好，可以通过一些小修小改应付过去。在这个阶段里LJ把CGI升级到了FastCGI。 </p>
<p>　　最终问题出现了，网站越来越慢，已经无法通过优过化来解决的地步，需要更多的服务器，这时LJ开始提供付费服务，可能是想通过这些钱来购买新的服务器，以解决当时的困境。 </p>
<p>　　毫无疑问，当时LJ存在巨大的单点问题，所有的东西都在那台服务器的铁皮盒子里装着。 </p>
<p>　　</p>
<p>　　<strong taggedby="hylanda">2</strong><strong taggedby="hylanda">、两台服务器</strong></p>
<p>　　用付费服务赚来的钱LJ买了两台服务器：一台叫做Kenny的Dell 6U机器用于提供Web服务，一台叫做Cartman的Dell 6U服务器用于提供数据库服务。 </p>
<p>　　</p>
<p align="center">　　<img src="http://www.360doc.com/DownloadImg/3500/754206_4" taggedby="hylanda"  alt="" /></p>
<p>　　</p>
<p>　　LJ有了更大的磁盘，更多的计算资源。但同时网络结构还是非常简单，每台机器两块网卡，Cartman通过内网为Kenny提供MySQL数据库服务。 </p>
<p>　　暂时解决了负载的问题，新的问题又出现了： </p>
<p>　　原来的一个单点变成了两个单点。 </p>
<p>　　没有冷备份或热备份。 </p>
<p>　　网站速度慢的问题又开始出现了，没办法，增长太快了。 </p>
<p>　　Web服务器上CPU达到上限，需要更多的Web服务器。 </p>
<p>　　<strong taggedby="hylanda">3</strong><strong taggedby="hylanda">、四台服务器</strong></p>
<p>　　又买了两台，Kyle和Stan，这次都是1U的，都用于提供Web服务。目前LJ一共有3台Web服务器和一台数据库服务器。这时需要在3台Web服务器上进行负载均横。 </p>
<p>　　</p>
<p align="center">　　<img src="http://www.360doc.com/DownloadImg/3500/754206_5" taggedby="hylanda"  alt="" /></p>
<p>　　</p>
<p>　　LJ把Kenny用于外部的网关，使用mod_backhand进行负载均横。 </p>
<p>　　然后问题又出现了： </p>
<p>　　单点故障。数据库和用于做网关的Web服务器都是单点，一旦任何一台机器出现问题将导致所有服务不可用。虽然用于做网关的Web服务器可以通过保持心跳同步迅速切换，但还是无法解决数据库的单点，LJ当时也没做这个。 </p>
<p>　　网站又变慢了，这次是因为IO和数据库的问题，问题是怎么往应用里面添加数据库呢？ </p>
<p>　　<strong taggedby="hylanda">4</strong><strong taggedby="hylanda">、五台服务器</strong></p>
<p>　　又买了一台数据库服务器。在两台数据库服务器上使用了数据库同步(Mysql支持的Master-Slave模式)，写操作全部针对主数据库 （通过Binlog，主服务器上的写操作可以迅速同步到从服务器上），读操作在两个数据库上同时进行(也算是负载均横的一种吧)。 </p>
<p>　　</p>
<p align="center">　　<img src="http://www.360doc.com/DownloadImg/3500/754206_6" taggedby="hylanda"  alt="" /></p>
<p>　　</p>
<p>　　实现同步时要注意几个事项： </p>
<p>　　读操作数据库选择算法处理，要选一个当前负载轻一点的数据库。 </p>
<p>　　在从数据库服务器上只能进行读操作 </p>
<p>　　准备好应对同步过程中的延迟，处理不好可能会导致数据库同步的中断。只需要对写操作进行判断即可，读操作不存在同步问题。 </p>
<p>　　<strong taggedby="hylanda">5</strong><strong taggedby="hylanda">、更多服务器</strong></p>
<p>　　有钱了，当然要多买些服务器。部署后快了没多久，又开始慢了。这次有更多的Web服务器，更多的数据库服务器，存在 IO与CPU争用。于是采用了BIG-IP作为负载均衡解决方案。 </p>
<p>　　</p>
<p align="center">　　<img src="http://www.360doc.com/DownloadImg/3500/754206_7" taggedby="hylanda"  alt="" /></p>
<p>　　</p>
<p>　　<strong taggedby="hylanda">6</strong><strong taggedby="hylanda">、现在我们在哪里：</strong></p>
<p>　　</p>
<p align="center">　　<img src="http://www.360doc.com/DownloadImg/3500/754206_8" taggedby="hylanda"  alt="" /></p>
<p>　　</p>
<p>　　现在服务器基本上够了，但性能还是有问题，原因出在架构上。 </p>
<p>　　数据库的架构是最大的问题。由于增加的数据库都是以Slave模式添加到应用内，这样唯一的好处就是将读操作分布到了多台机器，但这样带来的后果就是写操作被大量分发，每台机器都要执行，服务器越多，浪费就越大，随着写操作的增加，用于服务读操作的资源越来越少。 </p>
<p>　　</p>
<p>　　由一台分布到两台 </p>
<p>　　</p>
<p align="center">　　<img src="http://www.360doc.com/DownloadImg/3500/754206_10" taggedby="hylanda"  alt="" /></p>
<p>　　</p>
<p>　　最终效果 </p>
<p>　　现在我们发现，我们并不需要把这些数据在如此多的服务器上都保留一份。服务器上已经做了RAID，数据库也进行了备份，这么多的备份完全是对资源的浪费，属于冗余极端过度。那为什么不把数据分布存储呢？ </p>
<p>　　问题发现了，开始考虑如何解决。现在要做的就是把不同用户的数据分布到不同的服务器上进行存储，以实现数据的分布式存储，<strong>让每台机器只为相对固定的用户服务</strong>，以实现平行的架构和良好的可扩展性。 </p>
<p>　　为了实现用户分组，我们需要为每一个用户分配一个组标记，用于标记此用户的数据存放在哪一组数据库服务器中。每组数据库由一个master及几 个slave组成，并且slave的数量在2-3台，以实现系统资源的最合理分配，既保证数据读操作分布，又避免数据过度冗余以及同步操作对系统资源的过 度消耗。 </p>
<p>　　</p>
<p align="center">　　<img src="http://www.360doc.com/DownloadImg/3500/754206_11" taggedby="hylanda"  alt="" /></p>
<p>　　</p>
<p>　　由一台（一组）中心服务器提供用户分组控制。所有用户的分组信息都存储在这台机器上，所有针对用户的操作需要先查询这台机器得到用户的组号，然后再到相应的数据库组中获取数据。 </p>
<p>　　这样的用户架构与目前LJ的架构已经很相像了。 </p>
<p>　　在具体的实现时需要注意几个问题： </p>
<p>　　在数据库组内不要使用自增ID，以便于以后在数据库组之间迁移用户，以实现更合理的I/O，磁盘空间及负载分布。 </p>
<p>　　将userid，postid存储在全局服务器上，可以使用自增，数据库组中的相应值必须以全局服务器上的值为准。全局服务器上使用事务型数据库InnoDB。 </p>
<p>　　在数据库组之间迁移用户时要万分小心，当迁移时用户不能有写操作。 </p>
<p>　　<strong taggedby="hylanda">7</strong><strong taggedby="hylanda">、现在我们在哪里</strong></p>
<p>　　</p>
<p align="center">　　<img src="http://www.360doc.com/DownloadImg/3500/754206_12" taggedby="hylanda"  alt="" /></p>
<p>　　</p>
<p>　　问题： </p>
<p>　　一个全局主服务器，挂掉的话所有用户注册及写操作就挂掉。 </p>
<p>　　每个数据库组一个主服务器，挂掉的话这组用户的写操作就挂掉。 </p>
<p>　　数据库组从服务器挂掉的话会导致其它服务器负载过大。 </p>
<p>　　对于Master-Slave模式的单点问题，LJ采取了Master-Master模式来解决。所谓Master-Master实际上是人工实现的，并不是由MySQL直接提供的，实际上也就是两台机器同时是Master，也同时是Slave，互相同步。 </p>
<p>　　Master-Master实现时需要注意： </p>
<p>　　一个Master出错后恢复同步，最好由服务器自动完成。 </p>
<p>　　数字分配，由于同时在两台机器上写，有些ID可能会冲突。 </p>
<p>　　解决方案： </p>
<p>　　奇偶数分配ID，一台机器上写奇数，一台机器上写偶数 </p>
<p>　　通过全局服务器进行分配(LJ采用的做法)。 </p>
<p>　　Master-Master模式还有一种用法，这种方法与前一种相比，仍然保持两台机器的同步，但只有一台机器提供服务（读和写），在每天晚上的时候进行轮换，或者出现问题的时候进行切换。 </p>
<p>　　<strong taggedby="hylanda">8</strong><strong taggedby="hylanda">、现在我们在哪里</strong></p>
<p>　　</p>
<p align="center">　　<img src="http://www.360doc.com/DownloadImg/3500/754206_13" taggedby="hylanda"  alt="" /></p>
<p>　　</p>
<p>　　现在插播一条广告，MyISAM VS InnoDB。 </p>
<p>　　使用InnoDB： </p>
<p>　　支持事务 </p>
<p>　　需要做更多的配置，不过值得，可以更安全的存储数据，以及得到更快的速度。 </p>
<p>　　使用MyISAM： </p>
<p>　　记录日志（LJ用它来记网络访问日志） </p>
<p>　　存储只读静态数据，足够快。 </p>
<p>　　并发性很差，无法同时读写数据（添加数据可以） </p>
<p>　　MySQL非正常关闭或死机时会导致索引错误，需要使用myisamchk修复，而且当访问量大时出现非常频繁。 </p>
<p>　　<strong taggedby="hylanda">9</strong><strong taggedby="hylanda">、缓存</strong></p>
<p>　　去年我写过一篇文章介绍memcached，它就是由LJ的团队开发的一款缓存工具，以key-value的方式将数据存储到分布的内存中。LJ缓存的数据： </p>
<p>　　12台独立服务器（不是捐赠的） </p>
<p>　　28个实例 </p>
<p>　　30GB总容量 </p>
<p>　　90-93%的命中率（用过squid的人可能知道，squid内存加磁盘的命中率大概在70-80%） </p>
<p>　　如何建立缓存策略？ </p>
<p>　　想缓存所有的东西？那是不可能的，我们只需要缓存已经或者可能导致系统瓶颈的地方，最大程度的提交系统运行效率。通过对MySQL的日志的分析我们可以找到缓存的对象。 </p>
<p>　　缓存的缺点？ </p>
<p>　　没有完美的事物，缓存也有缺点： </p>
<p>　　增大开发量，需要针对缓存处理编写特殊的代码。 </p>
<p>　　管理难度增加，需要更多人参与系统维护。 </p>
<p>　　当然大内存也需要钱。 </p>
<p>　　<strong taggedby="hylanda">10</strong><strong taggedby="hylanda">、Web</strong><strong taggedby="hylanda">访问负载均衡</strong></p>
<p>　　在数据包级别使用BIG-IP，但BIG-IP并不知道我们内部的处理机制，无法判断由哪台服务器对这些请求进行处理。反向代理并不能很好的起到作用，不是已经够快了，就是达不到我们想要的效果。 </p>
<p>　　所以，LJ又开发了Perlbal。特点： </p>
<p>　　快，小，可管理的http web 服务器/代理 </p>
<p>　　可以在内部进行转发 </p>
<p>　　使用Perl开发 </p>
<p>　　单线程，异步，基于事件，使用epoll , kqueue </p>
<p>　　支持Console管理与http远程管理，支持动态配置加载 </p>
<p>　　多种模式：web服务器，反向代理，插件 </p>
<p>　　支持插件：GIF/PNG互换？ </p>
<p>　　<strong taggedby="hylanda">11</strong><strong taggedby="hylanda">、MogileFS</strong></p>
<p>　　LJ使用开源的MogileFS作为分布式文件存储系统。MogileFS使用非常简单，它的主要设计思想是： </p>
<p>　　文件属于类（类是最小的复制单位） </p>
<p>　　跟踪文件存储位置 </p>
<p>　　在不同主机上存储 </p>
<p>　　使用MySQL集群统一存储分布信息 </p>
<p>　　大容易廉价磁盘 </p>
<p>　　到目前为止就这么多了，更多文档可以在http://www.danga.com/words/找到。Danga.com和 LiveJournal.com的同学们拿这个文档参加了两次MySQL Con，两次OS Con，以及众多的其它会议，无私的把他们的经验分享出来，值得我们学习。在web2.0时代快速开发得到大家越来越多的重视，但良好的设计仍是每一个应 用的基础，希望web2.0们在成长为Top500网站的路上，不要因为架构阻碍了网站的发展。 </p>
<p>　　<strong taggedby="hylanda">八、</strong><strong taggedby="hylanda">说说大型高并发高负载网站的系统架构</strong></p>
<p>　　<strong>我在Cernet做过拨号接入平台的搭建，而后在Yahoo3721负载搜索引擎前端平台开发，又在猫扑处理过大型社区猫扑大杂烩的架构升级等 工作，同时自己接触和开发过不少大中型网站的模块，因此在大型网站应对高负载和并发的解决方案上有一些积累和经验(<font color="#ff6600">HOHO..nb man</font> )</strong>，可以和大家一起探讨一下。 </p>
<p>　　一个小型的网站，比如个人网站，可以使用最简单的html静态页面就实现了，配合一些图片达到美化效果，所有的页面均存放在一个目录下，这样的 网站对系统架构、性能的要求都很简单，随着互联网业务的不断丰富，网站相关的技术经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所 采用的技术更是涉及面非常广，从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求，已经不是原来简单的html静态 网站所能比拟的。 </p>
<p>　　大型网站，比如门户网站。在面对大量用户访问、高并发请求方面，基本的解决方案集中在这样几个环节：<strong>使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。</strong>但是除了这几个方面，还没法根本解决大型网站面临的高负载和高并发问题。 </p>
<p>　　上面提供的几个解决思路在一定程度上也意味着更大的投入，并且这样的解决思路具备瓶颈，没有很好的扩展性，下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。 </p>
<p>　　1、HTML静态化 </p>
<p>　　其实大家都知道，<strong>效率最高、消耗最小的就是纯静态化的html页面</strong>，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法 其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，<strong>于是出现了我们常见的信息发布系统CMS</strong>，像我们常访问的各个 门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管 理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。 </p>
<p>　　除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。 </p>
<p>　　同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现， 比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以 考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。 </p>
<p>　　2、图片服务器分离 </p>
<p>　　大家知道，<strong>对于Web服务器来说，不管是Apache、IIS还是其他容器，图片是最消耗资源的</strong>，于是我们有必要将图片与页面进行分离，这是基 本上大型网站都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统 不会因为图片问题而崩溃，在应用服务器和图片服务器上，可以进行不同的配置优化，比如<strong>apache在配置ContentType的时候可以尽量少支持，尽 可能少的LoadModule</strong>，保证更高的系统消耗和执行效率。 </p>
<p>　　3、数据库集群和库表散列 </p>
<p>　　大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。 </p>
<p>　　在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的MySQL提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。 </p>
<p>　　上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，<strong>库表散列 是常用并且最有效的解决方案</strong>。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，<strong>不同的模块对应不同的数据库或者表</strong>，再按照一定的策略对某个 页面或者功能进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用 了这样的架构，<strong>将论坛的用户、设置、帖子等信息进行数据库分离</strong>，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置 便能让系统随时增加一台低成本的数据库进来补充系统性能。 </p>
<p>　　4、缓存 </p>
<p>　　缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。 </p>
<p>　　架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块，也可以使用外加的Squid模块进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。 </p>
<p>　　网站程序开发方面的缓存，Linux上提供的Memory Cache是常用的缓存接口，可以在web开发中使用，比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享，一些大 型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，PHP有Pear的Cache模块，Java就更多 了，.net不是很熟悉，相信也肯定有。 </p>
<p>　　5、镜像 </p>
<p>　　镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如ChinaNet和 EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现 成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如Linux上的rsync等工具。 </p>
<p>　　6、负载均衡 </p>
<p>　　负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。 </p>
<p>　　负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。 </p>
<p>　　硬件四层交换 </p>
<p>　　第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换 功能就象是虚IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础 上，需要复杂的载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和 UDP端口共同决定。 </p>
<p>　　在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。 </p>
<p>　　软件四层交换 </p>
<p>　　大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。 </p>
<p>　　软件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux Virtual Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满 足多种应用需求，这对于分布式的系统来说必不可少。 </p>
<p>　　一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的 架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。 </p>
<p>对于大型网站来说，前面提到的每个方法可能都会被同时使用到，我这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。</p>
<img src ="http://www.blogjava.net/void241/aggbug/291179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2009-08-14 16:23 <a href="http://www.blogjava.net/void241/archive/2009/08/14/291179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lvs -&gt; squid - &gt; nginx -&gt; app server -&gt; db</title><link>http://www.blogjava.net/void241/archive/2009/06/22/283651.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Mon, 22 Jun 2009 14:08:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2009/06/22/283651.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/283651.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2009/06/22/283651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/283651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/283651.html</trackback:ping><description><![CDATA[<img height="644" alt="" src="http://www.blogjava.net/images/blogjava_net/void241/917c1459dee9e0ff9d820451.png" width="549" border="0" />
<img src ="http://www.blogjava.net/void241/aggbug/283651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2009-06-22 22:08 <a href="http://www.blogjava.net/void241/archive/2009/06/22/283651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网站架构（页面静态化，图片服务器分离,负载均衡）方案全解析</title><link>http://www.blogjava.net/void241/archive/2009/04/17/266223.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Fri, 17 Apr 2009 13:04:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2009/04/17/266223.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/266223.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2009/04/17/266223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/266223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/266223.html</trackback:ping><description><![CDATA[<p><font size="3">1、HTML静态化其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统CMS，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。 </font></p>
<p><font size="3">2、图片服务器分离大家知道，对于Web服务器来说，不管是Apache、IIS还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃，在应用服务器和图片服务器上，可以进行不同的配置优化，比如apache在配置ContentType的时候可以尽量少支持，尽可能少的LoadModule，保证更高的系统消耗和执行效率。 <br />
<br />
3、数据库集群和库表散列大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的MySQL提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。 <br />
<br />
4、缓存缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块，也可以使用外加的Squid模块进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。网站程序开发方面的缓存，Linux上提供的Memory Cache是常用的缓存接口，可以在web开发中使用，比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享，一些大型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，PHP有Pear的Cache模块，Java就更多了，.net不是很熟悉，相信也肯定有。 <br />
<br />
5、镜像镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如Linux上的rsync等工具。 <br />
6、负载均衡负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。 <br />
<br />
7、硬件四层交换第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚 IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上，需要复杂的载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了 <br />
<br />
。8、软件四层交换大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。软件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux Virtual Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满足多种应用需求，这对于分布式的系统来说必不可少。一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。对于大型网站来说，前面提到的每个方法可能都会被同时使用到，我这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。 <br />
<br />
<br />
用squid做web cache server，而apache在squid的后面提供真正的web服务。当然使用这样的架构必须要保证主页上大部分都是静态页面。这就需要程序员的配合将页面在反馈给客户端之前将页面全部转换成静态页面。 <br />
基本看出sina和sohu对于频道等栏目都用了相同的技术，即squid来监听这些IP的80端口，而真正的web server来监听另外一个端口。从用户的感觉上来说不会有任何的区别，而相对于将web server直接和客户端连在一起的方式，这样的方式明显的节省的带宽和服务器。用户访问的速度感觉也会更快。 </font></p>
<p>&nbsp;</p>
<p><a href="http://www.dbanotes.net/arch/yupoo_arch.html" target="_blank"><font color="#2f5fa1" size="3">http://www.dbanotes.net/arch/yupoo_arch.html</font></a><font size="3"> <br />
<br />
带宽：4000M/S (参考) <br />
服务器数量：60 台左右 <br />
Web服务器：Lighttpd, Apache, nginx <br />
应用服务器：Tomcat <br />
其他：Python, Java, MogileFS 、ImageMagick 等 <br />
<br />
关于 Squid 与 Tomcat <br />
<br />
Squid 与 Tomcat 似乎在 Web 2.0 站点的架构中较少看到。我首先是对 Squid 有点疑问，对此阿华的解释是"目前暂时还没找到效率比 Squid 高的缓存系统，原来命中率的确很差，后来在 Squid 前又装了层 Lighttpd, 基于 url 做 hash, 同一个图片始终会到同一台 squid 去，所以命中率彻底提高了" <br />
<br />
对于应用服务器层的 Tomcat，现在 Yupoo! 技术人员也在逐渐用其他轻量级的东西替代，而 YPWS/YPFS 现在已经用 Python 进行开发了。 <br />
<br />
名次解释： <br />
<br />
&#183; YPWS--Yupoo Web Server YPWS 是用 Python开发的一个小型 Web 服务器，提供基本的 Web 服务外，可以增加针对用户、图片、外链网站显示的逻辑判断，可以安装于任何有空闲资源的服务器中，遇到性能瓶颈时方便横向扩展。 <br />
<br />
&#183; YPFS--Yupoo File System 与 YPWS 类似，YPFS 也是基于这个 Web 服务器上开发的图片上传服务器。 <br />
<br />
<br />
【Updated: 有网友留言质疑 Python 的效率，Yupoo 老大刘平阳在 del.icio.us 上写到 "YPWS用Python自己写的，每台机器每秒可以处理294个请求, 现在压力几乎都在10％以下"】 <br />
<br />
图片处理层 <br />
<br />
接下来的 Image Process Server 负责处理用户上传的图片。使用的软件包也是 ImageMagick，在上次存储升级的同时，对于锐化的比率也调整过了(我个人感觉，效果的确好了很多)。&#8221;Magickd&#8220; 是图像处理的一个远程接口服务，可以安装在任何有空闲 CPU资源的机器上，类似 Memcached的服务方式。 <br />
<br />
我们知道 Flickr 的缩略图功能原来是用 ImageMagick 软件包的，后来被雅虎收购后出于版权原因而不用了（?）；EXIF 与 IPTC Flicke 是用 Perl 抽取的，我是非常建议 Yupoo! 针对 EXIF 做些文章，这也是潜在产生受益的一个重点。 <br />
<br />
图片存储层 <br />
<br />
原来 Yupoo! 的存储采用了磁盘阵列柜，基于 NFS 方式的，随着数据量的增大，&#8221;Yupoo! 开发部从07年6月份就开始着手研究一套大容量的、能满足 Yupoo! 今后发展需要的、安全可靠的存储系统&#8220;，看来 Yupoo! 系统比较有信心，也是满怀期待的，毕竟这要支撑以 TB 计算的海量图片的存储和管理。我们知道，一张图片除了原图外，还有不同尺寸的，这些图片统一存储在 MogileFS 中。 <br />
<br />
对于其他部分，常见的 Web 2.0 网站必须软件都能看到，如 MySQL、Memcached 、Lighttpd 等。Yupoo! 一方面采用不少相对比较成熟的开源软件，一方面也在自行开发定制适合自己的架构组件。这也是一个 Web 2.0 公司所必需要走的一个途径。 <br />
<br />
非常感谢一下 Yupoo! 阿华对于技术信息的分享，技术是共通的。下一个能爆料是哪家? <br />
<br />
--EOF-- <br />
<br />
lighttpd+squid这套缓存是放在另外一个机房作为cdn的一个节点使用的，图中没描绘清楚，给大家带来不便了。 <br />
squid前端用lighttpd没用nginx，主要是用了这么久，没出啥大问题，所以就没想其他的了。 <br />
URL Hash的扩展性的确不好，能做的就是不轻易去增减服务器，我们目前是5台服务器做一组hash. <br />
<br />
我们现在用Python写的Web Server，在效率方面，我可以给个测试数据，根据目前的访问日志模拟访问测试的结果是1台ypws,平均每秒处理294个请求(加载所有的逻辑判断)。 <br />
在可靠性上，还不没具体的数据，目前运行1个多月还没有任何异常。 <br />
<br />
lvs每个节点上都装nginx，主要是为了反向代理及处理静态内容，不过apache已显得不是那么必需，准备逐渐去掉。 <br />
<br />
我们处理图片都是即时的，我们目前半数以上的服务器都装了magickd服务，用来分担图片处理请求。 <br />
<br />
<br />
<br />
</font><a href="http://www.dbanotes.net/review/tailrank_arch.html" target="_blank"><font color="#2f5fa1" size="3">http://www.dbanotes.net/review/tailrank_arch.html</font></a><font size="3"> <br />
<br />
每天数以千万计的 Blog 内容中，实时的热点是什么? Tailrank 这个 Web 2.0 Startup 致力于回答这个问题。 <br />
<br />
专门爆料网站架构的 Todd Hoff 对 Kevin Burton 进行了采访。于是我们能了解一下 Tailrank 架构的一些信息。每小时索引 2400 万的 Blog 与 Feed，内容处理能力为 160-200Mbps，IO 写入大约在10-15MBps。每个月要处理 52T 之多的原始数据。Tailrank 所用的爬虫现在已经成为一个独立产品：spinn3r。 <br />
<br />
服务器硬件 <br />
<br />
目前大约 15 台服务器，CPU 是 64 位的 Opteron。每台主机上挂两个 SATA 盘，做 RAID 0。据我所知，国内很多 Web 2.0 公司也用的是类似的方式，SATA 盘容量达，低廉价格，堪称不二之选。操作系统用的是 Debian Linux 。Web 服务器用 Apache 2.0，Squid 做反向代理服务器。 <br />
<br />
数据库 <br />
<br />
Tailrank 用 MySQL 数据库，联邦数据库形式。存储引擎用 InnoDB， 数据量 500GB。Kevin Burton 也指出了 MySQL 5 在修了一些 多核模式下互斥锁的问题(This Bug?)。到数据库的JDBC 驱动连接池用 lbpool 做负载均衡。MySQL Slave 或者 Master的复制用 MySQLSlaveSync 来轻松完成。不过即使这样，还要花费 20％ 的时间来折腾 DB。 <br />
<br />
其他开放的软件 <br />
<br />
任何一套系统都离不开合适的 Profiling 工具，Tailrank 也不利外，针对 Java 程序的 Benchmark 用 Benchmark4j。Log 工具用 Log5j(不是 Log4j)。Tailrank 所用的大部分工具都是开放的。 <br />
<br />
Tailrank 的一个比较大的竞争对手是 Techmeme，虽然二者暂时看面向内容的侧重点有所不同。其实，最大的对手还是自己，当需要挖掘的信息量越来越大，如果精准并及时的呈现给用户内容的成本会越来越高。从现在来看，Tailrank 离预期目标还差的很远。期待罗马早日建成<br />
</font></p>
<p><font size="3">YouTube架构学习 <br />
<br />
关键字: YouTube <br />
<br />
原文: YouTube Architecture <br />
<br />
YouTube发展迅速，每天超过1亿的视频点击量，但只有很少人在维护站点和确保伸缩性。 <br />
<br />
平台 <br />
Apache <br />
Python <br />
Linux(SuSe) <br />
MySQL <br />
psyco，一个动态的Python到C的编译器 <br />
lighttpd代替Apache做视频查看 <br />
<br />
状态 <br />
支持每天超过1亿的视频点击量 <br />
成立于2005年2月 <br />
于2006年3月达到每天3千万的视频点击量 <br />
于2006年7月达到每天1亿的视频点击量 <br />
2个系统管理员，2个伸缩性软件架构师 <br />
2个软件开发工程师，2个网络工程师，1个DBA <br />
<br />
处理飞速增长的流量 <br />
<br />
Java代码 <br />
<br />
1. while (true) <br />
<br />
2. { <br />
<br />
3. identify_and_fix_bottlenecks(); <br />
<br />
4. drink(); <br />
<br />
5. sleep(); <br />
<br />
6. notice_new_bottleneck(); <br />
<br />
7. } <br />
<br />
while (true) <br />
<br />
{ <br />
<br />
identify_and_fix_bottlenecks(); <br />
<br />
drink(); <br />
<br />
sleep(); <br />
<br />
notice_new_bottleneck(); <br />
<br />
} <br />
<br />
<br />
每天运行该循环多次 <br />
<br />
Web服务器 <br />
1，NetScaler用于负载均衡和静态内容缓存 <br />
2，使用mod_fast_cgi运行Apache <br />
3，使用一个Python应用服务器来处理请求的路由 <br />
4，应用服务器与多个数据库和其他信息源交互来获取数据和格式化html页面 <br />
5，一般可以通过添加更多的机器来在Web层提高伸缩性 <br />
6，Python的Web层代码通常不是性能瓶颈，大部分时间阻塞在RPC <br />
7，Python允许快速而灵活的开发和部署 <br />
8，通常每个页面服务少于100毫秒的时间 <br />
9，使用psyco(一个类似于JIT编译器的动态的Python到C的编译器)来优化内部循环 <br />
10，对于像加密等密集型CPU活动，使用C扩展 <br />
11，对于一些开销昂贵的块使用预先生成并缓存的html <br />
12，数据库里使用行级缓存 <br />
13，缓存完整的Python对象 <br />
14，有些数据被计算出来并发送给各个程序，所以这些值缓存在本地内存中。这是个使用不当的策略。应用服务器里最快的缓存将预先计算的值发送给所有服务器也花不了多少时间。只需弄一个代理来监听更改，预计算，然后发送。 <br />
<br />
视频服务 <br />
1，花费包括带宽，硬件和能源消耗 <br />
2，每个视频由一个迷你集群来host，每个视频被超过一台机器持有 <br />
3，使用一个集群意味着： <br />
-更多的硬盘来持有内容意味着更快的速度 <br />
-failover。如果一台机器出故障了，另外的机器可以继续服务 <br />
-在线备份 <br />
4，使用lighttpd作为Web服务器来提供视频服务： <br />
-Apache开销太大 <br />
-使用epoll来等待多个fds <br />
-从单进程配置转变为多进程配置来处理更多的连接 <br />
5，大部分流行的内容移到CDN： <br />
-CDN在多个地方备份内容，这样内容离用户更近的机会就会更高 <br />
-CDN机器经常内存不足，因为内容太流行以致很少有内容进出内存的颠簸 <br />
6，不太流行的内容(每天1-20浏览次数)在许多colo站点使用YouTube服务器 <br />
-长尾效应。一个视频可以有多个播放，但是许多视频正在播放。随机硬盘块被访问 <br />
-在这种情况下缓存不会很好，所以花钱在更多的缓存上可能没太大意义。 <br />
-调节RAID控制并注意其他低级问题 <br />
-调节每台机器上的内存，不要太多也不要太少 <br />
<br />
视频服务关键点 <br />
1，保持简单和廉价 <br />
2，保持简单网络路径，在内容和用户间不要有太多设备 <br />
3，使用常用硬件，昂贵的硬件很难找到帮助文档 <br />
4，使用简单而常见的工具，使用构建在Linux里或之上的大部分工具 <br />
5，很好的处理随机查找(SATA，tweaks) <br />
<br />
缩略图服务 <br />
1，做到高效令人惊奇的难 <br />
2，每个视频大概4张缩略图，所以缩略图比视频多很多 <br />
3，缩略图仅仅host在几个机器上 <br />
4，持有一些小东西所遇到的问题： <br />
-OS级别的大量的硬盘查找和inode和页面缓存问题 <br />
-单目录文件限制，特别是Ext3，后来移到多分层的结构。内核2.6的最近改进可能让Ext3允许大目录，但在一个文件系统里存储大量文件不是个好主意 <br />
-每秒大量的请求，因为Web页面可能在页面上显示60个缩略图 <br />
-在这种高负载下Apache表现的非常糟糕 <br />
-在Apache前端使用squid，这种方式工作了一段时间，但是由于负载继续增加而以失败告终。它让每秒300个请求变为20个 <br />
-尝试使用lighttpd但是由于使用单线程它陷于困境。遇到多进程的问题，因为它们各自保持自己单独的缓存 <br />
-如此多的图片以致一台新机器只能接管24小时 <br />
-重启机器需要6-10小时来缓存 <br />
5，为了解决所有这些问题YouTube开始使用Google的BigTable，一个分布式数据存储： <br />
-避免小文件问题，因为它将文件收集到一起 <br />
-快，错误容忍 <br />
-更低的延迟，因为它使用分布式多级缓存，该缓存与多个不同collocation站点工作 <br />
-更多信息参考Google Architecture，GoogleTalk Architecture和BigTable <br />
<br />
数据库 <br />
1，早期 <br />
-使用MySQL来存储元数据，如用户，tags和描述 <br />
-使用一整个10硬盘的RAID 10来存储数据 <br />
-依赖于信用卡所以YouTube租用硬件 <br />
-YouTube经过一个常见的革命：单服务器，然后单master和多read slaves，然后数据库分区，然后sharding方式 <br />
-痛苦与备份延迟。master数据库是多线程的并且运行在一个大机器上所以它可以处理许多工作，slaves是单线程的并且通常运行在小一些的服务器上并且备份是异步的，所以slaves会远远落后于master <br />
-更新引起缓存失效，硬盘的慢I/O导致慢备份 <br />
-使用备份架构需要花费大量的money来获得增加的写性能 <br />
-YouTube的一个解决方案是通过把数据分成两个集群来将传输分出优先次序：一个视频查看池和一个一般的集群 <br />
2，后期 <br />
-数据库分区 <br />
-分成shards，不同的用户指定到不同的shards <br />
-扩散读写 <br />
-更好的缓存位置意味着更少的IO <br />
-导致硬件减少30% <br />
-备份延迟降低到0 <br />
-现在可以任意提升数据库的伸缩性 <br />
<br />
数据中心策略 <br />
1，依赖于信用卡，所以最初只能使用受管主机提供商 <br />
2，受管主机提供商不能提供伸缩性，不能控制硬件或使用良好的网络协议 <br />
3，YouTube改为使用colocation arrangement。现在YouTube可以自定义所有东西并且协定自己的契约 <br />
4，使用5到6个数据中心加CDN <br />
5，视频来自任意的数据中心，不是最近的匹配或其他什么。如果一个视频足够流行则移到CDN <br />
6，依赖于视频带宽而不是真正的延迟。可以来自任何colo <br />
7，图片延迟很严重，特别是当一个页面有60张图片时 <br />
8，使用BigTable将图片备份到不同的数据中心，代码查看谁是最近的 <br />
<br />
学到的东西 <br />
1，Stall for time。创造性和风险性的技巧让你在短期内解决问题而同时你会发现长期的解决方案 <br />
2，Proioritize。找出你的服务中核心的东西并对你的资源分出优先级别 <br />
3，Pick your battles。别怕将你的核心服务分出去。YouTube使用CDN来分布它们最流行的内容。创建自己的网络将花费太多时间和太多money <br />
4，Keep it simple！简单允许你更快的重新架构来回应问题 <br />
5，Shard。Sharding帮助隔离存储，CPU，内存和IO，不仅仅是获得更多的写性能 <br />
6，Constant iteration on bottlenecks： <br />
-软件：DB，缓存 <br />
-OS：硬盘I/O <br />
-硬件：内存，RAID <br />
7，You succeed as a team。拥有一个跨越条律的了解整个系统并知道系统内部是什么样的团队，如安装打印机，安装机器，安装网络等等的人。With a good team all things are possible。<br />
<br />
</font><a href="http://hideto.javaeye.com/blog/130815" target="_blank"><font color="#2f5fa1" size="3">http://hideto.javaeye.com/blog/130815</font></a><font size="3"> <br />
<br />
Google架构学习 <br />
<br />
关键字: Google <br />
<br />
原文：Google Architecture <br />
<br />
Google是伸缩性的王者。Google一直的目标就是构建高性能高伸缩性的基础组织来支持它们的产品。 <br />
<br />
平台 <br />
Linux <br />
大量语言：Python，Java，C++ <br />
<br />
状态 <br />
在2006年大约有450,000台廉价服务器 <br />
在2005年Google索引了80亿Web页面，现在没有人知道数目 <br />
目前在Google有超过200个GFS集群。一个集群可以有1000或者甚至5000台机器。成千上万的机器从运行着5000000000000000字节存储的GFS集群获取数据，集群总的读写吞吐量可以达到每秒40兆字节 <br />
目前在Google有6000个MapReduce程序，而且每个月都写成百个新程序 <br />
BigTable伸缩存储几十亿的URL，几百千千兆的卫星图片和几亿用户的参数选择 <br />
<br />
堆栈 <br />
Google形象化它们的基础组织为三层架构： <br />
1，产品：搜索，广告，email，地图，视频，聊天，博客 <br />
2，分布式系统基础组织：GFS，MapReduce和BigTable <br />
3，计算平台：一群不同的数据中心里的机器 <br />
4，确保公司里的人们部署起来开销很小 <br />
5，花费更多的钱在避免丢失日志数据的硬件上，其他类型的数据则花费较少 <br />
<br />
可信赖的存储机制GFS(Google File System) <br />
1，可信赖的伸缩性存储是任何程序的核心需求。GFS就是Google的核心存储平台 <br />
2，Google File System - 大型分布式结构化日志文件系统，Google在里面扔了大量的数据 <br />
3，为什么构建GFS而不是利用已有的东西？因为可以自己控制一切并且这个平台与别的不一样，Google需要： <br />
-跨数据中心的高可靠性 <br />
-成千上万的网络节点的伸缩性 <br />
-大读写带宽的需求 <br />
-支持大块的数据，可能为上千兆字节 <br />
-高效的跨节点操作分发来减少瓶颈 <br />
4，系统有Master和Chunk服务器 <br />
-Master服务器在不同的数据文件里保持元数据。数据以64MB为单位存储在文件系统中。客户端与Master服务器交流来在文件上做元数据操作并且找到包含用户需要数据的那些Chunk服务器 <br />
-Chunk服务器在硬盘上存储实际数据。每个Chunk服务器跨越3个不同的Chunk服务器备份以创建冗余来避免服务器崩溃。一旦被Master服务器指明，客户端程序就会直接从Chunk服务器读取文件 <br />
6，一个上线的新程序可以使用已有的GFS集群或者可以制作自己的GFS集群 <br />
7，关键点在于有足够的基础组织来让人们对自己的程序有所选择，GFS可以调整来适应个别程序的需求 <br />
<br />
使用MapReduce来处理数据 <br />
1，现在你已经有了一个很好的存储系统，你该怎样处理如此多的数据呢？比如你有许多TB的数据存储在1000台机器上。数据库不能伸缩或者伸缩到这种级别花费极大，这就是MapReduce出现的原因 <br />
2，MapReduce是一个处理和生成大量数据集的编程模型和相关实现。用户指定一个map方法来处理一个键/值对来生成一个中间的键/值对，还有一个reduce方法来合并所有关联到同样的中间键的中间值。许多真实世界的任务都可以使用这种模型来表现。以这种风格来写的程序会自动并行的在一个大量机器的集群里运行。运行时系统照顾输入数据划分、程序在机器集之间执行的调度、机器失败处理和必需的内部机器交流等细节。这允许程序员没有多少并行和分布式系统的经验就可以很容易使用一个大型分布式系统资源 <br />
3，为什么使用MapReduce？ <br />
-跨越大量机器分割任务的好方式 <br />
-处理机器失败 <br />
-可以与不同类型的程序工作，例如搜索和广告。几乎任何程序都有map和reduce类型的操作。你可以预先计算有用的数据、查询字数统计、对TB的数据排序等等 <br />
4，MapReduce系统有三种不同类型的服务器 <br />
-Master服务器分配用户任务到Map和Reduce服务器。它也跟踪任务的状态 <br />
-Map服务器接收用户输入并在其基础上处理map操作。结果写入中间文件 <br />
-Reduce服务器接收Map服务器产生的中间文件并在其基础上处理reduce操作 <br />
5，例如，你想在所有Web页面里的字数。你将存储在GFS里的所有页面抛入MapReduce。这将在成千上万台机器上同时进行并且所有的调整、工作调度、失败处理和数据传输将自动完成 <br />
-步骤类似于：GFS -&gt; Map -&gt; Shuffle -&gt; Reduction -&gt; Store Results back into GFS <br />
-在MapReduce里一个map操作将一些数据映射到另一个中，产生一个键值对，在我们的例子里就是字和字数 <br />
-Shuffling操作聚集键类型 <br />
-Reduction操作计算所有键值对的综合并产生最终的结果 <br />
6，Google索引操作管道有大约20个不同的map和reduction。 <br />
7，程序可以非常小，如20到50行代码 <br />
8，一个问题是掉队者。掉队者是一个比其他程序慢的计算，它阻塞了其他程序。掉队者可能因为缓慢的IO或者临时的CPU不能使用而发生。解决方案是运行多个同样的计算并且当一个完成后杀死所有其他的 <br />
9，数据在Map和Reduce服务器之间传输时被压缩了。这可以节省带宽和I/O。 <br />
<br />
在BigTable里存储结构化数据 <br />
1，BigTable是一个大伸缩性、错误容忍、自管理的系统，它包含千千兆的内存和1000000000000000的存储。它可以每秒钟处理百万的读写 <br />
2，BigTable是一个构建于GFS之上的分布式哈希机制。它不是关系型数据库。它不支持join或者SQL类型查询 <br />
3，它提供查询机制来通过键访问结构化数据。GFS存储存储不透明的数据而许多程序需求有结构化数据 <br />
4，商业数据库不能达到这种级别的伸缩性并且不能在成千上万台机器上工作 <br />
5，通过控制它们自己的低级存储系统Google得到更多的控制权来改进它们的系统。例如，如果它们想让跨数据中心的操作更简单这个特性，它们可以内建它 <br />
6，系统运行时机器可以自由的增删而整个系统保持工作 <br />
7，每个数据条目存储在一个格子里，它可以通过一个行key和列key或者时间戳来访问 <br />
8，每一行存储在一个或多个tablet中。一个tablet是一个64KB块的数据序列并且格式为SSTable <br />
9，BigTable有三种类型的服务器： <br />
-Master服务器分配tablet服务器，它跟踪tablet在哪里并且如果需要则重新分配任务 <br />
-Tablet服务器为tablet处理读写请求。当tablet超过大小限制(通常是100MB-200MB)时它们拆开tablet。当一个Tablet服务器失败时，则100个Tablet服务器各自挑选一个新的tablet然后系统恢复。 <br />
-Lock服务器形成一个分布式锁服务。像打开一个tablet来写、Master调整和访问控制检查等都需要互斥 <br />
10，一个locality组可以用来在物理上将相关的数据存储在一起来得到更好的locality选择 <br />
11，tablet尽可能的缓存在RAM里 <br />
<br />
硬件 <br />
1，当你有很多机器时你怎样组织它们来使得使用和花费有效？ <br />
2，使用非常廉价的硬件 <br />
3，A 1,000-fold computer power increase can be had for a 33 times lower cost if you you use a failure-prone infrastructure rather than an infrastructure built on highly reliable components. You must build reliability on top of unreliability for this strategy to work. <br />
4，Linux，in-house rack design，PC主板，低端存储 <br />
5，Price per wattage on performance basis isn't getting better. Have huge power and cooling issues <br />
6，使用一些collocation和Google自己的数据中心 <br />
<br />
其他 <br />
1，迅速更改而不是等待QA <br />
2，库是构建程序的卓越方式 <br />
3，一些程序作为服务提供 <br />
4，一个基础组织处理程序的版本，这样它们可以发布而不用害怕会破坏什么东西 <br />
<br />
Google将来的方向 <br />
1，支持地理位置分布的集群 <br />
2，为所有数据创建一个单独的全局名字空间。当前的数据由集群分离 <br />
3，更多和更好的自动化数据迁移和计算 <br />
4，解决当使用网络划分来做广阔区域的备份时的一致性问题(例如保持服务即使一个集群离线维护或由于一些损耗问题) <br />
<br />
学到的东西 <br />
1，基础组织是有竞争性的优势。特别是对Google而言。Google可以很快很廉价的推出新服务，并且伸缩性其他人很难达到。许多公司采取完全不同的方式。许多公司认为基础组织开销太大。Google认为自己是一个系统工程公司，这是一个新的看待软件构建的方式 <br />
2，跨越多个数据中心仍然是一个未解决的问题。大部分网站都是一个或者最多两个数据中心。我们不得不承认怎样在一些数据中心之间完整的分布网站是很需要技巧的 <br />
3，如果你自己没有时间从零开始重新构建所有这些基础组织你可以看看Hadoop。Hadoop是这里很多同样的主意的一个开源实现 <br />
4，平台的一个优点是初级开发人员可以在平台的基础上快速并且放心的创建健全的程序。如果每个项目都需要发明同样的分布式基础组织的轮子，那么你将陷入困境因为知道怎样完成这项工作的人相对较少 <br />
5，协同工作不一直是掷骰子。通过让系统中的所有部分一起工作则一个部分的改进将帮助所有的部分。改进文件系统则每个人从中受益而且是透明的。如果每个项目使用不同的文件系统则在整个堆栈中享受不到持续增加的改进 <br />
6，构建自管理系统让你没必要让系统关机。这允许你更容易在服务器之间平衡资源、动态添加更大的容量、让机器离线和优雅的处理升级 <br />
7，创建可进化的基础组织，并行的执行消耗时间的操作并采取较好的方案 <br />
8，不要忽略学院。学院有许多没有转变为产品的好主意。Most of what Google has done has prior art, just not prior large scale deployment. <br />
9，考虑压缩。当你有许多CPU而IO有限时压缩是一个好的选择。 <br />
<br />
<br />
<br />
</font><a href="http://blog.daviesliu.net/2006/09/09/010620/" target="_blank"><font color="#2f5fa1" size="3">http://blog.daviesliu.net/2006/09/09/010620/</font></a><font size="3"> <br />
<br />
Lighttpd+Squid+Apache搭建高效率Web服务器 <br />
<br />
架构原理 <br />
<br />
Apache通常是开源界的首选Web服务器，因为它的强大和可靠，已经具有了品牌效应，可以适用于绝大部分的应用场合。但是它的强大有时候却显得笨重，配置文件得让人望而生畏，高并发情况下效率不太高。而轻量级的Web服务器Lighttpd却是后起之秀，其静态文件的响应能力远高于Apache，据说是Apache的2-3倍。Lighttpd的高性能和易用性，足以打动我们，在它能够胜任的领域，尽量用它。Lighttpd对PHP的支持也很好，还可以通过Fastcgi方式支持其他的语言，比如Python。 <br />
<br />
毕竟Lighttpd是轻量级的服务器，功能上不能跟Apache比，某些应用无法胜任。比如Lighttpd还不支持缓存，而现在的绝大部分站点都是用程序生成动态内容，没有缓存的话即使程序的效率再高也很难满足大访问量的需求，而且让程序不停的去做同一件事情也实在没有意义。首先，Web程序是需要做缓存处理的，即把反复使用的数据做缓存。即使这样也还不够，单单是启动Web处理程序的代价就不少，缓存最后生成的静态页面是必不可少的。而做这个是 Squid的强项，它本是做代理的，支持高效的缓存，可以用来给站点做反向代理加速。把Squid放在Apache或者Lighttpd的前端来缓存 Web服务器生成的动态内容，而Web应用程序只需要适当地设置页面实效时间即可。 <br />
<br />
即使是大部分内容动态生成的网站，仍免不了会有一些静态元素，比如图片、JS脚本、CSS等等，将Squid放在Apache或者Lighttp前端后，反而会使性能下降，毕竟处理HTTP请求是Web服务器的强项。而且已经存在于文件系统中的静态内容再在Squid中缓存一下，浪费内存和硬盘空间。因此可以考虑将Lighttpd再放在Squid的前面，构成 Lighttpd+Squid+Apache的一条处理链，Lighttpd在最前面，专门用来处理静态内容的请求，把动态内容请求通过proxy模块转发给Squid，如果Squid中有该请求的内容且没有过期，则直接返回给Lighttpd。新请求或者过期的页面请求交由Apache中Web程序来处理。经过Lighttpd和Squid的两级过滤，Apache需要处理的请求将大大减少，减少了Web应用程序的压力。同时这样的构架，便于把不同的处理分散到多台计算机上进行，由Lighttpd在前面统一把关。 <br />
<br />
在这种架构下，每一级都是可以进行单独优化的，比如Lighttpd可以采用异步IO方式，Squid可以启用内存来缓存，Apache可以启用MPM 等，并且每一级都可以使用多台机器来均衡负载，伸缩性很好。</font></p>
<img src ="http://www.blogjava.net/void241/aggbug/266223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2009-04-17 21:04 <a href="http://www.blogjava.net/void241/archive/2009/04/17/266223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大型高并发高负载网站的系统架构(转)</title><link>http://www.blogjava.net/void241/archive/2009/02/26/256790.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Thu, 26 Feb 2009 04:26:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2009/02/26/256790.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/256790.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2009/02/26/256790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/256790.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/256790.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大型(门户/行业/商务)网站建设中的架构是一个高度的技术难题。本篇内容依所个人在新浪网多年担任新浪频道技术总监及众多项目的项目经理所写，希望各位指教。<br />
<br />
<strong>1、HTML静态化</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采 用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息 发布系统CMS，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录 入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。<br />
&shy;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。<br />
&shy;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同 时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论 坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分 内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。<br />
&shy;<br />
<strong>2、图片服务器分离</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大家知道，对于Web服务器来说，不管 是 Apache、IIS还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服 务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃，在应用服务器和图片服务器 上，可以进行不同的配置优化，比如apache在配置ContentType的时候可以尽量少支持，尽可能少的LoadModule，保证更高的系统消耗 和执行效率。<br />
&shy;<br />
<strong>3、数据库集群和库表散列</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。<br />
&shy;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的MySQL提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。<br />
&shy;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上 面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最 有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能 进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架 构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统 随时增加一台低成本的数据库进来补充系统性能。<br />
&shy;<br />
<strong>4、缓存</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。<br />
架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块，也可以使用外加的Squid模块进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。<br />
网 站程序开发方面的缓存，Linux上提供的Memory Cache是常用的缓存接口，可以在web开发中使用，比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享，一些大 型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，PHP有Pear的Cache模块，Java就更多 了，.net不是很熟悉，相信也肯定有。<br />
&shy;<br />
<strong>5、镜像</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网 络接入商和地域带来的用户访问速度差异，比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实 时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如Linux上的rsync等 工具。<br />
&shy;<br />
<strong>6、负载均衡</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。<br />
负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。<br />
<br />
<strong>硬件四层交换</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第 四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚 IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上，需要复杂的 载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决 定。<br />
在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。<br />
&shy;<br />
<strong>软件四层交换</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 软 件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux Virtual Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满 足多种应用需求，这对于分布式的系统来说必不可少。<br />
&shy;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。
<img src ="http://www.blogjava.net/void241/aggbug/256790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2009-02-26 12:26 <a href="http://www.blogjava.net/void241/archive/2009/02/26/256790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大型网站架构演变和知识体系(转)</title><link>http://www.blogjava.net/void241/archive/2009/02/26/256786.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Thu, 26 Feb 2009 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2009/02/26/256786.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/256786.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2009/02/26/256786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/256786.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/256786.html</trackback:ping><description><![CDATA[<p><font face="宋体 ">之前也有一些介绍大型<a href="file::;" target="_self"><u><strong>网站</strong></u></a><a href="file::;" target="_self"><u><strong>架构</strong></u></a>演变的文章，例如</font>LiveJournal<font face="宋体 ">的、</font>ebay<font face="宋体 ">的，都是非常值得参考的，不过感觉他们讲的更多的是每次演变的结果，而没有很详细的讲为什么需要做这样的演变，再加上近来感觉有不少同学都很难明白为什么一个网站需要那么复杂的<a href="file::;" target="_self"><u><strong>技术</strong></u></a>，于是有了写这篇文章的想法，在这篇文章中</font><font face="宋体 ">将阐述一个普通的网站发展成大型网站过程中的一种较为典型的架构演变历程和所需掌握的<a href="file::;" target="_self"><u><strong>知识</strong></u></a>体系，希望能给想从事互联网行业的同学一点初步的概念，</font>:)<font face="宋体 ">，文中的不对之处也请各位多给点建议，让本文真正起到抛砖引玉的效果。</font><br />
<br />
<strong><font face="宋体 "><font style="font-size: 14pt"><font face="宋体 ">架构演变第一步：物理分离</font>webserver<font face="宋体 ">和<a href="file::;" target="_self"><u><strong>数据库</strong></u></a></font></font></font></strong><br />
<font face="宋体 ">最开始，由于某些想法，于是在互联网上搭建了一个网站，这个时候甚至有可能主机都是租借的，但由于这篇文章我们只关注架构的演变历程，因此就假设这个时候</font><font face="宋体 ">已 经是托管了一台主机，并且有一定的带宽了，这个时候由于网站具备了一定的特色，吸引了部分人访问，逐渐你发现系统的压力越来越高，响应速度越来越慢，而这 个时候比较明显的是数据库和应用互相影响，应用出问题了，数据库也很容易出现问题，而数据库出问题的时候，应用也容易出问题，于是进入了第一步演变阶段： 将应用和数据库从物理上分离，变成了两台机器，这个时候技术上没有什么新的要求，但你发现确实起到效果了，系统又恢复到以前的响应速度了，并且支撑住了更 高的流量，并且不会因为数据库和应用形成互相的影响。</font><br />
<font face="宋体 ">看看这一步完成后系统的图示：</font><br />
<img height="99" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/1.PNG" width="195" border="0"  alt="" /><br />
<br />
<font face="宋体 ">这一步涉及到了这些知识体系：</font><br />
<font face="宋体 ">这一步架构演变对技术上的知识体系基本没有要求。</font><br />
<br />
<strong><font face="宋体 "><font style="font-size: 14pt">架构演变第二步：增加页面缓存</font></font></strong><br />
<font face="宋体 ">好景不长，随着访问的人越来越多，你发现响应速度又开始变慢了，查找原因，发现是访问数据库的操作太多，导致数据连接竞争激烈，所以响应变慢，但数据库连</font><font face="宋体 ">接又不能开太多，否则数据库机器压力会很高，因此考虑采用缓存机制来减少数据库连接资源的竞争和对数据库读的压力，这个时候首先也许会选择采用</font>squid<font face="宋体 ">等类似的机制来将系统中相对静态的页面（例如一两天才会有更新的页面）进行缓存（当然，也可以采用将页面静态化的方案），这样程序上可以不做修改，就能够</font><font face="宋体 ">很好的减少对</font>webserver<font face="宋体 ">的压力以及减少数据库连接资源的竞争，</font>OK<font face="宋体 ">，于是开始采用</font>squid<font face="宋体 ">来做相对静态的页面的缓存。</font><br />
<font face="宋体 ">看看这一步完成后系统的图示：</font><br />
<img height="156" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/2.PNG" width="195" border="0"  alt="" /><br />
<br />
<font face="宋体 ">这一步涉及到了这些知识体系：</font><br />
<font face="宋体 ">前端页面缓存技术，例如</font>squid<font face="宋体 ">，如想用好的话还得深入掌握下</font>squid<font face="宋体 ">的实现方式以及缓存的失效算法等。</font><br />
<br />
<strong><font face="宋体 "><font style="font-size: 14pt">架构演变第三步：增加页面片段缓存</font></font></strong><br />
<font face="宋体 ">增加了</font>squid<font face="宋体 ">做缓存后，整体系统的速度确实是提升了，</font>webserver<font face="宋体 ">的压力也开始下降了，但随着访问量的增加，发现系统又开始变的有些慢了，在尝</font><font face="宋体 ">到了</font>squid<font face="宋体 ">之类的动态缓存带来的好处后，开始想能不能让现在那些动态页面里相对静态的部分也缓存起来呢，因此考虑采用类似</font>ESI<font face="宋体 ">之类的页面片段缓存策略，</font>OK<font face="宋体 ">，于是开始采用</font>ESI<font face="宋体 ">来做动态页面中相对静态的片段部分的缓存。</font><br />
<font face="宋体 ">看看这一步完成后系统的图示：</font><br />
<img height="235" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/3.PNG" width="337" border="0"  alt="" /><br />
<br />
<font face="宋体 ">这一步涉及到了这些知识体系：</font><br />
<font face="宋体 ">页面片段缓存技术，例如</font>ESI<font face="宋体 ">等，想用好的话同样需要掌握</font>ESI<font face="宋体 ">的实现方式等；</font><br />
<br />
<strong><font face="宋体 "><font style="font-size: 14pt">架构演变第四步：数据缓存</font></font></strong><br />
<font face="宋体 ">在采用</font>ESI<font face="宋体 ">之类的技术再次提高了系统的缓存效果后，系统的压力确实进一步降低了，但同样，随着访问量的增加，系统还是开始变慢，经过查找，可能会发现系</font><font face="宋体 ">统中存在一些重复获取数据信息的地方，像获取用户信息等，这个时候开始考虑是不是可以将这些数据信息也缓存起来呢，于是将这些数据缓存到本地内存，改变完毕后，完全符合预期，系统的响应速度又恢复了，数据库的压力也再度降低了不少。</font><br />
<font face="宋体 ">看看这一步完成后系统的图示：</font><br />
<img height="258" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/4.PNG" width="341" border="0"  alt="" /><br />
<br />
<font face="宋体 ">这一步涉及到了这些知识体系：</font><br />
<font face="宋体 ">缓存技术，包括像</font>Map<font face="宋体 ">数据结构、缓存算法、所选用的<a href="file::;" target="_self"><u><strong>框架</strong></u></a>本身的实现机制等。</font><br />
<br />
<strong><font face="宋体 "><font style="font-size: 14pt"><font face="宋体 ">架构演变第五步：</font><font face="宋体 ">增加</font>webserver</font></font></strong><br />
<font face="宋体 ">好景不长，发现随着系统访问量的再度增加，</font>webserver<font face="宋体 ">机器的压力在高峰期会上升到比较高，这个时候开始考虑增加一台</font>webserver<font face="宋体 ">，这也是为了同时解决可用性的问题，避免单台的</font>webserver down<font face="宋体 ">机的话就没法使用了，在做了这些考虑后，决定增加一台</font>webserver<font face="宋体 ">，增加一台</font>webserver<font face="宋体 ">时，会碰到一些问题，典型的有：</font><br />
1<font face="宋体 ">、如何让访问分配到这两台机器上，这个时候通常会考虑的方案是</font><a href="file::;" target="_self"><u><strong>Apache</strong></u></a><font face="宋体 ">自带的负载均衡方案，或</font>LVS<font face="宋体 ">这类的软件负载均衡方案；</font><br />
2<font face="宋体 ">、如何保持状态信息的同步，例如用户</font>session<font face="宋体 ">等，这个时候会考虑的方案有写入数据库、写入存储、</font>cookie<font face="宋体 ">或同步</font>session<font face="宋体 ">信息等机制等；</font><br />
3<font face="宋体 ">、如何保持数据缓存信息的同步，例如之前缓存的用户数据等，这个时候通常会考虑的机制有缓存同步或分布式缓存；</font><br />
4<font face="宋体 ">、如何让上传文件这些类似的功能继续正常，这个时候通常会考虑的机制是使用共享文件系统或存储等；</font><br />
<font face="宋体 ">在解决了这些问题后，终于是把</font>webserver<font face="宋体 ">增加为了两台，系统终于是又恢复到了以往的速度。</font><br />
<font face="宋体 ">看看这一步完成后系统的图示：</font><br />
<img height="244" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/5.PNG" width="341" border="0"  alt="" /><br />
<br />
<font face="宋体 ">这一步涉及到了这些知识体系：</font><br />
<font face="宋体 ">负载均衡技术（包括但不限于硬件负载均衡、软件负载均衡、负载算法、</font><a href="file::;" target="_self"><u><strong>linux</strong></u></a><font face="宋体 ">转发协议、所选用的技术的实现细节等）、主备技术（包括但不限于</font>ARP<font face="宋体 ">欺骗、</font>linuxheart-beat<font face="宋体 ">等）、状态信息或缓存同步技术（包括但不限于</font>Cookie<font face="宋体 ">技术、</font>UDP<font face="宋体 ">协议、状态信息广播、所选用的缓存同步技术的实现细节等）、共享文件技术（包括但不限于</font>NFS<font face="宋体 ">等）、存储技术（包括但不限于存储设备等）。</font><br />
<br />
<strong><font face="宋体 "><font style="font-size: 14pt">架构演变第六步：分库</font></font></strong><br />
<font face="宋体 ">享受了一段时间的系统访问量高速增长的幸福后，发现系统又开始变慢了，这次又是什么状况呢，经过查找，发现数据库写入、更新的这些操作的部分数据库连接的</font><font face="宋体 ">资 源竞争非常激烈，导致了系统变慢，这下怎么办呢，此时可选的方案有数据库集群和分库策略，集群方面像有些数据库支持的并不是很好，因此分库会成为比较普遍 的策略，分库也就意味着要对原有程序进行修改，一通修改实现分库后，不错，目标达到了，系统恢复甚至速度比以前还快了。</font><br />
<font face="宋体 ">看看这一步完成后系统的图示：</font><br />
<img height="243" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/6.PNG" width="341" border="0"  alt="" /><br />
<br />
<font face="宋体 ">这一步涉及到了这些知识体系：</font><br />
<font face="宋体 ">这一步更多的是需要从业务上做合理的划分，以实现分库，具体技术细节上没有其他的要求；</font><br />
<font face="宋体 ">但同时随着数据量的增大和分库的进行，在数据库的设计、调优以及维护上需要做的更好，因此对这些方面的技术还是提出了很高的要求的。</font><br />
<br />
<strong><font face="宋体 "><font style="font-size: 14pt"><font face="宋体 ">架构演变第七步：分表、</font>DAL<font face="宋体 ">和分布式缓存</font></font></font></strong><br />
<font face="宋体 ">随着系统的不断运行，数据量开始大幅度增长，这个时候发现分库后查询仍然会有些慢，于是按照分库的思想开始做分表的<a href="file::;" target="_self"><u><strong>工作</strong></u></a>，当然，这不可避免的会需要对程序</font><font face="宋体 ">进行一些修改，也许在这个时候就会发现应用自己要关心分库分表的规则等，还是有些复杂的，于是萌生能否增加一个通用的框架来实现分库分表的数据访问，这个在</font>ebay<font face="宋体 ">的架构中对应的就是</font>DAL<font face="宋体 ">，这个演变的过程相对而言需要花费较长的时间，当然，也有可能这个通用的框架会等到分表做完后才开始做，同时，在这个阶段可</font><font face="宋体 ">能会发现之前的缓存同步方案出现问题，因为数据量太大，导致现在不太可能将缓存存在本地，然后同步的方式，需要采用分布式缓存方案了，于是，又是一通考察和折磨，终于是将大量的数据缓存转移到分布式缓存上了。</font><br />
<font face="宋体 ">看看这一步完成后系统的图示：</font><br />
<img height="439" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/7.PNG" width="342" border="0"  alt="" /><br />
<br />
<font face="宋体 ">这一步涉及到了这些知识体系：</font><br />
<font face="宋体 ">分表更多的同样是业务上的划分，技术上涉及到的会有动态</font>hash<font face="宋体 ">算法、</font>consistenthash<font face="宋体 ">算法等；</font><br />
DAL<font face="宋体 ">涉及到比较多的复杂技术，例如数据库连接的管理（超时、异常）、数据库操作的控制（超时、异常）、分库分表规则的封装等；</font><br />
<br />
<strong><font face="宋体 "><font style="font-size: 14pt"><font face="宋体 ">架构演变第八步：增加更多的</font>webserver</font></font></strong><br />
<font face="宋体 ">在做完分库分表这些工作后，数据库上的压力已经降到比较低了，又开始过着每天看着访问量暴增的幸福<a href="file::;" target="_self"><u><strong>生活</strong></u></a>了，突然有一天，发现系统的访问又开始有变慢的趋势</font><font face="宋体 ">了，这个时候首先查看数据库，压力一切正常，之后查看</font>webserver<font face="宋体 ">，发现</font>apache<font face="宋体 ">阻塞了很多的请求，而应用服务器对每个请求也是比较快的，看来</font><font face="宋体 ">是请求数太高导致需要排队等待，响应速度变慢，这还好办，一般来说，这个时候也会有些钱了，于是添加一些</font>webserver<font face="宋体 ">服务器，在这个添加</font>webserver<font face="宋体 ">服务器的过程，有可能会出现几种挑战：</font><br />
1<font face="宋体 ">、</font>Apache<font face="宋体 ">的软负载或</font>LVS<font face="宋体 ">软负载等无法承担巨大的</font>web<font face="宋体 ">访问量（请求连接数、网络流量等）的调度了，这个时候如果经费允许的话，会采取的方案是购</font><font face="宋体 ">买硬件负载，例如</font>F5<font face="宋体 ">、</font>Netsclar<font face="宋体 ">、</font>Athelon<font face="宋体 ">之类的，如经费不允许的话，会采取的方案是将应用从逻辑上做一定的分类，然后分散到不同的软负载集群中；</font><br />
2<font face="宋体 ">、原有的一些状态信息同步、文件共享等方案可能会出现瓶颈，需要进行改进，也许这个时候会根据情况编写符合网站业务需求的分布式文件系统等；</font><br />
<font face="宋体 ">在做完这些工作后，开始进入一个看似完美的无限伸缩的时代，当网站流量增加时，应对的解决方案就是不断的添加</font>webserver<font face="宋体 ">。</font><br />
<font face="宋体 ">看看这一步完成后系统的图示：</font><br />
<img height="441" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/8.PNG" width="466" border="0"  alt="" /><br />
<br />
<font face="宋体 ">这一步涉及到了这些知识体系：</font><br />
<font face="宋体 ">到了这一步，随着机器数的不断增长、数据量的不断增长和对系统可用性的要求越来越高，这个时候要求对所采用的技术都要有更为深入的理解，并需要根据网站的需求来做更加定制性质的产品。</font><br />
<br />
<strong><font face="宋体 "><font style="font-size: 14pt">架构演变第九步：数据读写分离和廉价存储方案</font></font></strong><br />
<font face="宋体 ">突然有一天，发现这个完美的时代也要结束了，数据库的噩梦又一次出现在眼前了，由于添加的</font>webserver<font face="宋体 ">太多了，导致数据库连接的资源还是不够用，而这个时候又已经分库分表了，开始分析数据库的压力状况，可能会发现数据库的读写比很高，这个时候通常会想到数据读写分离的方案，当然，这个方案要实现并不</font><font face="宋体 ">容易，另外，可能会发现一些数据存储在数据库上有些浪费，或者说过于占用数据库资源，因此在这个阶段可能会形成的架构演变是实现数据读写分离，同时编写一些更为廉价的存储方案，例如</font>BigTable<font face="宋体 ">这种。</font><br />
<font face="宋体 ">看看这一步完成后系统的图示：</font><br />
<img height="398" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/9.PNG" width="555" border="0"  alt="" /><br />
<br />
<font face="宋体 ">这一步涉及到了这些知识体系：</font><br />
<font face="宋体 ">数据读写分离要求对数据库的复制、</font>standby<font face="宋体 ">等策略有深入的掌握和理解，同时会要求具备自行实现的技术；</font><br />
<font face="宋体 ">廉价存储方案要求对</font>OS<font face="宋体 ">的文件存储有深入的掌握和理解，同时要求对采用的语言在文件这块的实现有深入的掌握。</font><br />
<br />
<strong><font face="宋体 "><font style="font-size: 14pt">架构演变第十步：进入大型分布式应用时代和廉价服务器群梦想时代</font></font></strong><br />
<font face="宋体 ">经过上面这个漫长而痛苦的过程，终于是再度迎来了完美的时代，不断的增加</font>webserver<font face="宋体 ">就可以支撑越来越高的访问量了，对于大型网站而言，人气的重要毋</font><font face="宋体 ">庸置疑，随着人气的越来越高，各种各样的功能需求也开始爆发性的增长，这个时候突然发现，原来部署在</font>webserver<font face="宋体 ">上的那个</font>web<font face="宋体 ">应用已经非常庞大</font><font face="宋体 ">了，当多个团队都开始对其进行改动时，可真是相当的不方便，复用性也相当糟糕，基本是每个团队都做了或多或少重复的事情，而且部署和维护也是相当的麻烦，</font><font face="宋体 ">因为庞大的应用包在</font>N<font face="宋体 ">台机器上复制、启动都需要耗费不少的时间，出问题的时候也不是很好查，另外一个更糟糕的状况是很有可能会出现某个应用上的</font>bug<font face="宋体 ">就导</font><font face="宋体 ">致了全站都不可用，还有其他的像调优不好操作（因为机器上部署的应用什么都要做，根本就无法进行针对性的调优）等因素，根据这样的分析，开始痛下决心，将</font><font face="宋体 ">系统根据职责进行拆分，于是一个大型的分布式应用就诞生了，通常，这个步骤需要耗费相当长的时间，因为会碰到很多的挑战：</font><br />
1<font face="宋体 ">、拆成分布式后需要提供一个高性能、稳定的通信框架，并且需要支持多种不同的通信和远程调用方式；</font><br />
2<font face="宋体 ">、将一个庞大的应用拆分需要耗费很长的时间，需要进行业务的整理和系统依赖关系的控制等；</font><br />
3<font face="宋体 ">、如何运维（依赖管理、运行状况管理、错误追踪、调优、监控和报警等）好这个庞大的分布式应用。</font><br />
<font face="宋体 ">经过这一步，差不多系统的架构进入相对稳定的阶段，同时也能开始采用大量的廉价机器来支撑着巨大的访问量和数据量，结合这套架构以及这么多次演变过程吸取的经验来采用其他各种各样的<a href="file::;" target="_self"><u><strong>方法</strong></u></a>来支撑着越来越高的访问量。</font><br />
<font face="宋体 ">看看这一步完成后系统的图示：</font><br />
<img height="431" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/10.PNG" width="554" border="0"  alt="" /><br />
<br />
<font face="宋体 ">这一步涉及到了这些知识体系：</font><br />
<font face="宋体 ">这一步涉及的知识体系非常的多，要求对通信、远程调用、消息机制等有深入的理解和掌握，要求的都是从理论、硬件级、操作系统级以及所采用的语言的实现都有清楚的理解。</font><br />
<font face="宋体 ">运维这块涉及的知识体系也非常的多，多数情况下需要掌握分布式并行计算、报表、监控技术以及规则策略等等。</font><br />
<font face="宋体 ">说起来确实不怎么费力，整个网站架构的经典演变过程都和上面比较的类似，当然，每步采取的方案，演变的步骤有可能有不同，另外，由于网站的业务不同，会有不同的专业技术的需求，这篇</font>blog<font face="宋体 ">更多的是从架构的角度来讲解演变的过程，当然，其中还有很多的技术也未在此提及，像数据库集群、数据挖掘、搜索等，但在真实的演变过程中还会借助像提升硬件配置、网络环境、改造操作系统、</font>CDN<font face="宋体 ">镜像等来支撑更大的流量，因此在真实的发展过程中还会有很多的不同，另外一个大型网站要做到的远远不仅仅上面这些，还有像安全、运维、运营、服务、存储等，要做好一个大型的网站真的很不容易，写这篇文章更多的是希望能够引出更多大型网站架构演变的介绍，</font>:)<font face="宋体 ">。</font><br />
<br />
ps:最后附上几篇LiveJournal架构演变的文章：<br />
从LiveJournal后台发展看大规模网站性能优化方法<br />
http://blog.zhangjianfeng.com/article/743 <br />
另外从这里：<a href="http://www.danga.com/words/" target="_blank">http://www.danga.com/words/</a>大家可以找到更多关于现在LiveJournal网站架构的介绍。</p>
<img src ="http://www.blogjava.net/void241/aggbug/256786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2009-02-26 12:05 <a href="http://www.blogjava.net/void241/archive/2009/02/26/256786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>