<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[Life is a Matter of Dreams, As Success and Belief]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[]]></description>
<link>http://hi.baidu.com/willamette</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[构建可伸缩，高性能的互联网应用zz]]></title>
        <link><![CDATA[http://hi.baidu.com/willamette/blog/item/9e51e6110360f3cba6ef3f4d.html]]></link>
        <description><![CDATA[
		
		<h3><a href="http://yuquan-nana.javaeye.com/blog/710302"><br>
</a></h3>
<strong>文章分类:<a style="text-decoration: none; padding-right: 10px;" href="http://www.javaeye.com/blogs/category/internet">互联网</a></strong>
<div class="blog_content">
<p><span>&#160;&#160;&#160;&#160;&#160;&#160;  时间过得很快，来新公司已经两个月了，在这两个月的时间里，自己也感受颇深。下面就结合公司目前的一些底层技术框架以及自己的一些感触来说说如何构建一个 可伸缩，高性能，高可用性的分布式互联网应用。</span></p>
<p>&#160;</p>
<p>&#160;</p>
<h1 style="margin: 12pt 0cm;"><span style="font-size: large;"><span>一</span><span> </span><span>应用无状态</span></span></h1>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span></span></span><span>俗话说，一个系 统的伸缩性的好坏取决于应用的状态如何管理。为什么这么说呢？咱们试想一下，假如我们在</span><span><span>session</span></span><span>中保存了大量与客户端的状态信 息的话，那么当保存状态信息的</span><span><span>server</span></span><span>宕机的时候，我们怎么办？通常来说，我们都是通过集群来解决这个问题，而通常 所说的集群，不仅有负载均衡，更重要的是要有失效恢复</span><span><span>failover,</span></span><span>比如</span><span><span>tomcat</span></span><span>采 用的集群节点广播复制，</span><span><span>jboss</span></span><span>采 用的配对复制等</span><span><span>session</span></span><span>状 态复制策略，但是集群中的状态恢复也有其缺点，那就是严重影响了系统的伸缩性，系统不能通过增加更多的机器来达到良好的水平伸缩，因为集群节点间</span><span><span>session</span></span><span>的 通信会随着节点的增多而开销增大，因此要想做到应用本身的伸缩性，我们需要保证应用的无状态性，这样集群中的各个节点来说都是相同的，从而是的系统更好的 水平伸缩。</span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span><span>&#160;</span>OK</span></span><span>， 上面说了无状态的重要性，那么具体如何实现无状态呢？此时一个</span><span><span>session</span></span><span>框架就会发挥作用了。幸运的是公 司已经具有了此类框架。公司的</span><span><span>session</span></span><span>框架采用的是</span><span><span>client cookie</span></span><span>实现，主要将状态 保存到了</span><span><span>cookie</span></span><span>里 面，这样就使得应用节点本身不需要保存任何状态信息，这样在系统用户变多的时候，就可以通过增加更多的应用节点来达到水平扩展的目的</span><span><span>.</span></span><span>但 是采用客户端</span><span><span>cookie</span></span><span>的 方式来保存状态也会遇到限制，比如每个</span><span><span>cookie</span></span><span>一般不能超过</span><span><span>4K</span></span><span>的大小，同时很多浏览器都限制一个站点最 多保存</span><span><span>20</span></span><span>个</span><span><span>cookie.公司</span></span><span><span>cookie</span></span><span>框 架采用的是“多值</span><span><span>cookie</span></span><span>”， 就是一个组合键对应多个</span><span><span>cookie</span></span><span>的 值，这样不仅可以防止</span><span><span>cookie</span></span><span>数 量超过</span><span><span>20</span></span><span>， 同时还节省了</span><span><span>cookie</span></span><span>存 储有效信息的空间，因为默认每个</span><span><span>cookie</span></span><span>都会有大约</span><span><span>50</span></span><span>个字节的元信息来描述</span><span><span>cookie</span></span><span>。</span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span><span>&#160;</span></span></span><span>除 了公司目前的</span><span><span>session</span></span><span>框 架的实现方式以外，其实集中式</span><span><span>session</span></span><span>管理来完成，说具体点就是多个无状态的应用节点连接一个</span><span><span>session </span></span><span>服 务器，</span><span><span>session</span></span><span>服 务器将</span><span><span>session</span></span><span>保 存到缓存中，</span><span><span>session</span></span><span>服 务器后端再配有底层持久性数据源，比如数据库，文件系统等等。</span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal">&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<h1 style="margin: 12pt 0cm;"><span style="font-size: large;"><span>二</span><span> </span><span>有效使用缓存</span></span></h1>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span><span>&#160;</span></span></span><span>做 互联网应用的兄弟应该都清楚，缓存对于一个互联网应用是多么的重要，从浏览器缓存，反向代理缓存，页面缓存，局部页面缓存，对象缓存等等都是缓存应用的场 景。</span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span><span>&#160;</span></span></span><span>一 般来说缓存根据与应用程序的远近程度不同可以分为：</span><span><span>local cache </span></span><span>和</span><span><span> remote cache</span></span><span>。 一般系统中要么采用</span><span><span>local  cache</span></span><span>，要么采用</span><span><span>remote cache,</span></span><span>两者混合使用的话对 于</span><span><span>local  cache</span></span><span>和</span><span><span>remote cache</span></span><span>的数据一致性处理会变 大比较麻烦</span><span><span>.</span></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span><span>&#160;</span></span></span><span>在 大部分情况下</span><span><span>,</span></span><span>我 们所说到的缓存都是读缓存</span><span><span>,</span></span><span>缓存还有另外一个类型</span><span><span>:</span></span><span>写缓存</span><span><span>.<span>&#160; </span></span></span><span>对 于一些读写比不高，同时对数据安全性需求不高的数据，我们可以将其缓存起来从而减少对底层数据库的访问</span><span><span>,</span></span><span>比如 统计商品的访问次数</span><span><span>,</span></span><span>统 计</span><span><span>API</span></span><span>的 调用量等等</span><span><span>,</span></span><span>可 以采用先写内存缓存然后延迟持久化到数据库，这样可以大大减少对数据库的写压力。</span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span><span>&#160;</span>OK</span></span><span>， 我以店铺线的系统为例，在用户浏览店铺的时候，比如店铺介绍，店铺交流区页面，店铺服务条款页面，店铺试衣间页面，以及店铺内搜索界面这些界面更新不是非 常频繁，因此适合放到缓存中，这样可以大大减低</span><span><span>DB</span></span><span>的负载。另外宝贝详情页面相对也更新比较 少，因此也适合放到缓存中来减低</span><span><span>DB</span></span><span>负载。</span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal">&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<h1 style="margin: 12pt 0cm;"><span style="font-size: large;"><span>三</span><span> </span><span>应用拆分</span></span></h1>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>首 先，在说明应用拆分之前，我们先来回顾一下一个系统从小变大的过程中遇到的一些问题，通过这些问题我们会发现拆分对于构建一个大型系统是如何的重要。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>系 统刚上线初期，用户数并不多，所有的逻辑也许都是放在一个系统中的，所有逻辑跑到一个进程或者一个应用当中，这个时候因为比较用户少，系统访问量低，因此 将全部的逻辑都放在一个应用未尝不可。但是，兄弟们都清楚，好景不长，随着系统用户的不断增加，系统的访问压力越来越多，同时随着系统发展，为了满足用户 的需求，原有的系统需要增加新的功能进来，系统变得越来越复杂的时候，我们会发现系统变得越来越难维护，难扩展，同时系统伸缩性和可用性也会受到影响。那 么这个时候我们如何解决这些问题呢？明智的办法就是拆分（这也算是一种解耦），我们需要将原来的系统根据一定的标准，比如业务相关性等分为不同的子系统， 不同的系统负责不同的功能，这样切分以后，我们可以对单独的子系统进行扩展和维护，从而提高系统的扩展性和可维护性，同时我们系统的水平伸缩性</span><span><span>scale out</span></span><span>大 大的提升了，因为我们可以有针对性的对压力大的子系统进行水平扩展而不会影响到其它的子系统，而不会像拆分以前，每次系统压力变大的时候，我们都需要对整 个大系统进行伸缩，而这样的成本是比较大的，另外经过切分，子系统与子系统之间的耦合减低了，当某个子系统暂时不可用的时候，整体系统还是可用的，从而整 体系统的可用性也大大增强了。</span><span> </span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>因 此一个大型的互联网应用，肯定是要经过拆分，因为只有拆分了，系统的扩展性，维护性</span><span><span>,</span></span><span>伸缩性，可用性才会变的更好。但是拆分也给系 统带来了问题，就是子系统之间如何通信的问题，而具体的通信方式有哪些呢？一般有同步通信和异步通信，这里我们首先来说下同步通信，下面的主题“消息系 统”会说到异步通信。既然需要通信，这个时候一个高性能的远程调用框架就显得非常总要啦，因此咱们公司也有了自己的</span><span><span>HSF</span></span><span>框 架。</span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;" class="MsoNormal">&#160;</p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>上 面所说的都是拆分的好处，但是拆分以后必然的也会带来新的问题，除了刚才说的子系统通信问题外，最值得关注的问题就是系统之间的依赖关系，因为系统多了， 系统的依赖关系就会变得复杂，此时就需要更好的去关注拆分标准，比如能否将一些有依赖的系统进行垂直化，使得这些系统的功能尽量的垂直，这也是目前公司正 在做的系统垂直化，同时一定要注意系统之间的循环依赖，如果出现循环依赖一定要小心，因为这可能导致系统连锁启动失败。</span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span>OK</span></span><span>， 既然明白了拆分的重要性，我们看看随着公司的发展，公司本身是如何拆分系统的。</span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;" class="MsoNormal">&#160;</p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>在 这个演变的过程中，我们所说的拆分就出现</span><span><span>V2.2</span></span><span>和</span><span><span>V3.0</span></span><span>之间。在</span><span><span>V2.2</span></span><span>版 本中，公司几乎所有的逻辑都放在一个</span><span>系统中，这样导致的问题就是系统扩展和修改非常麻烦，并且更加致命的是随着公司业务量的增 加，如果按照</span><span><span>V2.2</span></span><span>的 架构已经没有办法支撑以后公司的快速发展，因此大家决定对整个系统进行拆分，</span><span><span>V3.0</span></span><span>版本的系统对整个系统进行了水平和垂直 两个方向的拆分，水平方向上，按照功能分为交易，评价，用户，商品等系统，同样垂直方向上，划分为业务系统，核心业务系统以及以及基础服务，这样以来，各 个系统都可以独立维护和独立的进行水平伸缩，比如交易系统可以在不影响其它系统的情况下独立的进行水平伸缩以及功能扩展。</span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;" class="MsoNormal">&#160;</p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span>&#160;</span></span><span>从上面可以看出，一个大型系统要想变得可维 护，可扩展，可伸缩，我们必须的对它进行拆分，拆分必然也带来系统之间如何通信以及系统之间依赖管理等问题，关于通信方面，公司目前独立开发了自己的高性 能服务框架</span><span><span>HSF</span></span><span>， 此框架主要解决了公司目前所有子系统之间的同步和异步通信（目前</span><span><span>HSF</span></span><span>主要用于同步场合，</span><span><span>FutureTask</span></span><span>方 式的调用场景还比较少）。至于系统间的依赖管理，目前公司还做的不够好，这应该也是我们以后努力解决的问题。</span></p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<h1 style="margin: 12pt 0cm;"><span style="font-size: large;"><span>四</span><span> </span><span>数据库拆分</span></span></h1>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span><span>&#160;</span></span></span><span>在 前面“应用拆分”主题中，我们提到了一个大型互联网应用需要进行良好的拆分，而那里我们仅仅说了</span><span><span>”</span></span><span>应用级别</span><span><span>”</span></span><span>的拆 分，其实我们的互联网应用除了应用级别的拆分以外，还有另外一个很重要的层面就是存储如何拆分的。因此这个主题主要涉及到如何对存储系统，通常就是所说的</span><span><span>RDBMS</span></span><span>进 行拆分。</span></p>
<p style="text-indent: 27pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>好 了，确定了这个小节的主题之后，我们回顾一下，一个互联网应用从小变大的过程中遇到的一些问题，通过遇到的问题来引出我们拆分</span><span><span>RDBMS</span></span><span>的 重要性。</span></p>
<p style="text-indent: 27pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>系 统刚开始的时候，因为系统刚上线，用户不多，那个时候，所有的数据都放在了同一个数据库中，这个时候因为用户少压力小，一个数据库完全可以应付的了，但是 随着运营那些哥们辛苦的呐喊和拼命的推广以后，突然有一天发现，</span><span><span>oh,god,</span></span><span>用户数量突然变多了起来，随之而 来的就是数据库这哥们受不了，它终于在某一天大家都和惬意的时候挂掉啦。此时，咱们搞技术的哥们，就去看看究竟是啥原因，我们查了查以后，发现原来是数据 库读取压力太大了，此时咱们都清楚是到了读写分离的时候，这个时候我们会配置一个</span><span><span>server</span></span><span>为</span><span><span>master</span></span><span>节 点，然后配几个</span><span><span>salve</span></span><span>节 点，这样以来通过读写分离，使得读取数据的压力分摊到了不同的</span><span><span>salve</span></span><span>节点上面，系统终于又恢复了正常，开 始正常运行了。但是好景还是不长，有一天我们发现</span><span><span>master</span></span><span>这哥们撑不住了，它负载老高了，汗 流浃背，随时都有翘掉的风险，这个时候就需要咱们垂直分区啦（也就是所谓的分库），比如将商品信息，用户信息，交易信息分别存储到不同的数据库中，同时还 可以针对商品信息的库采用</span><span><span>master</span></span><span>，</span><span><span>salve</span></span><span>模式，</span><span><span>OK</span></span><span>， 通过分库以后，各个按照功能拆分的数据库写压力被分担到了不同的</span><span><span>server</span></span><span>上面，这样数据库的压力终于有恢复 到正常状态。但是是不是这样，我们就可以高枕无忧了呢？</span><span><span>NO,</span></span><span>这个</span><span><span>NO</span></span><span>， 不是我说的，是前辈们通过经验总结出来的，随着用户量的不断增加，你会发现系统中的某些表会变的异常庞大，比如好友关系表，店铺的参数配置表等，这个时候 无论是写入还是读取这些表的数据，对数据库来说都是一个很耗费精力的事情，因此此时就需要我们进行“水平分区”了（这就是俗话说的分表，或者说</span><span><span>sharding</span></span><span>）</span><span><span>.</span></span></p>
<p style="text-indent: 27pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span>OK,</span></span><span>上 面说了一大堆，无非就是告诉大家一个事实“数据库是系统中最不容易</span><span><span>scale out</span></span><span>的一层”，一个大型的互联网 应用必然会经过一个从单一</span><span><span>DB server,</span></span><span>到</span><span><span>Master/salve,</span></span><span>再到垂直分区（分 库），然后再到水平分区（分表，</span><span><span>sharding</span></span><span>）的过程，而在这个过程中，</span><span><span>Master/salve </span></span><span>以 及垂直分区相对比较容易，对应用的影响也不是很大，但是分表会引起一些棘手的问题，比如不能跨越多个分区</span><span><span>join</span></span><span>查 询数据，如何平衡各个</span><span><span>shards</span></span><span>的 负载等等，这个时候就需要一个通用的</span><span><span>DAL</span></span><span>框架来屏蔽底层数据存储对应用逻辑的影响，使得底层数据的访问对应用透明化。</span></p>
<p style="text-indent: 27pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>拿 公司目前的情况来说，公司目前也正在从昂贵的高端存储（小型机</span><span><span>+ORACLE</span></span><span>）切换到</span><span><span>MYSQL,</span></span><span>切 换到</span><span><span>MYSQL</span></span><span>以 后，势必会遇到垂直分区（分库）以及水平分区（</span><span><span>Sharding</span></span><span>）的问题，因此目前公司根据自 己的业务特点也开发了自己的</span><span><span>TDDL</span></span><span>框架，此框架主要解决了分库分表对应用的透明化以及异构数据库之间的数据复制。</span></p>
<p style="text-indent: 27pt; margin: 0cm 0cm 0pt;" class="MsoNormal">&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<h1 style="margin: 12pt 0cm;"><span style="font-size: large;"><span>五</span><span> </span><span>异步通信</span></span></h1>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>在</span><span><span>”</span></span><span>远 程调用框架</span><span><span>”</span></span><span>的 介绍中</span><span><span>,</span></span><span>我 们说了一个大型的系统为了扩展性和伸缩性方面的需求</span><span><span>,</span></span><span>肯定是要进行拆分</span><span><span>,</span></span><span>但是 拆分了以后</span><span><span>,</span></span><span>子 系统之间如何通信就成了我们首要的问题</span><span><span>,</span></span><span>在</span><span><span>”</span></span><span>远程调用框架</span><span><span>”</span></span><span>小节 中</span><span><span>,</span></span><span>我 们说了同步通信在一个大型分布式系统中的应用</span><span><span>,</span></span><span>那么这一小节我们就来说说异步通信</span><span><span>.</span></span><span>好了</span><span><span>,</span></span><span>既 然说到了异步通信</span><span><span>,</span></span><span>那 么</span><span><span>”</span></span><span>消 息中间件</span><span><span>”</span></span><span>就 要登场了</span><span><span>,</span></span><span>采 用异步通信这其实也是关系到系统的伸缩性</span><span><span>,</span></span><span>以及最大化的对各个子系统进行解耦</span><span><span>.</span></span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>说 到异步通信，我们需要关注的一点是这里的异步一定是根据业务特点来的，一定是针对业务的异步，通常适合异步的场合是一些松耦合的通信场合，而对于本身业务 上关联度比较大的业务系统之间，我们还是要采用同步通信比较靠谱。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span>OK,</span></span><span>那 么下一步我们说说异步能给系统带来什么样子的好处。首先我们想想，假如系统有</span><span><span>A</span></span><span>和</span><span><span>B</span></span><span>两个 子系统构成，假如</span><span><span>A</span></span><span>和</span><span><span>B</span></span><span>是 同步通信的话，那么要想使得系统整体伸缩性提高必须同时对</span><span><span>A</span></span><span>和</span><span><span>B</span></span><span>进行 伸缩，这就影响了对整个系统进行</span><span><span>scale out.</span></span><span>其次，同步调用还会影响到可用性，从数学推理的角度来说，</span><span><span>A</span></span><span>同 步调用</span><span><span>B</span></span><span>， 如果</span><span><span>A</span></span><span>可 用，那么</span><span><span>B</span></span><span>可 用，逆否命题就是如果</span><span><span>B</span></span><span>不 可用，那么</span><span><span>A</span></span><span>也 不可用，这将大大影响到系统可用性，再次，系统之间异步通信以后可以大大提高系统的响应时间，使得每个请求的响应时间变短，从而提高用户体验，因此异步在 提高了系统的伸缩性以及可用性的同时，也大大的增强了请求的响应时间（当然了，请求的总体处理时间也许不会变少）。</span></p>
<p>&#160;</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span>下 面我们就以公司的业务来看看异步在公司的具体应用。交易</span></span><span><span><span>系统会与很多其它的业务系统交 互，如果在一次交易过程中采用同步调用的话，这就要求要向交易成功，必须依赖的所有系统都可用，而如果采用异步通信以后，交易</span><span>系 统借助于消息中间件</span><span><span>Notify</span></span><span>和 其它的系统进行了解耦，这样以来当其它的系统不可用的时候，也不会影响到某此交易，从而提高了系统的可用性。</span><span> </span></span></span></p>
<p>&#160;</p>
<p>&#160;</p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span>最后，关于异步方面的讨论，我可以 推荐大家一些资源：</span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;</span>1 . </span><a href="http://www.ibm.com/developerworks/web/library/wa-aj-web2jee/?S_CMP=cn-a-wa&amp;S_TACT=105AGX52"><span style="color: rgb(0, 0, 255); ">J2EE meets web2.0</span></a></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;</span>2. </span><a href="http://www.jdon.com/jivejdon/thread/37753"><span>Ebay</span><span><span>架构特点</span></span><span>(HPTS 2009)</span></a></span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal">&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<h1 style="margin: 12pt 0cm;"><span style="font-size: large;"><span>六</span><span> </span><span>非结构化数据存储</span><span><span> </span></span></span></h1>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span><span>&#160;</span></span></span><span>在 一个大型的互联网应用当中，我们会发现并不是所有的数据都是结构化的，比如一些配置文件，一个用户对应的动态，以及一次交易的快照等信息，这些信息一般不 适合保存到</span><span><span>RDBMS</span></span><span>中， 它们更符合一种</span><span><span>Key-value</span></span><span>的 结构，另外还有一类数据，数据量非常的大，但是实时性要求不高，此时这些数据也需要通过另外的一种存储方式进行存储，另外一些静态文件，比如各个商品的图 片，商品描述等信息，这些信息因为比较大，放入</span><span><span>RDBMS</span></span><span>会引起读取性能问题，从而影响到其它 的数据读取性能，因此这些信息也需要和其它信息分开存储，而一般的互联网应用系统都会选择把这些信息保存到分布式文件系统中，因此公司目前也开发了自己的 分布式文件系统</span><span><span>TFS</span></span><span>，</span><span><span>TFS</span></span><span>目 前限制了文件大小为</span><span><span>2M</span></span><span>， 适合于一些小于</span><span><span>2M</span></span><span>数 据的存放。</span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span><span>&#160;</span></span></span><span>随 着互联网的发展，业界从</span><span><span>08</span></span><span>年 下半年开始逐渐流行了一个概念就是</span><span><span>NOSQL</span></span><span>。我们都知道根据</span><span><span>CAP</span></span><span>理论，一致性，可用性和分区容错性</span><span><span>3</span></span><span>者 不能同时满足，最多只能同时满足两个，我们传统的关系数据采用了</span><span><span>ACID</span></span><span>的事务策略，而</span><span><span>ACID</span></span><span>的 事务策略更加讲究的是一种高一致性而降低了可用性的需求，但是互联网应用往往对可用性的要求要略高于一致性的需求，这个时候我们就需要避免采用数据的</span><span><span>ACID</span></span><span>事 务策略，转而采用</span><span><span>BASE</span></span><span>事 务策略，</span><span><span>BASE</span></span><span>事 务策略是基本可用性，事务软状态以及最终一致性的缩写，通过</span><span><span>BASE</span></span><span>事务策略，我们可以通过最终一致性来提 升系统的可用性，这也是目前很多</span><span><span>NOSQL</span></span><span>产品所采用的策略，包括</span><span><span>facebook </span></span><span>的</span><span><span>cassandra,apache  hbase,google bigtable</span></span><span>等，这些产品非常适合一些非结构化的数据，比如</span><span><span>key-value</span></span><span>形 式的数据存储，并且这些产品有个很好的优点就是水平伸缩性。目前公司也在研究和使用一些成熟的</span><span><span>NOSQL</span></span><span>产品。</span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span></span></span></p>
<h1 style="margin: 12pt 0cm;"><span style="font-size: large;"><span>七</span><span> </span><span>监控、预警系统</span></span></h1>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span></span></span><span>对于大型的系统 来说，唯一可靠的就是系统的各个部分是不可靠。</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>因 为一个大型的分布式系统中势必会涉及到各种各样的设备，比如网络交换机，普通</span><span><span>PC</span></span><span>机，各种型号的网卡，硬盘，内存等等，而这 些东东都在数量非常多的时候，出现错误的概率也会变大，因此我们需要时时刻刻监控系统的状态，而监控也有粒度的粗细之分，粒度粗一点的话，我们需要对整个 应用系统进行监控，比如目前的系统网络流量是多少，内存利用率是多少，</span><span><span>IO</span></span><span>，</span><span><span>CPU</span></span><span>的 负载是多少，服务的访问压力是多少，服务的响应时间是多少等这一系列的监控，而细粒度一点的话，我们就需对比如应用中的某个功能，某个</span><span><span>URL</span></span><span>的 访问量是多，每个页面的</span><span><span>PV</span></span><span>是 多少，页面每天占用的带宽是多少，页面渲染时间是多少，静态资源比如图片每天占用的带宽是多少等等进行进一步细粒度的监控。因此一个监控系统就变得必不可 少了。</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 0pt;" class="MsoNormal"><span>前 面说了一个监控系统的重要性，有了监控系统以后，更重要的是要和预警系统结合起来，比如当某个页面访问量增多的时候，系统能自动预警，某台</span><span><span>Server</span></span><span>的</span><span><span>CPU</span></span><span>和 内存占用率突然变大的时候，系统也能自动预警，当并发请求丢失严重的时候，系统也能自动预警等等，这样以来通过监控系统和预警系统的结合可以使得我们能快 速响应系统出现的问题，提高系统的稳定性和可用性。</span></p>
<h1 style="margin: 12pt 0cm;"><span style="font-size: large;"><span>八</span><span> </span><span>配置统一管理</span></span></h1>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span><span><span>&#160;&#160;&#160;&#160;&#160;&#160; </span></span></span><span>一个大型的分布 式应用，一般都是有很多节点构成的，如果每次一个新的节点加入都要更改其它节点的配置，或者每次删除一个节点也要更改配置的话，这样不仅不利于系统的维护 和管理，同时也更加容易引入错误。另外很多时候集群中的很多系统的配置都是一样的，如果不进行统一的配置管理，就需要再所有的系统上维护一份配置，这样会 造成配置的管理维护很麻烦，而通过一个统一的配置管理可以使得这些问题得到很好的解决，当有新的节点加入或者删除的时候，配置管理系统可以通知各个节点更 新配置，从而达到所有节点的配置一致性，这样既方便也不会出错。</span></p>
<p style="margin: 0cm 0cm 0pt;" class="MsoNormal">&#160;</p>
</div> <a href="http://hi.baidu.com/willamette/blog/item/9e51e6110360f3cba6ef3f4d.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/willamette/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/willamette/blog/item/9e51e6110360f3cba6ef3f4d.html#comment">查看评论</a>]]></description>
        <pubDate>2010年07月12日 星期一  11:41</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[willamette]]></author>
		<guid>http://hi.baidu.com/willamette/blog/item/9e51e6110360f3cba6ef3f4d.html</guid>
</item>

<item>
        <title><![CDATA[读两晋南北史]]></title>
        <link><![CDATA[http://hi.baidu.com/willamette/blog/item/f9aacefcdb394084b901a0a6.html]]></link>
        <description><![CDATA[
		
		从战栗中走入这个时代，然后又从战栗中离开这个时代。 <br>
<br>
这是一个充满着鲜血的时代。 <br>
自五胡乱华始，再至北魏一统北方，又始东西魏分裂，方至北周中原鼎立，179年的战乱，生灵涂炭，民不聊生。汉族近两千万人口死亡，羯、氐、羌、 匈奴、鲜卑或被屠、或徙、或融，残阳带血，哀鸿遍野，&ldquo;千里烟绝，人迹罕见，白骨成聚，如丘陇焉&rdquo;。仅仅是为了一人之功成，便使生灵涂炭万骨成枯；仅仅是 青史那寥寥几行名姓，却得需北邙那罄筹难数的荒丘。常年的战乱，粮食无以为继，军中以老弱兵卒者为食，平民百姓以儿女相啖。平民尚且如此，所谓王者则之更 甚，凡新朝换旧朝之时，看那齐之代魏，隋之代周，南朝代代相传，前朝之龙子龙孙亦不免被大肆屠杀更甚至族灭，当前人们看到自己的硕果被后人们劫掠殆尽的时 候，是否又会幽叹，早知如此，又&ldquo;说甚龙争虎斗&rdquo;呢？ <br>
<br>
这是一个充满着背叛的时代。 <br>
自晋武帝炎统天下始，方隋文帝坚临九州终，共324年，称帝称王者凡180余人。君王们&ldquo;朝为殿上主，夕为阶下囚&rdquo;，这是一个充满着下尅上狂热的 时代。苻坚兵败肥水，其国被分，身死人手，为天下笑。萧衍利令智昏，错用侯景，丧身失土，国祚速衰。人臣之顶峰，篡位之前兆，九锡之赏，竟在这个时代出现 五次之多。帝王失势，权臣当道。王侯将相非宁有种也。在背叛中登上皇位，却又在背叛中失去皇位乃至生命，这个时代，历史就如同一个蹩脚的优伶，一次又一次 地重演那一成不变的拙劣剧目。 <br>
<br>
这是一个充满着荒淫的时代。 <br>
北魏兴于女（冯太后）而亡于女（胡太后），何其相似于满清。北齐之冯小怜，南陈之张丽华，皆遗世独立，倾城倾国，可却贻误君王，亡国丧土。北齐后 主高纬荒淫无度，宠妃小怜却极力讨好君王，无（阴）丽华之贤，更无孝庄之能，&ldquo;玉体横陈&rdquo;之夜闻&ldquo;周师入晋阳&rdquo;，美人为博君王之欢心：&ldquo;晋阳已陷，休得回 顾，君王，请更猎一围&rdquo;。南陈之后主陈叔宝，即位后&ldquo;奏伎纵酒，作诗不辍&rdquo;，为其宠妃张丽华作千古名曲《玉树后庭花》，其中&ldquo;花开花落不长久，落红满地归 寂中！&rdquo;，是否也流露出了对将来的隐忧呢？日出日落，岁月如梭，是否在地下的陈后主，依然在等候着那些为不知亡国恨的帝王，演奏一曲玉树后庭花呢？ <br>
<br>
付年表： <br>
公元265年：司马炎代魏称帝(晋武帝)，国号曰晋，建都洛阳，史称西晋。 <br>
公元280年：晋武帝灭吴，统一全国。 <br>
公元291年：八王之乱。 <br>
公元304年：五胡乱华始 <br>
公元316年：刘渊族子刘曜攻占长安，俘晋愍帝，西晋亡，历4帝，享祚52年，北方进入「五胡十六国」。同年，晋朝宗室琅琊王司马睿称帝，建都于建康，史称东晋。 <br>
公元420年：刘裕代晋称帝，国号宋，建都建康，史称&ldquo;刘宋&rdquo;，东晋亡，历11帝、享祚104年。两晋共历十五帝、156年。南朝始。 <br>
公元479年：萧道成代宋称帝，国号齐，建都建康，史称&ldquo;南齐&rdquo;也称&ldquo;萧齐&rdquo;。&ldquo;刘宋&rdquo;共历8帝，享国60年。 <br>
公元502年：萧衍代齐称帝，国号梁，建都建康，史称&ldquo;南梁&rdquo;又称&ldquo;萧梁&rdquo;。&ldquo;萧齐&rdquo;共历7帝、享国24年。 <br>
公元557年：陈霸先代梁称帝，国号陈，建都建康。&ldquo;萧梁&rdquo;历8帝、享祚56年。 <br>
公元589年：隋灭陈，陈历五帝、享祚33年。 <br>
公元304年：刘渊称王，「五胡十六国」时代始。 <br>
公元398年：北魏建都于平城。 <br>
公元439年：北魏统一北方。北朝始。公元534年：北魏分裂为东魏与西魏，隔黄河而治。  <br>
公元550年：高洋代东魏，国号齐，史称北齐，亦称高齐，东魏亡，东魏历1帝、17年。 <br>
公元557年：宇文觉代西魏，国号周，史称北周，也称宇文周，西魏亡，西魏历3帝、24年。魏亡，历17帝、171年。 <br>
公元577年：北周灭北齐，统一中国北方。 <br>
公元581年：杨坚代周，国号隋，北周历5帝、25年。 <br>
公元589年：隋灭陈，全国统一。 <a href="http://hi.baidu.com/willamette/blog/item/f9aacefcdb394084b901a0a6.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/willamette/blog/category/%D0%C4%C7%E9">心情</a>&nbsp;<a href="http://hi.baidu.com/willamette/blog/item/f9aacefcdb394084b901a0a6.html#comment">查看评论</a>]]></description>
        <pubDate>2008年10月04日 星期六  21:48</pubDate>
        <category><![CDATA[心情]]></category>
        <author><![CDATA[willamette]]></author>
		<guid>http://hi.baidu.com/willamette/blog/item/f9aacefcdb394084b901a0a6.html</guid>
</item>

<item>
        <title><![CDATA[有时间好好休息一下，做点自己喜欢的事情吧]]></title>
        <link><![CDATA[http://hi.baidu.com/willamette/blog/item/b871fd0390568f8ed43f7cc1.html]]></link>
        <description><![CDATA[
		
		<p>php、jvm、js、dm、nlp、dip==，终于有时间可以静下心来看看。</p>
<p>Extend my sight and Sharp my intuition.</p>
<p>还可以好好地风暴一下被某些胸无大志的人鄙视的头脑思维了</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/willamette/blog/category/%C9%FA%BB%EE">生活</a>&nbsp;<a href="http://hi.baidu.com/willamette/blog/item/b871fd0390568f8ed43f7cc1.html#comment">查看评论</a>]]></description>
        <pubDate>2008年08月17日 星期日  12:41</pubDate>
        <category><![CDATA[生活]]></category>
        <author><![CDATA[willamette]]></author>
		<guid>http://hi.baidu.com/willamette/blog/item/b871fd0390568f8ed43f7cc1.html</guid>
</item>

<item>
        <title><![CDATA[Make everything customized]]></title>
        <link><![CDATA[http://hi.baidu.com/willamette/blog/item/f69c00e9f4251c39b80e2dd3.html]]></link>
        <description><![CDATA[
		
		Well, 谁掌握了消费者，谁就掌握了金钱。<br>
这是一个充满着自由与自我的时代，谁都想与众不同，但是，谁来提供与众不同？厂商。<br>
一个开放的标准<br>
一个让人可以炫耀的物品<br>
一份虚荣心<br>
这些就是个性化时代的基础。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/willamette/blog/category/%D0%C4%C7%E9">心情</a>&nbsp;<a href="http://hi.baidu.com/willamette/blog/item/f69c00e9f4251c39b80e2dd3.html#comment">查看评论</a>]]></description>
        <pubDate>2008年08月06日 星期三  22:36</pubDate>
        <category><![CDATA[心情]]></category>
        <author><![CDATA[willamette]]></author>
		<guid>http://hi.baidu.com/willamette/blog/item/f69c00e9f4251c39b80e2dd3.html</guid>
</item>

<item>
        <title><![CDATA[世界上本来有战术，有了人海之后，便没有了战术]]></title>
        <link><![CDATA[http://hi.baidu.com/willamette/blog/item/b2b171cf1550bf3bf9dc614d.html]]></link>
        <description><![CDATA[
		
		<p>互联网怎么样利用人海，这个是一个问题</p>
<p>阿里巴巴、百度等，大量将人海使用在渠道营销上，为何</p>
<p>1.渠道制胜，先做好渠道，渠到了，水也就到了。</p>
<p>2.相比增加技术人员来说，增加营销人员的性价比更加高一些，这是建立在有足够技术的基础上。</p>
<p>3.技术人员的人海，协调管理的确是一个很大的问题，我赞成一个配置方案：3牛+7普通</p>
<p>再多的想不到了。。不能像某些企业那样，大量招收普通人员，人员流动频繁并且素质不高，这样的人海战术是要不得的，这样的海是不能掀起惊涛巨浪来的。而且会缺乏核心竞争力，导致企业生存几率不高，或者因为不能掌握和控制利益链的上下游而变得十分危险</p>
<p>4.人海资源应该是脑力海资源，而不是体力海资源。</p>
<p>话说IT经理世界《智造的秘密》吹某公司的确吹得有点不靠谱了。。。</p>
<p>多年以后再来看我现在写的东西。。。。。</p> <a href="http://hi.baidu.com/willamette/blog/item/b2b171cf1550bf3bf9dc614d.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/willamette/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/willamette/blog/item/b2b171cf1550bf3bf9dc614d.html#comment">查看评论</a>]]></description>
        <pubDate>2008年07月27日 星期日  19:14</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[willamette]]></author>
		<guid>http://hi.baidu.com/willamette/blog/item/b2b171cf1550bf3bf9dc614d.html</guid>
</item>

<item>
        <title><![CDATA[每天要分析一篇观点文章，总结一下]]></title>
        <link><![CDATA[http://hi.baidu.com/willamette/blog/item/29ead116647a541d972b4394.html]]></link>
        <description><![CDATA[
		
		<p>现在不能做决策，那么就学会做预测</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/willamette/blog/category/%C9%FA%BB%EE">生活</a>&nbsp;<a href="http://hi.baidu.com/willamette/blog/item/29ead116647a541d972b4394.html#comment">查看评论</a>]]></description>
        <pubDate>2008年07月15日 星期二  15:12</pubDate>
        <category><![CDATA[生活]]></category>
        <author><![CDATA[willamette]]></author>
		<guid>http://hi.baidu.com/willamette/blog/item/29ead116647a541d972b4394.html</guid>
</item>

<item>
        <title><![CDATA[周末时间找一下答案，寻找一下，我想知道]]></title>
        <link><![CDATA[http://hi.baidu.com/willamette/blog/item/a6d8574eae13270cb3de05b9.html]]></link>
        <description><![CDATA[
		
		<p>做好脚下，并且时刻准备未来。</p>
<p>Life is step by step</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/willamette/blog/category/%D0%C4%C7%E9">心情</a>&nbsp;<a href="http://hi.baidu.com/willamette/blog/item/a6d8574eae13270cb3de05b9.html#comment">查看评论</a>]]></description>
        <pubDate>2008年07月12日 星期六  00:10</pubDate>
        <category><![CDATA[心情]]></category>
        <author><![CDATA[willamette]]></author>
		<guid>http://hi.baidu.com/willamette/blog/item/a6d8574eae13270cb3de05b9.html</guid>
</item>

<item>
        <title><![CDATA[毕业了]]></title>
        <link><![CDATA[http://hi.baidu.com/willamette/blog/item/e2a9bd3138e9f1ad5fdf0e7f.html]]></link>
        <description><![CDATA[
		
		<p>I graduate from the University but not the life.</p>
<p>So long the road is...</p>
<p>Ideas are bursting but none of them are valuable...</p>
<p>How should I face myself</p>
<p>Hamlet tells&quot;Imperious Caesar, dead and turned to clay, Might stop a hole to keep the wind away.</p>
<p>&quot;Alexander died, Alexander was buried, Alexander returneth to dust, the dust is earth, of earth we make loam, and why of that loam whereto he was converted might they not stop a beer-barrel?&quot;</p>
<p>The fate , is being changed, by my hands.</p>
<p>未来のドアを自分の手で開けて、今生まれた梦が今小さくても、冻りつくような强い风でさえ、私の胸に辉く 梦を消したり、そうよ、消したりなんて出来ない、まだ远い明日も きっと迷わず、そうよ、迷わず越えてゆける。</p>
<p>自分の人生、自分の戦争。</p>
<p>少年よ、たいしを抱けて、しんわになるぞ</p>
<p>come on, sweet death, I will counter your attack with my whole life</p>
<p> </p> <a href="http://hi.baidu.com/willamette/blog/item/e2a9bd3138e9f1ad5fdf0e7f.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/willamette/blog/category/%D0%C4%C7%E9">心情</a>&nbsp;<a href="http://hi.baidu.com/willamette/blog/item/e2a9bd3138e9f1ad5fdf0e7f.html#comment">查看评论</a>]]></description>
        <pubDate>2008年06月23日 星期一  21:21</pubDate>
        <category><![CDATA[心情]]></category>
        <author><![CDATA[willamette]]></author>
		<guid>http://hi.baidu.com/willamette/blog/item/e2a9bd3138e9f1ad5fdf0e7f.html</guid>
</item>

<item>
        <title><![CDATA[让我感到高兴的三件事情]]></title>
        <link><![CDATA[http://hi.baidu.com/willamette/blog/item/32d8082372f4d74b93580756.html]]></link>
        <description><![CDATA[
		
		1.我会死亡<br>
2.我现在仍然一事无成<br>
3.我还有时间，但是已经不多 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/willamette/blog/category/%C9%FA%BB%EE">生活</a>&nbsp;<a href="http://hi.baidu.com/willamette/blog/item/32d8082372f4d74b93580756.html#comment">查看评论</a>]]></description>
        <pubDate>2008年05月28日 星期三  21:09</pubDate>
        <category><![CDATA[生活]]></category>
        <author><![CDATA[willamette]]></author>
		<guid>http://hi.baidu.com/willamette/blog/item/32d8082372f4d74b93580756.html</guid>
</item>

<item>
        <title><![CDATA[改革开放三十年了啊]]></title>
        <link><![CDATA[http://hi.baidu.com/willamette/blog/item/715d63d9b186262911df9b83.html]]></link>
        <description><![CDATA[
		
		<p>三十年了啊。</p>
<p>中国商业已经走过了三十年了。</p>
<p>那些曾经耳熟能详的名字，是否现在仍然在耳边回响。</p>
<p>三株、飞龙、德高、南德等等，曾经的巨人轰然倒下，而废墟上又建立起了新的家园。</p>
<p>从我个人角度来看，我觉得，他们的失败，一个重要的原因就是太过于重视眼前利益而忽视了长远的未来。未来尽管是不可预测的，但是我们还是能够听到它即将到来的脚步。要做好好企业，我认为就八个字&ldquo;理念为基渠道制胜&rdquo;。呵呵，受《基业长青》这本书的影响。</p>
<p>做IT有的时候视野还是太狭隘了。</p>
<p>三十年了啊。。一代又一代的财富英雄，一轮又一轮的神话光环。中国从来没有像现在这样充满着梦想，充满着机遇。这是实实在在的中国梦，这是一个充满着光荣与梦想的时代。</p>
<p> </p> <a href="http://hi.baidu.com/willamette/blog/item/715d63d9b186262911df9b83.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/willamette/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/willamette/blog/item/715d63d9b186262911df9b83.html#comment">查看评论</a>]]></description>
        <pubDate>2008年05月22日 星期四  13:16</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[willamette]]></author>
		<guid>http://hi.baidu.com/willamette/blog/item/715d63d9b186262911df9b83.html</guid>
</item>


</channel>
</rss>
