JedisClusterFactory.java
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
//Jedis Cluster will attempt to discover cluster nodes automatically
jedisClusterNodes.add(new HostAndPort("10.96.5.183",9001));
jedisClusterNodes.add(new HostAndPort("10.96.5.183",9002));
jedisClusterNodes.add(new HostAndPort("10.96.5.183",9003));
JedisCluster jc = new JedisCluster(jedisClusterNodes);
二、利用spring-data-redis来实?br />
<!--通过构造方法注入RedisNode-->
<bean id="clusterRedisNodes1" class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg value="10.96.5.183" />
<constructor-arg value="9002" type="int" />
</bean>
....
<!--setter方式注入-->
<bean id="redisClusterConfiguration" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
<property name="clusterNodes">
<set>
<ref bean="clusterRedisNodes1"/>
<ref bean="clusterRedisNodes2"/>
<ref bean="clusterRedisNodes3"/>
</set>
</property>
</bean>
<!--setter方式注入,对应的属性需存在setterXXXҎ(gu)-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxToal" value="1000" />
<property name="maxIdle" value="1000" />
<property name="maxWaitMillis" value="1000" />
</bean>
<bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true">
<constructor-arg ref="redisClusterConfiguration" />
<constructor-arg ref="jedisPoolConfig" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory" />
<!--setter方式注入PersonRepoImpl-->
<bean id="personRepo" class="com.example.repo.impl.PersonRepoImpl">
<property name="redisTemplate" ref="redisTemplate" />
</bean>
三、简单集成Spring
自己~写jedisCluster的工厂类JedisClusterFactory,然后通过Spring注入的方式获取jedisCluster,实现客户端用Redis3.0版本的集特性?/p>
操作pȝ
Linux操作pȝ有很多个不同的发行版Q如Red Hat Enterprise Linux、SUSE Linux Enterprice、Debian、Ubuntu、CentOS{,每一个发行版都有自己的特Ԍ比如RHEL的稳定,Ubuntu的易用,ZE_?和性能的考虑Q操作系l选择CentOSQCommunity ENTerprise Operating SystemQ是一个理想的Ҏ(gu)?/p>
CentOSQCommunity ENTerprise Operating SystemQ是Linux发行版之一Q是RHEL/Red Hat Enterprise Linux的精免费版,和RHEL为同L(fng)源代码,不过QRHEL和SUSE LE{企业版Q提供的升服务均是收费升Q无法免费在U升U,因此要求免费的高度稳定性的服务器可以用CentOS替代Red Hat Enterprise Linux使用?/p>
LAMP|站架构?/p>
Web服务器、缓存和PHP加?/strong>
Apache是LAMP架构最核心的Web ServerQ开源、稳定、模块丰富是Apache的优ѝ但Apache的缺Ҏ(gu)有些臃肿Q内存和CPU开销大,性能上有损耗,不如一些轻量的Web 服务器(例如nginxQ高效,轻量U的Web服务器对于静态文件的响应能力来说q高于Apache服务器?/p>
Apache做ؓ(f)Web Server是负载PHP的最佳选择Q如果流量很大的话,可以采用nginx来负载非PHP的Webh。nginx是一个高性能的HTTP和反向代理服 务器QNginx以它的稳定性、丰富的功能集、示例配|文件和低系l资源的消耗而闻名。Nginx不支持PHP和CGI{动态语aQ但支持负蝲均衡和容 错,可和Apache配合使用Q是轻量U的HTTP服务器的首选?/p>
Web服务器的~存也有多种Ҏ(gu)QApache提供了自q~存?块,也可以用外加的Squid模块q行~存Q这两种方式均可以有效的提高Apache的访问响应能力。Squid Cache是一个Web~存服务器,支持高效的缓存,可以作ؓ(f)|页服务器的前置cache服务器缓存相兌求来提高Web服务器的速度Q把Squid攑֜ Apache的前端来~存Web服务器生成的动态内容,而W(xu)eb应用E序只需要适当地设|页面实效时间即可。如讉K量巨大则可考虑使用memcache?为分布式~存?/p>
PHP的加速用eAccelerator加速器QeAccelerator是一个自由开放源码PHP加速器Q优化和?态内容缓存,提高了性能PHP脚本的缓存性能Q得PHP脚本在编译的状态下Q对服务器的开销几乎完全消除。它q有对脚本v优化作用Q以加快其执行效率?使PHPE序代码执效率能提高1-10倍?/p>
具体的解x案有以下几种Q?/p>
1、squid + Apache + PHP + eAccelerator
使用Apache负蝲PHPQ用squidq行~存Qhtml或图片的h可以直接由squidq回l用戗很多大型网站都采用q种架构?/p>
2、nginx/Apache + PHPQfastcgiQ?+ eAccelerator
使用nginx或Apache负蝲PHPQPHP使用fastcgi方式q行Q效率较高?/p>
3、nginx + Apache + PHP + eAccelerator
此方案综合了nginx和Apache的优点,使用Apache负蝲PHPQnginx负责解析其他WebhQ用nginx的rewrite模块QApache端口不对外开放?/p>
数据?/strong>
开源的数据库中QMySQL在性能、稳定性和功能上是首选,可以辑ֈ百万U别的数据存储,|站初期可以MySQL和W(xu)eb服务器放在一P但是当访?量达C定规模后Q应该将MySQL数据库从Web Server上独立出来,在单独的服务器上q行Q同时保持Web Server和MySQL服务器的E_q接?/p>
当数据库讉K量达到更大的U别Q可以考虑使用MySQL Cluster{数据库集群或者库表散列等解决Ҏ(gu)?/p>
ȝ来说QLAMP架构的网站性能?x)远q优于Windows IIS + ASP + AccessQ例如月光博客)q样的网站,可以负蝲的访问量也非常大Q国内的大量个h|站如果惌支撑大访问量Q采用LAMP架构是一个不错的Ҏ(gu)?/p>
lg所qͼZLAMP架构设计h成本低廉、部|灵zR快速开发、安全稳定等特点Q是Web|络应用和环境的优秀l合?/p>
大型|站Q比如门L(fng)站。在面对大量用户讉K、高q发h斚wQ基本的解决Ҏ(gu)集中在这样几个环节:(x)使用高性能的服务器、高性能的数据库、高效率的编E语a、还有高性能的Web容器。但是除了这几个斚wQ还没法Ҏ(gu)解决大型|站面(f)的高负蝲和高q发问题?/span>
上面提供的几个解x\在一定程度上也意味着更大的投入,q且q样的解x\具备瓉Q没有很好的扩展性,下面我从低成本、高性能和高扩张性的角度来说说我的一些经??/span>
1、HTML静态化
其实大家都知道,效率最高、消耗最的是U静态化的html面Q所以我们尽可能使我们的|站上的面采用静态页面来实现Q这个最单的Ҏ(gu)其实也是最 有效的方法。但是对于大量内容ƈ且频J更新的|站Q我们无法全部手动去挨个实现Q于是出C我们常见的信息发布系lCMS Q像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布pȝ来管理和实现的,信息发布pȝ可以实现最单的信息录入自动生成静?面Q还能具备频道管理、权限管理、自动抓取等功能Q对于一个大型网站来_(d)拥有一套高效、可理的CMS是必不可的?/span>
除了门户和信息发布类型的|站Q对于交互性要求很高的Ccd|站来说Q尽可能的静态化也是提高性能的必要手D,社区内的帖子、文章进行实时的静态化Q有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩是使用了这L(fng){略Q网易社区等也是如此?/span>
同时Qhtml静态化也是某些~存{略使用的手D,对于pȝ中频J用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实玎ͼ比如论坛?论坛的公用设|信息,q些信息目前的主论坛都可以q行后台理q且存储在数据库中,q些信息其实大量被前台程序调用,但是更新频率很小Q可以考虑这?分内容进行后台更新的时候进行静态化Q这样避免了大量的数据库讉Kh?/span>
2、图片服务器分离
大家知道Q对于Web服务器来_(d)不管是Apache、IISq是其他容器Q图片是最消耗资源的Q于是我们有必要图片与面q行分离Q这是基本上大型|?站都?x)采用的{略Q他们都有独立的囄服务器,甚至很多台图片服务器。这L(fng)架构可以降低提供面讉Kh的服务器pȝ压力Qƈ且可以保证系l不?x)因为?片问题而崩溃,在应用服务器和图片服务器上,可以q行不同的配|优化,比如apache在配|ContentType的时候可以尽量少支持Q尽可能的 LoadModuleQ保证更高的pȝ消耗和执行效率?/span>
3、数据库集群和库表散?/span>
大型|站都有复杂的应用,q些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓉很快p昄出来Q这时一台数据库很快无法满_用,于是?们需要用数据库集群或者库表散列。在数据库集方面,很多数据库都有自q解决Ҏ(gu)Q? Oracle、Sybase{都有很好的Ҏ(gu)Q常用的MySQL提供的Master/Slave也是cM的方案,(zhn)用了什么样的DBQ就参考相应的解决 Ҏ(gu)来实施即可?/span>
上面提到的数据库集群׃在架构、成本、扩张性方面都?x)受到所采用DBcd的限Ӟ于是我们需要从应用E序的角度来考虑改善pȝ架构Q库表散列是常用q且 最有效的解x案。我们在应用E序中安装业务和应用或者功能模块将数据库进行分,不同的模块对应不同的数据库或者表Q再按照一定的{略Ҏ(gu)个页面或者功 能进行更的数据库散列,比如用户表,按照用户IDq行表散列,q样p够低成本的提升系l的性能q且有很好的扩展性。sohu的论坛就是采用了q样的架 构,论坛的用户、设|、帖子等信息q行数据库分,然后对帖子、用h照板块和IDq行散列数据库和表,最l可以在配置文g中进行简单的配置便能让系l?随时增加一C成本的数据库q来补充pȝ性能?/span>
4、缓?/strong>
~存一词搞技术的都接触过Q很多地方用到缓存。网站架构和|站开发中的缓存也是非帔R要。这里先讲述最基本的两U缓存。高U和分布式的~存在后面讲q。架 构方面的~存Q对Apache比较熟?zhn)的h都能知道Apache提供了自q~存模块Q也可以使用外加的Squid模块q行~存Q这两种方式均可以有效的 提高Apache的访问响应能力?/span>
|站E序开发方面的~存QLinux上提供的Memory Cache是常用的~存接口Q可以在web开发中? 用,比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯׃nQ一些大型社Z用了q样的架构。另外,在用web语言开 发的时候,各种语言基本都有自己的缓存模块和Ҏ(gu)?/span>
5、镜?/span>
镜像是大型网站常采用的提高性能和数据安全性的方式Q镜像的技术可以解决不同网l接入商和地域带来的用户讉K速度差异Q比如ChinaNet?EduNet之间的差异就促了很多网站在教育|内搭徏镜像站点Q数据进行定时更新或者实时更新。在镜像的细节技术方面,q里不阐q太深,有很多专业的?成的解决架构和品可选。也有廉L(fng)通过软g实现的思\Q比如Linux上的rsync{工??/span>
6、负载均?/span>
负蝲均衡是大型|站解决高负药问和大量q发h采用的终极解军_法?/span>
负蝲均衡技术发展了多年Q有很多专业的服务提供商和品可以选择Q我个h接触q一些解x法,其中有两个架构可以给大家做参考?/span>
g四层交换
W四层交换用第三层和第四层信息包的报头信息Q根据应用区间识别业务流Q将整个区间D늚业务分配到合适的应用服务器进行处理。第四层交换功能p是虚 IPQ指向物理服务器。它传输的业务服从的协议多种多样Q有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基上,需要复杂的 载量q法。在IP世界Q业务类型由l端TCP或UDP 端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同军_?/span>
在硬件四层交换品领域,有一些知名的产品可以选择Q比如Alteon、F5{,q些产品很昂贵,但是物有所|能够提供非常优秀的性能和很灉|的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon搞定了?/span>
软g四层交换
大家知道了硬件四层交换机的原理后Q基于OSI模型来实现的软g四层交换也就应运而生Q这L(fng)解决Ҏ(gu)实现的原理一_(d)不过性能E差。但是满一定量的压力还是游刃有余的Q有软g实现方式其实更灵z,处理能力完全看你配置的熟(zhn)能力?/span>
软g四层交换我们可以使用Linux上常用的LVS来解冻ILVS是Linux Virtual ServerQ他提供了基于心跳线heartbeat的实时灾隑ֺ对解x案,提高pȝ的鲁性,同时可供了灵zȝ虚拟VIP配置和管理功能,可以同时?_U应用需求,q对于分布式的系l来说必不可?/span>
一个典型的使用负蝲均衡的策略就是,在Y件或者硬件四层交换的基础上搭建squid集群Q这U思\在很多大型网站包括搜索引擎上被采用,q样的架构低?本、高性能q有很强的扩张性,随时往架构里面增减节点都非常容易。这L(fng)架构我准备空了专门详l整理一下和大家探讨?/span>
对于大型|站来说Q前面提到的每个Ҏ(gu)可能都会(x)被同时用到Q我q里介绍得比较浅显,具体实现q程中很多细节还需要大家慢慢熟(zhn)和体会(x)Q有时一个很的squid参数或者apache参数讄Q对于系l性能的媄响就?x)很大,希望大家一赯论,辑ֈ抛砖引玉之效?/span>
讨论大型高ƈ发负载网站的pȝ架构问题Q作者提Z几点Q?/span>
1. HTML静态化Q这可以通过CMS 自动实现Q?/span>
2. 囄服务器分(cM的,在视频网站中Q视频文件也应独立出来)Q?/span>
3. 数据库集和库表散列QOracle、MySQL{DBMS都有完美的支持;
4. ~存Q比如?Apache的Squid模块Q或者是开发语a的缓存模块,Q?/span>
5. |站镜像Q?/span>
6. 负蝲均衡?/span>
作者将负蝲均衡UCؓ(f)“是大型网站解决高负荷讉K和大量ƈ发请求采用的l极解决办法”Qƈ提出“一个典型的使用负蝲均衡的策略就是,在Y件或者硬件四层交?的基上搭建squid集群”。在实践时可以考虑建立应用服务器集和W(xu)eb服务器集,应用服务器集可以采用Apache+Tomcat集群?WebLogic集群{,W(xu)eb服务器集可以用反向代理Q也可以用NAT的方式,或者多域名解析均可?/span>
从提升网站性能的角度出发,静态资源不应和应用服务器放在一P数据库服务器也应? 量独立开来。在典型的MVC模式中,p来完成数据逻辑处理的,对系l性能有着臛_重要的媄响。以Java EEZQ在OO的设计思想中,我们pȝ的抽象、重用、可l护性,下层的更改不?x)扩散到上层逻辑Q强调系l移植的便捷性, 因而往往存在一U过分抽象的问题Q比如在Hibernate的基上再加入一层DAO的设计。另外一斚wQ却?x)忽视利用DBMS本n的优UҎ(gu)(存储q?E、触发器Q来完成高效的数据处理。诚Ӟ如果客户要求数据从OracleUL到MySQLQ那么DBMSҎ(gu)的东西少Q移植便容易。但事实上,?实践中,提出cMUL要求的情况非常少见,因此在做架构设计Ӟ不一定ؓ(f)了这U潜在的需求而大q牺牲系l的性能与稳定性。此外,我不采用分布式数据库 理l构Q这样带来的开销太大Q数据维护也是个头痛的问题,可能采用集中式的数据管理?/span>
在商业系l中Q算法逻辑本nq不复杂Q在q种情况下,E序设计本n的好坏不?x)对pȝ的性能造成致命的媄响。重要的影响因素反而变Y件系l架构本w。在?l的CORBA、J2EE、DCOM{对象模 型中Q我们看C家们对分布式对象计算的理论偏好,但实践证明,对象的分布带来的恶劣影响q远胜过其积极意义。这? 是现在轻量的开发框架受推崇的一个重要原因。如果能用简单的Q就不要用复杂的Q例如能够用Python、RoR完成的Q务,是否一定要用Java来做Q?我看未必。对于用h_(d)他们兛_的不是采用什么先q的技术,而是我们提供的品能否满他的需求。而且QPython、RoRq些开发工具已l强大到?以应对大部分|站应用Q在各种~存pȝ的帮助下Q在其他技术的协调配合下,完全能够胜Q高负载高q发的网站访问Q务?/span>
在HTML静态化斚wQ如果是对于更新相对较少的页面,可以q样处理Q例如新闅R社区通告、或者类g淘宝|的产品分类信息。但若数据更新频J,q样做的意义便不大?/span>
|站镜像是个传统的技术,更高U的应用来自媒体领域的CDN(Content Delivery Network)QCDN的概念可以由媒体数据扩展到囄、视频文件等静态资源的传输。不q,在电(sh)子商务领域,很少有这L(fng)应用?/span>
开源^台的高ƈ发集思考目前碰到的高ƈ发应用,需要高性能需求的主要是两个方?
1。网l?/span>
2。数据库
q两个方面的解决方式其实q是一致的
1。充分接q单机的性能瓉Q自我优?/span>
2。单机搞不定的时?数据传输瓉:单位旉内磁盘读?|络数据包的收发cpu计算瓉)Q把负荷分担l多台机器,是所谓的负蝲均衡
|络斚w单机的处?/span>
1。底层包收发处理的模式变?从select 模式到epoll / kevent)
2。应用模式的变化
2.1 应用层包的构造方?/span>
2.2 应用协议的实?/span>
2.3 包的~冲模式
2.4 单线E到多线E?/span>
|络负蝲均衡的几个办?/span>
1。代理模式:(x)代理服务器只收发包Q收到包以后转给后面的应用服务器(服务器群后可能还?x)有一堆堆的数据库服务器等{)Qƈ且把q回的结果再q回l请求端
2。虚拟代理ipQ代理服务器收发包还负蝲太高Q那增加多C理服务器Q都来管包的转发。这些代理服务器可以用统一的虚拟ipQ也可以单独的ip
3。p2pQ一些广播的数据可以p2p的模式来减轻服务器的|络压力
数据?指mysql)?机的处理
1。数据库本nl构的设计优化(分表Q分记录Q目的在于保证每个表的记录数在可定的范围内)
2。sql语句的优?/span>
3。master + slave模式
数据库集的处理
1。master + slave模式 Q可有效地处?q发查询Q?/span>
2。mysql cluster 模式 Q可有效地处理ƈ发数据变化)
我们知道Q对于一个大型网站来_(d)可~性是非常重要的,怎么样在U向和横向有良好的可伸羃性,需要在做架构设计的时候考虑C个分的原则,我想在多个方面说一下怎么分:(x)
首先是横向的分:(x)
1. 大的|站化解为多个小|站Q当我们一个网站有多个功能的时候,可以考虑把这个网站拆分成几个模块,每一个模块可以是一个网站,q样的话我们到时候就可以很灵zdLq些|站部vC同的服务器上?/p>
2. 静态动态分:(x)静态文件和动态文件最好分d?个网站,我们知道静态网站和动态网站对服务器来说压力的侧重不同Q前者可能重IO后者重CPUQ那么我?在选择g的时候也可以有侧重,而且静态和动态内容的~存{略也不一栗典型的应用Q我们一般会(x)有独立的文g或图片服务器。而且Q用不用的域名q可以提 高浏览器q行加蝲的能力?/p>
3. 按照功能来分Q比如有一个模块是负责上传的,上传操作很消耗时_(d)如果和其它应用在一L(fng)话很可能Q一点点讉K׃(x)使服务器瘫痪Q这U特D的模块应该分开。安全的不安全的也要分开Q还需要考虑C后SSL的购买?/p>
4. 我们不一定要全部用自q服务器,搜烦、报表可以依靠别人的服务Q比如google的搜索和报表服务Q自己做的不一定比得过别hQ服务器带宽都省了?/p>
其次是纵向的分:(x)
1. 文g也相当于数据库,IO的流量可能比数据库还大,q也是U向U别的访问,上传的文件图片一定要和W(xu)EB服务器分开。当Ӟ数据库和|站都放在一个服务器上的很少了,q是最基本的?/p>
2. 对于涉及(qing)到数据库讉K的动态程序来_(d)我们可以使用一个中间层Q所谓的应用层或逻辑层)来访问数据库Q部|在独立的服务器上)Q最大的好处是~存和灵z?性。缓存的内存占用比较大,我们要把它和|站q程分开Q而且q样做我们可以很方便的去改变一些数据访问的{略Q即使到时候数据库有分布的话在q里可以做一 个调配工作,q样灉|性就很大了。还有好处是中间层可以做늺|通桥梁,可能|通访问双U再讉K?sh)信会(x)比|通直接访问电(sh)信服务器快?/p>
有h说我不分Q我可以做负载均衡,对,是可以的Q但是如果分的话Q同L(fng)10台机器肯定比不分10台机器可以承受更多的讉K量,而且对硬件的需求可能不 ?x)很高,因?f)知道需要哪个硬件特别好。争取让每一个服务期都不I闲Q又都不是太忙,合理q行l合调整和扩充,q样的系l~性就高了Q能Ҏ(gu)讉K量来调整 的前提就是之前有考虑到分Q分的好处是灉|性、~性、隔L以?qing)安全性?/p>
Ҏ(gu)务器来说Q我们有几点是要长期观察的,M一炚w可能是瓶颈:(x)
1. CPUQ动态文件的解析需要比较多的CPUQCPU出现瓉p看是不是哪个功能q长旉占用U程Q如果是分出去。或者就是每一个请求处理时间不长,但是讉K量很高,那么加服务器。CPU是好东西Q不能让他干{,不做事情?/p>
2. 内存Q缓存从IISq程独立出去Q一般对WEB服务器来说内存不够的情况不是很多。内存比盘快,要合理利用?/p>
3. 盘I(y)OQ用性能监视器找到哪些文件IO特别大,扑ֈ了就分到独立的一l文件服务器上去Q或者直接做CDN。磁盘慢Q大规模d数据的应用靠~存Q大规模写入数据的应用可以靠队列来降低突发的q发?/p>
4. |络Q我们知道,|络的通讯是比较慢的,比磁盘还慢,如果是做分布式缓存,分布式计的话,要考虑到物理服务器之间|络通讯的时_(d)当然Q在量大了?后,q可以提高系l的接纳能力一个等U。静态内容可以借助CSD分担一部分Q在做服务器假设的时候还要考虑中国特色的电(sh)信网通情况以?qing)防火墙?/p>
对SQL SERVER数据库服务器来说Q?/p>
其实q是水^分割和纵向分Ԍ一个二l表Q水q_割就是横q来切一刀Q纵向分割就是竖直切一刀Q?/p>
1、纵向分割就是,我们不同的应用可以分C同的DB中,不同的实例中Q或者说把某个拥有很多字D늚表拆分成表?/p>
2、横向分割就是,某些应用可能不负载,比如用户注册Q但是用戯?x)非常大Q可以把大表分开。可以采用表分区Q数据存储在不同文g上,然后再部|到独立 物理服务器增加IO吞吐以改善读写性能Q土一点的做法是自己定期把老的数据存档。表分区的另外一个优势可以增加数据查询速度Q因为我们的늃引可以有?层了Q就像一个文件夹中的文g不要太多Q多分几层文件夹一栗?/p>
3、还可以通过数据库镜像、复制订阅、事物日志,把读写分开C同的镜像物理数据库上Q一般来说够用,如果q不行可以用g来实现数据库的负载均衡。当Ӟ对于BIQ我们可能还?x)有数据仓库?/p>
架构上考虑Cq些之后Q流量大了,可以在q个的基上再去调整或者做WEB服务器或者应用服务器的负载均衡。很多时候我们都是在重复发现问题-》找到瓶?》解册个过E?/p>
典型的架构如下:(x)
动态WEB服务器配好点的CPUQ静态WEB服务器和文g服务器磁盘好?br style="font-size:12px;" /> 应用服务器内存大点,~存服务器也是,数据库服务器当然内存和CPU都要?/p>
上次说的“?#8221;是一个比较大的原则也是一个比较高层的原则Q这ơ我惌一下其它两个原则:(x)q与换?/p>
q?/p>
Z么要分?是因为我们希望通过分来提高pȝ的承载能力,那ƈ又是q什么呢Q我想了一下有几个斚w可以qӞ(x)
1. 合ƈ用户hQ最基本的就是合qCSS/囄/脚本Q还可以合ƈ面。不q合q就可能产生量的浪费,需要有一个^衡点?/p>
2. 合ƈ接口的粒度,如果做分布式应用的话Q我们可能不?x)直接访问数据库而是调用应用层提供的接口Q由于是|络调用Q代h较大Q因此在设计的时候尽量提供粒度比较粗的接口,一ơ调用返回比较多的数据,而不是细化到d删除修改的层ơ?/p>
3. 合ƈ接口的部|Ԍ对于频繁的跨机器调用可以考虑有一些数据冗余,把跨|络的服务编E进E间通讯Q甚臌{到客L(fng)来做。比如论坛发贴时候脏词的qo(h)Q直接调用应用层提供的接口(跨机器)是可以的Q但是可能代h较大Q可以把q个接口使用IPC方式部v在本机?/p>
?/p>
旉换空_(d)I间换时间是常见的做法,具体一点说Q?/p>
1. ~存。缓存的重要性早计算机的g中就有重要的体现。对于网站,有很多种~存Q可以是客户端资源的~存Q可以是面输出~存Q也可以是应用层的数据缓存, 目的都是一L(fng)Q或是减了服务器请求次敎ͼ或是减少了请求的处理q程Q或是减了数据库的讉Kơ数。当Ӟ生成静态文件也可以是一U缓存。不讉K盘 固然不可能,但是我们要极大限度降低磁盘访问的Z(x)?/p>
2. 有的时候ؓ(f)了获取极快的响应Q我们还?x)不惜代价采用重复计。比如,我们的某个操作很可能?x)由于网l问题等原因响应比较慢,在设计的时候可以有一个统一?处理接口Q由q个接口分发C同的服务器去异步实现q个操作Q哪个服务器先返回了l果我们qq个l果Q然后杀d他服务器的冗余操作?/p>
3. |站一般追求比较快的响应,一般不太会(x)在比较高的层ơ用旉来换取空_(d)但是在一些用L(fng)有数据的处理法上可能还是会(x)考虑到空间的节省问题?/p>
4. 有的时候我们会(x)用一些聚合表来存放聚合数据,也就是进行一些预计算提高复杂计算Q比如报表)的性能。当Ӟ对于数据分析Q构建多l数据库也是一U不错的选择?/p>
有很多网友留a说说的比较粗Q没有什么具体的东西。我觉得架构q个东西很难去说具体怎么做,因ؓ(f)具体实施的时候要看情况去应用的,׃没有完美的东西,所 以做架构通常是去做一个^衡,很可能某一个侧重不同会(x)影响到架构的实施。希望我的这些文章能l大家一个提C的作用Q看了之后如果你觉得“q点我倒没有考虑 刎ͼ以后要注?#8221;那或许就是最大的帮助了,下面我想说一些其它方面的问题Q每一条都很零散,是一个补充吧Q?/p>
1. 到底是采用已有的东西q是自己d需要详l考虑的,采用别h的东西可能比较稳定,但是自己的控制少了一点,采用自己做的东西可以很灵z,但是可能?x)问题?较多。不怎么P我们在采用一个第三方框架的时候务必要q行~密的调查,看到他的不Q否则项目很可能在后期被q个框架制约Q反之,军_自己d一个框 架的时候也要看到自己需要什么其他框架不能提供的东西?/p>
2. 数据传输的时候可以做压羃Q但要考虑到压~解压羃需要CPU资源Q在IOQ磁盘,带宽Q传输能力)和CPU之间有一个^衡的考虑?/p>
3. 理想的可伸羃性架构是可以自由增加或替换服务器Q无需d机维护或做很大的调整。在使用一个统一的调度中心来调度q些服务器,分配h的时候,我们要考虑一下调度服务器能承受多流量?/p>
4. 使用大量的廉h务器q是量的高配服务器Q如何根据需求来l合服务器发挥最大作用?/p>
5. 对于分布式构Ӟ我们量让每一个节点保持简单的逻辑Q尽量减同一层次节点之间的依赖,另外。需要有l一的地Ҏ(gu)理所有的节点?/p>
6. 功能分解、用异步进行整合、故障{UR失效保护?/p>
7. 软g的架构升U和计算机硬件的架构升很像Q可能有一D|期,我们是在慢慢提高整体能力Q?q也才提高了几倍,之后发现只有通过某种d的架构改变才能提高数十倍的能力Q升U之后,我们或许又会(x)遇到其他问题。就像CPUQ是单提高主频还是彻底更换架构?/p>
8. 数据斚wQ读写分R数据库分隔、功能划分、缓存、镜像?/p>
9. g|络上的架构很重要,但Y件开发中的一些细节不可忽略,好的架构不意味着不需要代码审阅?/p>
1. PlentyOfFish |站架构学习(fn)
http://www.dbanotes.net/arch/plentyoffish_arch.html
采取 Windows 技术\U的 Web 2.0 站点q不多,除了 MySpace Q另外就是这?PlentyOfFish。这个站Ҏ(gu)? “Online Dating” 服务。一个o(h)人|z乐道的、惊人的数据是这个只有一个h(创徏人Markus FrindQ的站点价?10 亿,估计要让很多人眼热,更何?Markus Frind 每天只用两个时打理|站–可操作性很强嘛?/p>
2. 从LiveJournal后台发展?大型|站pȝ架构以及(qing)性能优化Ҏ(gu)
http://www.example.net.cn/archives/2006/03/olivejournaloio.html
LiveJournal?9q始于校园中的项目,几个人出于爱好做了这样一个应用,以实C下功能:(x)
* 博客Q论?/p>
* C会(x)性网l,扑ֈ朋友
* 聚合Q把朋友的文章聚合在一?/p>
LiveJournal采用了大量的开源YӞ甚至它本w也是一个开源Y件?/p>
在上U后QLiveJournal实现了非常快速的增长Q?/p>
* 2004q?月䆾Q?80万注册用戗?/p>
* 2005q?月䆾Q?80万注册用戗?/p>
* 2005q?月䆾Q?90万注册用戗?/p>
* 辑ֈ了每U钟上千ơ的面h?qing)处理?/p>
* 使用了大量MySQL服务器?/p>
* 使用了大量通用lg?/p>
3. YouTube 的架构扩?/p>
http://www.dbanotes.net/opensource/youtube_web_arch.html
在西雅图扩展性的技术研讨会(x)上,YouTube ?Cuong Do 做了关于 YouTube Scalability 的报告。视频内容在 Google Video 上有(地址)Q可惜国内用L(fng)不到?/p>
Kyle Cordes 对这个视频中的内容做了介l。里面有不少技术性的内容。值得分n一下?Kyle Cordes 的介l是本文的主要来?
4. WikiPedia 技术架构学?fn)分?/p>
http://www.dbanotes.net/opensource/wikipedia_arch.html
l基癄(WikiPedia.org)位列世界十大|站Q目前排名第八位。这是开攄力量?/p>
来点直接的数据:(x)
* 峰值每U钟3万个 HTTP h
* 每秒?3Gbit 量, q乎375MB
* 350 ?PC 服务?/p>
5. Tailrank |站架构
http://www.dbanotes.net/review/tailrank_arch.html
每天C千万计的 Blog 内容中,实时的热Ҏ(gu)什? Tailrank q个 Web 2.0 Startup 致力于回{这个问题?/p>
专门爆料|站架构?Todd Hoff ?Kevin Burton q行了采ѝ于是我们能了解一?Tailrank 架构的一些信息。每时索引 2400 万的 Blog ?FeedQ内容处理能力ؓ(f) 160-200MbpsQIO 写入大约?0-15MBps。每个月要处?52T 之多的原始数据。Tailrank 所用的爬虫现在已经成ؓ(f)一个独立品:(x)spinn3r?/p>
6. LinkedIn 架构W记
http://www.dbanotes.net/arch/linkedin.html
LinkedIn 雇员?180 个,?Web 2.0 公司中算是比较多的,不过人家自从 2006 q就盈利了,q在 Web 2.0 站点中可少的。用戯q?1600 万,现在每月新增 100 万,50Q??x)员来自?中国用户不少Q也包括?.
7. YahooQ社区架?/p>
http://www.dbanotes.net/arch/yahoo_arch.html
旧金׃D行的 QCon ?x)议带给我们很多新鲜的信息。虽然没Z(x)参加Q但是看看各个网?#8221;晒架?#8221;也是个比较过瘄事情。请参观q收藏这个页面:(x)Architectures you’ve always wondered about?/p>
8. Craigslist 的数据库架构
http://www.dbanotes.net/database/craigslist_database_arch.html
Craigslist l对是互联网的一个传奇公司。根据以前的一则报道:(x)
每月过 1000 万h使用该站服务Q月览量超q?30 亿次Q?Craigslist每月新增的帖子近 10 亿条??)|站的网|量在以每q近癑ր的速度增长。Craigslist 至今却只?18 名员?现在可能?x)多一些了)?/p>
9. Fotolog.com 的技术信息拾?/p>
http://www.dbanotes.net/review/fotolog_arch.html
管是世界上最大的囄服务|站, Fotolog.com 在国内的名气q不是很响亮, 每当提到囄服务, 很多人第一个会(x)惌v Flickr. 但实际上 Fotolog 也的是很猛? Alexa 上的排名一直在 Flickr 前面, 目前注册用户过 1100 ? 而前不久也卖了一个好价钱, 9000 万美? 下来的? 1 个注册用户大U?9 金. Yupoo 的刘q阳可以L(fng)算自己的网站如果卖l老外是怎样一个h(hun)g.
10. Digg |站架构
http://www.dbanotes.net/arch/digg_arch_cache_and_shard.html
Digg 工程师采?LAMP (Linux, Apache, MySQL and PHP) 模式。这?Alexa 排名?100 左右的、自我估?1.5 亿美金的站点目前有超q?100 台的 PC 服务?_了)Q可以粗略分成三个部分:(x)数据库服务器QW(xu)eb 服务器,搜烦服务器?/p>
11. Amazon ?Dynamo 架构
http://www.dbanotes.net/techmemo/amazon_dynamo.html
我在 DBAnotes.net 上记录过不少比较大的|站架构分析(eg: eBay [1], eBay [2]) QAmazon 一直找不到太多的资料。国庆期间读C一关?Amazon Dynamo 的论文,非常_ֽ。Amazon Dynamo q个高可用、可扩展存储体系支撑了Amazon 不少核心服务.
12. 财帮子(caibangzi.comQ网站架?/p>
http://www.dbanotes.net/arch/caibangzi_web_arch.html
财帮?caibangzi.com) 定位?#8221;基金理胦C”。是国内讉K量最大的Z Ruby on rails ?startup 目?#8220;理胦”q个词据说是光大银行发明的,且不ȝQ不可否认的是,目前国内”理胦”是个很有潜力的切入点。胦帮子|站潜在用户还是很大的?/p>
13. 了解一?Technorati 的后台数据库架构
http://www.dbanotes.net/web/technorati_db_arch.html
目前处理着大约 10Tb 核心数据, 分布在大U?20 台机器上.通过复制, 多增加了 100Tb 数据, 分布?200 台机器上. 每天增长的数?1TB. 通过 SOA 的运? 物理与逻辑的访问相隔离,g消除了数据库的瓶? 值得一提的? 该扩展过E始l是利用普通的g与开源Y件来完成? 毕竟 , Web 2.0 站点都不是烧q? 从数据量来看Q这l对是一个相Ҏ(gu)较大? Web 2.0 应用.
14. 说说大型高ƈ发高负蝲|站的系l架?/p>
http://www.toplee.com/blog/?p=71
我在CERNET做过拨号接入q_的搭建,而后在Yahoo&3721从事q搜索引擎前端开发,又在MOP处理q大型社区猫扑大杂烩的架?升{工作,同时自己接触和开发过不少大中型网站的模块Q因此在大型|站应对高负载和q发的解x案上有一些积累和l验Q可以和大家一h讨一下?/p>
15. 大型高负载网站架?的感?/p>
http://atman.memoab.com/articles/194
昨日认识了位健谈的IT人,原在verycd作系l管理的叶宁(q哥们现飘泊去见首都人民?.
以前sweaterl我介绍的他写的《大型高负蝲|站架构和应用初探? 他ȝ了很多信息和数据Q感谢叶宁的辛劳成果. q里我也惛_此PPT写些自己的感?
按需提供大型|站的架构设计,具体包括Q?/p>
A. 提供后台数据库设计:(x)Ҏ(gu)业务需求的理解Q针Ҏ(gu)定的数据库(늛Oracle,MySql,SqlServer,DB2Q提供网站项目的后台数据库设计?/p>
后台数据库的设计是整个网站最重要的环节,其结构定义通常定了后C务数据的存储方式以及(qing) l大部分后台数据讉K模型。对大型|站而言Q由于其需要支撑的负荷很大Q数据库设计关pd数据储存量,数据讉K效率Q缓存效率,数据安全{多个方面,?型网站的数据库设计原则与普通企业应用的设计原则有许多区别,需要经验丰富的架构师才能胜仅R?/p>
提供后台持久层设计:(x)持久层设计是在后台数据库设计的基上,Ҏ(gu)具体~程语言Q根据网站访问特征具体设计的~程框架。设计目标将兼顾处理效率和代码的可维护性、可理解性(如面向对象)?/p>
B. 提供~存设计Q根据业务需求,l合后台数据库设计和后台持久层设计,提供|站的缓存设计方案。具体包括前端缓存,׃n数据~存Q分布式~存?/p>
所谓前端缓存,指把|页上短期内不太变化的内宏V根据访问效率评伎ͼ通过片段形式以一定策略缓存v来,从而减后台内容生成的旉Q提升网站的响应效率和节省服务器的处理资源占用?/p>
所谓共享数据缓存,指把后台中公q数据Ҏ(gu)讉K频度和更新频度以一定策略在服务器缓存v来,避免每次使用都需要从数据库或盘提取?/p>
所谓分布式~存Q指大型|站需要利用分布式的缓存来在多台集机器之间共享某些处理结果内宏V?/p>
C. 提供MVCQModel-View-ControllerQ框架设计:(x)Ҏ(gu)业务需求和|站特点提供合适的、高效的MVC处理框架?/p>
MVC是Web应用前端的重要架构组成,|站交互的绝大部分内容将集中在这个部分,一套高效而易于扩展和使用的MVC框架是整个网站中重要l成?/p>
D. 提供安全框架Q根据业务需要和数据安全保护的需要,提供|站安全框架?/p>
E. 提供SEOQSearch Engine Optimize)Ҏ(gu)Q面向搜索引擎提供网站搜索优化方案?/p>
F. 提供备䆾Ҏ(gu)Q根据业务需要提供针对不同^台的数据Q代码、数据、用戯料){备份方案?/p>
q里的大型网站架构只包括高互动性高交互性的数据型大型网站,Z大家众所周知的原因,我们׃谈新ȝ和一些依靠HTML静态化可以实现的架构 了,我们以高负蝲高数据交换高数据动性的|站ZQ比如v内,开心网{类似的web2.0pd架构。我们这里不讨论是PHPq是JSP或?NET?境,我们从架构的斚wȝ问题Q实现语a斚wq不是问题,语言的优势在于实现而不是好坏,不论你选择M语言Q架构都是必要面对的?/p>
q里讨论一下大型网站需要注意和考虑的问?/p>
1、v量数据的处理
众所周知Q对于一些相对小的站Ҏ(gu)_(d)数据量ƈ不是很大Qselect和update可以解x们面对的问题Q本w负载量不是很大Q最多再加几?索引可以搞定。对于大型网站,每天的数据量可能׃百万Q如果一个设计不好的多对多关p,在前期是没有M问题的,但是随着用户的增长,数据量会(x)是几?U的增长的。在q个时候我们对于一个表的select和update的时?q不说多表联合查?的成本的非常高的?/p>
2、数据ƈ发的处理
在一些时候,2.0的CTO都有个尚方宝剑,是~存。对于缓存,在高q发高处理的时候也是个大问题。在整个应用E序下,~存是全局׃n的,然而在 我们q行修改的时候就Q如果两个或者多个请求同时对~存有更新的要求的情况下Q应用程序会(x)直接的死掉。这个时候,需要一个好的数据ƈ发处理策略以?qing)缓?{略?/p>
另外Q就是数据库的死锁问题,也许qx我们感觉不到Q死锁在高ƈ发的情况下的出现的概率是非常高的Q磁盘缓存就是一个大问题?/p>
3、文件存贮的问题
对于一些支持文件上传的2.0的站点,在庆q硬盘容量越来越大的时候我们更多的应该考虑的是文g应该如何被存储ƈ且被有效的烦引。常见的Ҏ(gu)是对?件按照日期和cdq行存贮。但是当文g量是量的数据的情况下,如果一块硬盘存贮了500个G的琐文Ӟ那么l护的时候和使用的时候磁盘的Io是一?巨大的问题,哪怕你的带宽够,但是你的盘也未必响应过来。如果这个时候还涉及(qing)上传Q磁盘很Ҏ(gu)over了?/p>
也许用raid和专用存贮服务器能解决眼下的问题Q但是还有个问题是各地的访问问题,也许我们的服务器在北京,可能在云南或者新疆的讉K速度如何解决?如果做分布式Q那么我们的文g索引以及(qing)架构该如何规划?/p>
所以我们不得不承认Q文件存贮是个很不容易的问题
4、数据关pȝ处理
我们可以很容易的规划Z个符合第三范式的数据库,里面布满了多对多关系Q还能用GUID来替换INDENTIFY COLUMN 但是Q多对多关系充斥?.0时代Q第三范式是W一个应该被抛弃的。必L效的把多表联合查询降到最低?/p>
5、数据烦引的问题
众所周知Q烦引是提高数据库效率查询的最斚w最廉h(hun)最Ҏ(gu)实现的方案。但是,在高UPDATE的情况下Qupdate和delete付出的成本会(x)高的无法xQ笔者遇到过一个情况,在更C个聚焦烦引的时候需?0分钟来完成,那么对于站点来说Q这些基本上是不可忍受的?/p>
索引和更新是一对天生的冤家Q问题AQDQEq些是我们在做架构的时候不得不考虑的问题,q且也可能是p旉最多的问题Q?/p>
6、分布式处理
对于2.0|站׃光互动性,CDN实现的效果基本上?Q内Ҏ(gu)实时更新的,我们常规的处理。ؓ(f)了保证各地的讉K速度Q我们就需要面对一个绝大的问题Q就是如何有效的实现数据同步和更斎ͼ实现各地服务器的实时通讯有是一个不得不需要考虑的问题?/p>
7、Ajax的利弊分?/strong>
成也AJAXQ|也AJAXQAJAX成ؓ(f)了主趋势,H然发现ZXMLHTTP的post和get是如此的Ҏ(gu)。客L(fng)get或者post 到服务器数据Q服务器接到数据h之后q回来,q是一个很正常的AJAXh。但是在AJAX处理的时候,如果我们使用一个抓包工L(fng)话,Ҏ(gu)据返回和?理是一目了然。对于一些计量大的AJAXh的话Q我们可以构造一个发包机Q很Ҏ(gu)可以把一个webserverq掉?/p>
8、数据安全性的分析
对于HTTP协议来说Q数据包都是明文传输的,也许我们可以说我们可以用加密啊,但是对于G问题来说的话Q加密的q程可能是明文?比如我们知道 的QQQ可以很Ҏ(gu)的判断他的加密,q有效的写一个跟他一L(fng)加密和解密方法出来的)。当你站Ҏ(gu)量不是很大的时候没有h?x)在乎你Q但是当你流量上来之 后,那么所谓的外挂Q所谓的发׃(x)接踵而来(从qq一开始的发可见端?。也许我们可以很的意的说Q我们可以采用更高别的判断甚至HTTPS来实 玎ͼ注意Q当你做q些处理的时候付出的是量的databaseQio以及(qing)CPU的成本。对于一些群发,基本上是不可能的。笔者已l可以实现对于百度空 间和qqI间的群发了。大家愿意试试,实际上ƈ不是很难?/p>
9、数据同步和集群的处理的问题
当我们的一台databaseserver不堪重负的时候,q个时候我们就需要做Z数据库的负蝲和集了。而这个时候可能是最让h困扰的的问题 了,数据Z|络传输Ҏ(gu)数据库的设计的不同,数据延迟是很可怕的问题Q也是不可避免的问题Q这L(fng)话,我们需要通过另外的手D|保证在这延迟的几U或 者更长的几分钟时间内Q实现有效的交互。比如数据散列,分割Q内容处理等{问?/p>
10、数据共享的渠道以及(qing)OPENAPI势
Openapi已经成ؓ(f)一个不可避免的势Q从googleQfacebookQmyspace到v内校内,都在考虑q个问题Q它可以更有效的留住 用户q激发用L(fng)更多的兴以?qing)让更多的h帮助你做最有效的开发。这个时候一个有效的数据׃nq_Q数据开攑^台就成ؓ(f)必不可少的途径了,而在开攄接口 的情况保证数据的安全性和性能Q又是一个我们必要认真思考的问题了?/p>