网站架构设计方案

 

网站架构设计方案

 目 录

1      设计思路.... 3

2      系统结构.... 3

3      网络规划及性能计算.... 3

3.1       网络架构... 3

3.2       网络架构说明... 4

3.2.1        采用双防火墙双交换机做网络冗余,保障平台服务... 4

3.2.2        采用硬件设备负载均衡器,实现网络流量的负载均衡... 4

3.3       系统测算... 4

3.3.1        系统处理能力要求... 4

3.3.2        业务处理能力要求... 4

3.3.3        系统话务模型... 4

3.4       配置核算... 5

3.4.1        数据库服务器性能核算... 5

3.4.2        WEB服务器集群性能核算... 5

3.4.3        WEB服务器集群内存性能核算... 5

3.4.4        网络带宽... 5

4      性能模拟测试及性能推算.... 6

4.1       测试环境... 6

4.2       测试结果... 8

4.2.1        1个客户端模拟不同线和并发请求结果... 8

4.2.2        10个客户端请求... 8

4.3       结果分析... 9

4.4       根据测试结果推算... 9

4.5       设备清单... 11

4.5.1        硬件设备配置清单... 11

4.5.2        设备技术规格... 12

4.6       平台扩容的建议... 12


1     网站的性能瓶颈分析

网站的性能影响因素很多,下面主要从如下4个方面进行分析说明:

1)     网络负载

a)      公网负载

b)     内网负载

2)     WEB应用服务器性能

a)      CPU

b)     存储,I/O访问

c)      内存

d)     并发TCP/IP连接数

3)     数据库服务器性能

a)      数据库参数配置

b)     服务器性能(CPU、内存、存储)

c)      数据结构的合理性

4)     不同WEB应用的处理方式而对不同的性能瓶颈

a)      对于静态的网站:

静态的HTML页面严格地由标准的HTML标示语言构成,并不需要服务器端即时运算生成。这意味着,对一个静态HTML文档发出访问请求后,服务器端只是简单地将该文档传输到客户端。从服务器运行的那个时间片来看,这个传输过程仅仅占用了很小的CPU资源。对于静态HTML的访问瓶颈为:网络带宽、磁盘I/O以及cache(高速缓冲存储器)。

b)     对于动态页面

因为服务器解析动态页面必须在其传输到客户端前就通过服务器来进行解释,这样就会给应用服务器添加额外的性能消耗,如果进一步要访问数据库,则会增加数据库服务器的性能消耗,则动态页面还有额外的瓶颈:应用服务器的性能,数据库服务器的性能。

2     系统架构设计

2.1     总体思路

为提高网站的高并发性能,提高开发效率及运营效率,主要按如下几个思路进行规划设计:

2.1.1      负载均衡

1)  四层交换负载均衡:

采用负载均衡器来实现硬件级的四层交换负载均衡,或采用LVS来实现软件的四层交换负载均衡。

2)  通过第三方软件来实现负载均衡,同时实现页面请求的缓存。

通过Nginx实现反向代理服务器集群,同时搭建squid集群以作为静态页面和图片的缓存。

3)  通过web服务器的配置来实现负载均衡

即通过apache或是Nginx 将客户请求均衡的分给tomcat1,tomcat2....去处理。

2.1.2      WEB应用开发架构思路

1)  应用开发实现MVC架构三层架构进行web应用开发

2)  页面尽可能静态化以减少动态数据访问,如果是资讯类的网站可以考虑采用第三方开源的CMS系统来生成静态的内容页面。

3)  采用Oscache实现页面缓存,采用Memcached实现数据缓存

4)  采用独立的图片服务器集群来实现图片资源的存储及WEB请求

2.1.3      数据存储的设计思路

1)  数据库拆分,把生产数据库和查询数据库分离,对生产数据库采用RAC实现数据库的集群。

2)  采用高效的网络文件共享策略,采用图片服务器来实现页面的图片存储。

2.1.4      不同网络用户访问考虑

1)    通过引入CDN来解决不同网络服务商的接入速度问题,一般只能解决静态页面的访问问题。

2)    在不同运营商机房部署服务器,通过镜像技术来实现不同网络服务商的接入速度问题。

 

2.2     总体架构

2.2.1      网站的系统分层架构

2.2.2      网站的物理架构

 

 

2.2.3      网站的开发架构

2.2.4     网络拓扑结构

备注:

1)       采用双防火墙双交换机做网络冗余,保障平台服务

采用双防火墙通知接通2线路互联网接入,设备之间采用VRRP协议,在任何一个防火墙、互联网发生故障后均可自动将流量切换到另一端,保证网站的正运行,设备或网络恢复后,自动恢复。

采用双千兆交换机分别接在2台防火墙上,当某台设备或者网络链路发生故障后,好设备自动接管已坏设备的工作,不影响网站的整体运行,根据业务及真实服务器的数量,交换机可以随时增加。

2)       采用硬件设备负载均衡器,实现网络流量的负载均衡

使用硬件设备负载均衡器,将网络流量均衡的分担到WEB服务器集群各节点服务器,保障平台服务器资源均衡的使用。

3)       采用代理服务器,实现软件级的网络负载均衡。

4)        数据库服务器分离成生产数据库集群和查询数据库集群,实现生产读写与后台查询统计进行分离,同时生产数据库采用rac技术进行

 

 

2.3     架构涉及技术的详解

2.3.1      负载均衡

1.  基于DNS的负载均衡--一个域名绑定多个IP

DNS负载均衡技术是最早的负载均衡解决方案,它是通过DNS服务中的随机名字解析来实现的,在DNS服务器中,可以为多个不同的地址配置同一个名字,而最终查询这个名字的客户机将在解析这个名字时得到其中的一个地址。因此,对于同一个名字,不同的客户机会得到不同的地址,它们也就访问不同地址上的Web 服务器,从而达到负载均衡的目的。

这种技术的优点是,实现简单、实施容易、成本低、适用于大多数TCP/IP应用;但是,其缺点也非常明显,首先这种方案不是真正意义上的负载均衡,DNS 服务器将Http请求平均地分配到后台的Web服务器上,而不考虑每个Web服务器当前的负载情况;如果后台的Web服务器的配置和处理能力不同,最慢的 Web服务器将成为系统的瓶颈,处理能力强的服务器不能充分发挥作用;其次未考虑容错,如果后台的某台Web服务器出现故障,DNS服务器仍然会把DNS 请求分配到这台故障服务器上,导致不能响应客户端。最后一点是致命的,有可能造成相当一部分客户不能享受Web服务,并且由于DNS缓存的原因,所造成的后果要持续相当长一段时间(一般DNS的刷新周期约为24小时)。所以在国外最新的建设中心Web站点方案中,已经很少采用这种方案了。

2.  通过硬件四层交换实现负载均衡

在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了

3.  通过软件四层交换实现负载均衡

软件四层交换我们可以使用Linux上常用的LVS来解决,LVS就是Linux Virtual Server,他提供了基于心跳线heartbeat的实时灾难应对解决方案,提高系统的鲁棒性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时满足多种应用需求,这对于分布式的系统来说必不可少。

一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性。

4.  通过反向代理服务器实现负载均衡

反向代理服务器又称为 WEB 加速服务器,它位于 WEB 服务器的前端,充当WEB服务器的内容缓存器,反向代理服务器是针对 WEB 服务器设置的,后台 WEB 服务器对互联网用户是透明的,用户只能看到反向代理服务器的地址,不清楚后台 WEB 服务器是如何组织架构的。当互联网用户请求 WEB 服务时,DNS 将请求的域名解析为反向代理服务器的 IP 地址,这样 URL 请求将被发送到反向代理服务器,由反向代理服务器负责处理用户的请求与应答、与后台WEB 服务器交互。利用反向代理服务器减轻了后台 WEB 服务器的负载,提高了访问速度,同时避免了因用户直接与 WEB 服务器通信带来的安全隐患。

 

目前有许多反向代理软件,比较有名的有 Nginx 和 Squid 。

Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

Squid是由美国政府大力资助的一项研究计划,其目的为解决网络带宽不足的问题,支持HTTP,HTTPS,FTP 等多种协议,是现在Unix 系统上使用、最多功能也最完整的一套软体。

1)       Squid

Squid 是一个开源的软件,利用它的反向代理技术可以提高网站系统的访问速度,下面将重点介绍 Squid 反向代理的实现原理和在提高网站性能方面的应用。

Squid反向代理服务器位于本地 WEB 服务器和 Internet 之间 , 组织架构如下图:

客户端请求访问 WEB 服务时,DNS 将访问的域名解析为 Squid 反向代理服务器的 IP 地址,这样客户端的 URL 请求将被发送到反向代理服务器。如果 Squid 反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端,否则反向代理服务器将向后台的 WEB 服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。

Squid 反向代理一般只缓存可缓冲的数据(比如 html 网页和图片等),而一些 CGI 脚本程序或者 ASP、JSP 之类的动态程序默认不缓存。它根据从 WEB 服务器返回的 HTTP 头标记来缓冲静态页面, 有四个最重要 HTTP 头标记:

  • Last-Modified: 告诉反向代理页面什么时间被修改
  • Expires: 告诉反向代理页面什么时间应该从缓冲区中删除
  • Cache-Control: 告诉反向代理页面是否应该被缓冲
  • Pragma: 用来包含实现特定的指令,最常用的是 Pragma:no-cache

注:DNS的轮询机制将某一个域名解析为 多个IP地址。

2)       Nginx

Nginx (“engine x”) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器。

Nginx 已经在俄罗斯最大的门户网站── Rambler Media(www.rambler.ru)上运行了4年时间,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。

在国内,已经有新浪博客、新浪播客、搜狐通行证、网易新闻、网易博客、金山逍遥网、金山爱词霸、校内网、YUPOO相册、豆瓣、迅雷看看等多家网站、频道使用 Nginx 服务器。

Nginx 特点如下:

1)       工作在OSI模型的第7层(应用层)

2)       高并发连接

官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。

3)       内存消耗少

在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。

4)       配置文件非常简单

风格跟程序一样通俗易懂。

5)       成本低廉

Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币。

6)       支持Rewrite重写规则

能够根据域名、URL的不同,将 HTTP 请求分到不同的后端服务器群组。

7)       内置的健康检查功能

如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。

8)       节省带宽

支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。

9)       稳定性高

用于反向代理,宕机的概率微乎其微。

 

3)       Nginx+squid页面缓存来实现反向代理负载均衡

通过Nginx反向代理和squid缓存实现动静分离的架构图如下所示:

 

5.  Apache +tomcat集群实现负载均衡。

使用 apache和多个tomcat 配置一个可以应用的web网站,用Apache进行分流,把请求按照权重以及当时负荷分tomcat1,tomcat2...去处理,要达到以下要求:

1)  Apache 做为HttpServer ,通过mod_jk连接器连接多个 tomcat 应用实例,并进行负载均衡。

2)  同时还要配置session复制,也就是说其中任何一个tomcat的添加的session,是要同步复制到其它tomcat, 集群内的tomcat都有相同的session,并为系统(包括 Apache 和 tomcat)设定Session 超时时间。

2.3.2      缓存

1.  系统架构方面的缓存
1)       Squid缓存

       架构方面使用Squid进行缓存。

注:SQUID使用了LM算法,LM就是页面Header里时间(Date)和Last-Modified时间的差。Date一般是Squid从后面取页面的时间,Last-Modified 一般是页面生成时间。

2)       Nginx的缓存功能

Nginx从0.7.48版本开始,支持了类似Squid的缓存功能;

缓存把URL及相关组合当作Key,用md5编码哈希后保存;

Nginx的Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面;

采用MMAP实现,设置的缓存区大小不能超过物理内存+SWEB的值

3)       基于memcached的缓存

nginxmemcached有所支持,但是功能并不是特别之强,性能上还是非常之优秀。

location /mem/ {
    if ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
    {
     set $memcached_key "$1";
     memcached_pass    192.168.1.2:11211;
    }
    expires 70;
}

这个配置会将http://sudone.com/mem/abc指明到memcachedabc这个key去取数据。

Nginx目前没有写入memcached的任何机制,所以要往memcached里写入数据得用后台的动态语言完成,可以利用404定向到后端去写入数据。

Nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid对于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如:http://sudone.com/?和http://sudone.com/在squid上会被当做两个链接,所以会造成两次穿透;而nginx只会保存一次,无论链接变成http://sudone.com/?1还是http://sudone.com/?123,均不能透过nginx缓存,从而有效地保护了后端主机。

nginx会非常老实地将链接形式保存到文件系统中,这样对于一个链接,可以很方便地查阅它在缓存机器上的缓存状态和内容,也可以很方便地和别的文件管理器如rsync等配合使用,它完完全全就是一个文件系统结构。

2.  应用程序方面的缓存
1)       OSCache

OSCache由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能,OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。OSCache有以下特点:缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。拥有全面的API--OSCacheAPI给你全面的程序来控制所有的OSCache特性。永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)。

OSCache是当前运用最广的缓存方案,JBoss,Hibernate,Spring等都对其有支持。

OSCache的特点:

1) 缓存任何对象:你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。

2) 拥有全面的API:OSCache API允许你通过编程的方式来控制所有的OSCache特性。

3) 永久缓存:缓存能被配置写入硬盘,因此允许在应用服务器的多次生命周期间缓存创建开销昂贵的数据。

4) 支持集群:集群缓存数据能被单个的进行参数配置,不需要修改代码。

5) 缓存过期:你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不能满足需要时)。

2)       Memcached

memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

Memcached是以Key/Value的形式单个对象缓存。

 

3)       自主开发的内存数据缓存服务
a)独立进程方式的缓存服务

对于一些常用的动态数据通过开发程序服务缓存在内存中,提供给其他子系统调用,如下面的数据就可以通过这样方式进行缓存。

1)    用户基本信息及状态的信息缓冲

2)    列表缓存,就像论坛里帖子的列表

3)    记录条数的缓存,比如一个论坛板块里有多少个帖子,这样才方便实现分页。

4)    复杂一点的group,sum,count查询,比如积分的分类排名

b)       集成在WEB应用中的内存缓存

在web应用中对于热点的功能,考虑使用完全装载到内存,保证绝对的响应速度,对于需要频繁访问的热点数据,采用集中缓存(多个可以采用负载均衡),减轻数据库的压力,比如:很多配置信息,操作员信息等等。

2.3.3      页面静态化

静态的HTML页面严格地由标准的HTML标示语言构成,并不需要服务器端即时运算生成。这意味着,对一个静态HTML文档发出访问请求后,服务器端只是简单地将该文档传输到客户端。从服务器运行的那个时间片来看,这个传输过程仅仅占用了很小的CPU资源。

页面静态化就是采用效率最高、消耗最小的纯静态化的html页面来替换动态页面。我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

同时采用第三方开源的CMS系统来实现网站内容的管理。对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现页面静态化,所以我们需要引入常见的信息发布系统(CMS),信息发布系统(CMS)可以实现最简单的信息录入自动生成静态页面,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。

同时,HTML静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用HTML静态化来实现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。

在进行html静态化的时候还可以使用一种折中的方法,就是前端继续使用动态实现,在一定的策略下通过后台模块进行定时把动态网页生成静态页面,并定时判断调用,这个能实现很多灵活性的操作。

为了提高静态HTML的访问效率,主要可以对以下几个方面进行优化:网络带宽、磁盘I/O以及cache(高速缓冲存储器)。

 

2.3.4      数据库配置及优化

1.  数据库集群

       对生产数据库采用RAC实现数据库的集群。

2.  数据库及表的散列

把生产数据库和查询数据库进行分离,针对系统业务数据的特点,把大的表进行拆分,对于访问较多的表采用分区表。

使用读/写数据库分离,随着系统变得越来越庞大,特别是当它们拥有很差的SQL时,一台数据库服务器通常不足以处理负载。但是多个数据库意味着重复,除非你对数据进行了分离。更一般地,这意味着建立主/从副本系统,其中 程序会对主库编写所有的Update、Insert和Delete变更语句,而所有Select的数据都读取自从数据库(或者多个从数据库)。

尽管概念上很简单,但是想要合理、精确地实 现并不容易,这可能需要大量的代码工作。因此,即便在开始时使用同一台数据库服务器,也要尽早计划在PHP中使用分离的DB连接来进行读写操作。如果正确地完成该项工作,那么系统就可以扩展到2台、3台甚至12台服务器,并具备高可用性和稳定性。

3.  拥有良好的DB配置和备份

很多公司都没有良好的备份机制,也不知道如 何恰当地完成这项工作。只有imp是不够的,还需要进行热备份,从而得到超快的速度和超高的可靠性。

另外,在将所有备份文件从服务器上转移出来之前要进行压缩和加密。另外还要确保拥有设计合理的、有用的关于安全、性能和稳定性问题的设定,包括防止数据败坏,其中很多设定都是非常重要的。

2.3.5      文件存储

1.  文件共享
1)       HDFS(GFS)

HDFS是Apache Hadoop项目中的一个分布式文件系统实现,基于Google于2003年10月发表的Google File System(GFS)论文。

n  特性

1)    硬件要求低

2)    高容错性

3)    易可扩展

4)    配置简单

5)    超大文件

HDFS采用master/slave架构。

  一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。

 

2)       NFS与GFS比较

首先从它们的功能上进行分析。NFS即网络文件系统,是由SUN公司开发的。它是FreeBSD支持的文件系统中的一种,允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序访问远端系统上的文件就像访问本地文件一样。

而GFS是Google为了满足本公司迅速增长的数据处理要求而开发的文件系统。GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它是针对Google的计算机集群进行设计的,专门是为Google页面搜索的存储进行了优化。

所以从功能上看,它们两者是完全不同的概念。

其次从结构上比较,NFS至少包括两个主要部分:一台服务器,以及至少一台客户机。被共享的目录和文件存放在服务器上,客户机远程地访问保存在服务器上的数据。

GFS则由一台Master(通常有几台备份)和若干台TrunkServer构成。GFS中文件备份成固定大小的Trunk分别存储在不同的 TrunkServer上,每个Trunk有多份(比如3)拷贝,也存储在不同的TrunkServer上。Master负责维护GFS中的 Metadata,即文件名及其Trunk信息。客户端先从Master上得到文件的Metadata,根据要读取的数据在文件中的位置与相应的TrunkServer通信,获取文件数据。

再从跨平台性上,NFS的基本原则是“容许不同的客户端及服务端通过一组RPCs分享相同的文件系统”,它是独立于操作系统的,容许不同的操作系统共同地进行文件的共享。

而GFS则没有这一特点,文件只能被集群系统中的PC所访问,而且这些PC的操作系统一般是Linux。

最后从规模上比较,HDFS只应用在大批量的数据共享上。目前Google拥有超过200个的GFS集群,其中有些集群的PC数量超过5000台。集群的数据存储规模可以达到5个PB,并且集群中的数据读写吞吐量可达到每秒40G。

而NFS一般没有这么巨大的规模。

2.  文件的多服务器自动同步

  使用Linux 2.6内核的inotify监控Linux文件系统事件。

  利用开源的lsync监听某一目录,如果目录内文件发生增、删、改,利用Rsync协议自动同步到多台服务器。

3.  图片服务器分离

  特别是如果程序与图片都放在同一个 APAHCE 的服务器下,每一个图片的请求都有可能导致一个 HTTPD 进程的调用。

使用独立的图片服务器不但可以避免以上这个情况,更可以对不同的使用性质的图片设置不同的过期时间,以便同一个用户在不同页面访问相同图片时不会再次从服务器(基于是缓存服务器)取数据,不但快速,而且还省了带宽。还有就是,对于缓存的时间上,亦可以做独立的调节。

2.3.6      网络问题解决方案

你不可能要求所有的使用人员,都和你的服务器在一个运营商的网络内,而不同网络之间访问速度会很慢,我们可以采用镜像网站和引入CDN来解决这一问题。

1.  智能DNS解析

我们可以在不同的网络运营商部署web服务器,通过linux上的rsync工具自动同步到不同网络接入商的web服务器上,以作为主站的镜像。

然后通过配置智能DNS解析来引导不同网络的访问用户到对应的网络运营商的web服务器。

2.  CDN

如果有足够的投资,也可以采用CDN(内容分发网),把静态内容(静态页面和图片)进行CDN缓存,以减轻服务器压力。

CDN的全称是Content Delivery Network,即内容分发网络。它采取了分布式网络缓存结构(即国际上流行的web cache技术),其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",使用户可以就近取得所需的内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的用户访问网站响应速度慢的问题。 (也就是一个服务器的内容,平均分部到多个服务器上,服务器智能识别,让用户获取离用户最近的服务器,提高速度。

目前,国内访问量较高的大型网站如新浪、网易等,均使用CDN网络加速技术,虽然网站的访问巨大,但无论在什么地方访问都会感觉速度很快。而一般的网站如果服务器在网通,电信用户访问很慢,如果服务器在电信,网通用户访问又很慢。

2.3.7      WEB应用开发架构设计思路

1.  基于MVC的三层应用开发架构

应用开发实现MVC三层架构进行web应用开发,采用ibatis作为持久层框架,c3p0作为数据库连接池。

iBATIS 是一个可以设计和实现更好的 Java 应用程序持久化层的框架。iBATIS 把对象和存储过程或者使用 XML 描述符的 SQL 语句进行了关联。简单是 iBATIS 最大的优势

 

n  ibatis-使用ibatis的十个理由

1. 至少能操作10种以上的数据库
2. 可配置的caching(包括从属)
3. 支持DataSource、localtransaction managemen和global transaction
4. 简单的XML配置文档
5. 支持Map, Collection, List和简单类型包装(如Integer, String)
6. 支持JavaBeans类(get/set 方法)
7. 支持复杂的对象映射(如populating lists,complex object models)
8. 对象模型从不完美(不需要修改)
9. 数据模型从不完美(不需要修改)
10. 你已经知道SQL,为什么还要学习其他东西

 

1)       MVC架构示意

2)       Struts架构

客户端发送一个HTTP请求,通过Struts框架最后获得一个HTTP响应,这一过程非常重要,它是理解Struts框架的重点。上图描述了Struts框架的结构,而下图通过一个活动图更具体描述接受请求直至返回响应的整个过程:

 

2.  面向服务的应用架构

面向服务的应用架构是指构建可分布式的、去中心化的服务器平台,以提供许多不同的应用,数据库被分成很多个小部分,围绕每个部分都会创建一个服务接口(API),并且该接口是访问数据库的唯一途径。最终数据库演变成一个非常庞大的共享资源。

这种架构是松散耦合的,并且围绕着服务进行构建。面向服务的架构提供给他们隔离特性,一个服务可能有很多台数据库服务器,他们之间的数据是相通的,而对外他们的接口只有一个,外面是无法知道这个服务后面的数据组织是如何搭建的。

这样就有了越来越多的应用服务器。这些应用服务器从数据众多的服务(每个服务背后都有数据库或集群数据库)中聚合信息,然后生成我们所看到的Amazon.com的各个网站页面。

这样各种服务如插件一样组成了一个开放的平台,这样团队的规模就会比较小,比较灵活。

注Amazon就是采用了这种架构来构 建的,它拥有上千台服务器。

2.4     系统软件参数优化

在一定的架构基础上,要提高并发处理能力则需要调整服务器的操作系统内核参数、web服务器(tomcat的参数、apache的参数、Nginx的参数),以使其性能达到最优化。

2.4.1      操作系统优化

调整系统的内核参数,增大连接数及TCP/IP的超时设置。

Linux系统中:

在/etc/sysctl.conf配置文件中增加如下内核参数:

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_fin_timeout = 5

2.4.2      tomcat服务器优化

增大并发连接数,调整内存参数的设置。

1、JDK内存优化:

当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。 Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大.

Tomcat默认可以使用的内存为128MB,Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置: JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】' 需要把这个两个参数值调大。例如: JAVA_OPTS='-Xms256m -Xmx512m' 表示初始化内存为256MB,可以使用的最大内存为512MB。

2、连接器优化: 在tomcat配置文件server.xml中的配置中,和连接数相关的参数有:

maxThreads: Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值150。

acceptCount: 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。

minSpareThreads: Tomcat初始化时创建的线程数。默认值25。

maxSpareThreads: 一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值75。

enableLookups: 是否反查域名,默认值为true。为了提高处理能力,应设置为false

connnectionTimeout: 网络连接超时,默认值60000,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

maxKeepAliveRequests: 保持请求数量,默认值100。 bufferSize: 输入流缓冲大小,默认值2048 bytes。

compression: 压缩传输,取值on/off/force,默认值off。 其中和最大连接数相关的参数为maxThreads和acceptCount。如果要加大并发连接数,应同时加大这两个参数。

web server允许的最大连接数还受制于*作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。

 

 

2.4.3      apache服务器优化

加大并发数量和关闭不需要的模块。因为apache非常消耗内存,尽量轻量化。

Apache在配置ContentType的时候可以尽量少支持,尽可能少的LoadModule,保证更高的系统消耗和执行效率

同时配置apache和tomcat的组合使之能作到动静分离,apache处理静态页面,tomcat处理动态页面。

在处理静态页面或者图片、js等访问方面,可以考虑使用lighttpd代替Apache,它提供了更轻量级和更高效的处理能力

2.4.4      Nginx服务器的优化

worker_processes:该参数的值最好跟cpu核数相等,能够发挥最大性能,如果nginx所在服务器为2颗双核cpu,则建议设定为4。

3     Web服务架构评测

主要对基于tomcat和nginx+tomcat的web服务器的处理性能进行测试,以作为不同性能要求下架构选型的依据

3.1      测试环境

3.1.1     网络环境

1.  内网带宽

Ø  千M内网。

Ø  内网ping包延迟:< 0.1ms

2.  网络拓扑示意

3.1.2     服务器配置

设备

硬件配置

操作系统

Nginx

IBM X3650

CPU: Intel(R) Xeon(R) E5150 2.66GHz 2核*2

内存:4G

千兆网卡

Redhat linux as4

Tomcat1

Hp DL580 G4

CPU: Intel(R) Xeon(TM) 3.40GHz 4核*2

内存:8G

千兆网卡

Redhat linux as5

Tomcat2

Hp DL580 G4

CPU: Intel(R) Xeon(TM) 3.40GHz 4核*2

内存:8G

千兆网卡

Redhat linux as5

Test1

Hp DL580 G5

CPU:Intel(R) Xeon(R) E7310 1.60GHz 4核*2

内存:4G

千兆网卡

Redhat linux as5

Test2

IBM X3650

CPU: Intel(R) Xeon(R) E5150 2.66GHz 2核*2

内存:4G

千兆网卡

Redhat linux as4

3.1.3     软件环境

1.  操作系统网络参数优化

用做测试的各台服务器,均在/etc/sysctl.conf配置文件中增加如下内核参数:

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_fin_timeout = 5

2.  Nginx设置

主要配置如下:

user  www www;

worker_processes 4;

error_log  /usr/local/nginx/logs/nginx_error.log  debug;

pid    /usr/local/nginx/logs/nginx.pid;

worker_rlimit_nofile 51200;

events

{

    use epoll;

    worker_connections 51200;

}

http

{

    include       mime.types;

    default_type  application/octet-stream;

    #charset gb2312;

   

    server_names_hash_bucket_size 128;

    client_header_buffer_size 32k;

    large_client_header_buffers 4 32k;

    

    sendfile on;

    tcp_nopush     on;

    keepalive_timeout 1;

    tcp_nodelay on;

    #gzip on;

    #gzip_min_length  1k;

    #gzip_buffers     4 16k;

    #gzip_http_version 1.0;

    #gzip_comp_level 2;

    #gzip_types       text/plain application/x-javascripttext/css application/xml;

    #gzip_vary on;

    upstream tomcats  {

        server  192.168.131.57:8081;

        server  192.168.131.56:8081;

    #   server   192.168.131.61:8080;

    }

    server

    {

        listen 81;

        server_name localhost;

        proxy_redirect off;

    

 

      location / {

                proxy_pass   http://tomcats;

        }

     

       #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

       # proxy_set_header   X-Forwarded-For  $remote_addr;

       # location / {

       # if ($request_uri   ~*  ".*\.(js|css|gif|jpg|jpeg|png|bmp|swf)$")

       # {

       #        proxy_pass   http://squid.abc.com;

       # }

       # if ($request_uri   ~*  "^/view/(.*)$")

       # {

       #        proxy_pass   http://squid.abc.com;

       # }

       # proxy_pass http://web.abc.com;

       #}

        #定义日志格式

        log_format  access '$remote_addr - $remote_user [$time_local] $request '

                   '"$status"$body_bytes_sent "$http_referer" '

                  '"$http_user_agent" "$http_x_forwarded_for"';

       

        #打日志

        access_log  /usr/local/nginx/logs/access.log  access;

       

        #允许客户端请求的最大的单个文件字节数

        client_max_body_size     10m;

       

        #缓冲区代理缓冲用户端请求的最大字节数可以理解为先保存到本地再传给用户

        client_body_buffer_size  128k;

             

        #跟后端服务器连接的超时时间_发起握手等候响应超时时间

        proxy_connect_timeout    600;

             

        #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理

        proxy_read_timeout       600;

             

        #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据

        proxy_send_timeout       600;

      

        #代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可

        proxy_buffer_size        8k;

             

        #同上 告诉Nginx保存单个用的几个Buffer 最大用多大空间

        proxy_buffers            4 32k;

             

        #如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2

        proxy_busy_buffers_size 64k;

             

        #proxy缓存临时文件的大小

        proxy_temp_file_write_size 64k;

    }

}

3.  Tomcat设置

主要配置如下:

Ø  Tomcat5.5

Ø  MaxThread 500

Ø  MinSpareThread 25

Ø  MaxSpareThread75

Ø  Xmx 1740M

4.  Java环境

Ø  使用jdk1.6_03启动两个Tomcat。

使用jdk1.6启动两个客户端的httpTes测试t进程。


3.2     测试结果

3.2.1      单个TOMCAT的WEB服务器

NO

客户数

线程数

请求次数

间隔时间

测试服务器

占用内存

服务器负载

持续时间

平均速度

完成请求

结果说明

1

1

500

200万

0毫秒

Test1

1.1G

>150

82秒

12986条/秒

106万

从第82秒开始,tomcat占用内存1.1g,但CPU资源被tomcat耗尽,服务器负载急剧升高,top显示已达150,服务器停止响应客户端请求,客户端请求速度急剧下降,错包率100%,测试被迫中断

2

2

500

200万

25毫秒

Test1

1.7G

< 6

288秒

4765条/秒

137万

从第280秒左右开始,tomcat占用内存到达Xmx指定上限1.7g,Test1、Test2请求速度急剧下降,出现错包,错包率超过>6%,且仍在增加,测试终止。tomcat抛出“java.lang.OutOfMemoryError: GC overhead limit exceeded “异常。

Test2

293秒

4123条/秒

120万

3

2

500

200万

50毫秒

Test1

1.7G

< 3

422秒

2863条/秒

120万

服务端从第400秒左右开始,tomcat占用内存到达Xmx指定上限1.7g,Test1、Test2请求速度急剧下降,开始出现大量错包,422秒以后的错包率超过4.3%,且仍在在增加中,之前的错包率约为0.8%,测试终止

Test2

413秒

2922条/秒

120万

4

2

500

200万

200毫秒

Test1

1.7G

< 2

742秒

1727条/秒

128万

服务端从第740秒左右开始,tomcat占用内存到达Xmx指定上限1.7g,Test1、Test2请求速度急剧下降,开始出现大量错包,测试终止,达到1.7G前,错包率只有0.008%,达到1.7g后,截止停止测试时,错包率增长到1.2%,且仍在在增加中。 web服务器负载小于2。

Test2

744秒

1608条/秒

119万

5

2

500

200万

500毫秒

Test1

1.7G

< 1

1595秒

742条/秒

118万

服务端从第1595秒左右开始,tomcat占用内存到达Xmx指定上限1.7g,Test1、Test2请求速度急剧下降,开始出现大量错包,达到1.7G前,错包率只有0.08%,达到1.7g后,截止停止测试时,错包率增长到2.3%,测试终止

Test2

1575秒

737条/秒

116万

6

2

500

300万

1000毫秒

Test1

1.7G

< 1

6362秒

471条/秒

300万

在测试进度到80%左右时,tomcat1占用内存达到了Xmx指定上限1.7g,但Test1、Test2请求速度并未下降,直到600万次请求全部完成,两个客户端分别有9个丢包,丢包率只有0.003%,最长的响应时长为12.728秒。

Test2

6351秒

472条/秒

300万

3.2.2      Nginx+2个TOMCAT的WEB服务器

NO

客户端数

线程数

请求次数

间隔时间

测试服务器

Tomcat占用内存

服务器负载

持续时间

平均速度

完成请求数

最大响应时长

平均响应时长

测试结果

1

2

250

150万

0毫秒

Test1

1G

< 2

347秒

4322条/秒

150万

93005毫秒

0.21毫秒

300万次请求全部完成,无一错包。

Test1

1G

322秒

4658条/秒

150万

21244毫秒

0.23毫秒

2

2

500

200万

25毫秒

Test1

1.4G

< 2

542秒

3690条/秒

200万

45016毫秒

0.27毫秒

400万次请求全部完成,无一错包。

Test2

1.4G

544秒

3676条/秒

200万

45014毫秒

0.27毫秒

3

2

500

300万

50毫秒

Test1

 1.7G

< 2

1140秒

2445条/秒

278万

 

 

服务端从第1100秒左右开始,Tomcat1、Tomcat2占用内存到达Xmx指定上限1.7g,Test1、Test2请求速度缓慢下降,但并无错包,人为终止测试。

Test2

1.7G

1141秒

2424条/秒

276万

 

 

4

2

500

300万

200毫秒

Test1

1.7G

< 1

1860秒

1490条/秒

277万

 

 

服务端从第1800秒左右开始,Tomcat1、Tomcat2占用内存到达Xmx指定上限1.7g,Test1、Test2请求速度缓慢下降,但并无错包,人为终止测试。

Test2

1.7G

1863秒

1482条/秒

276万

 

 

5

2

500

500万

500毫秒

Test1

1.7G

< 1

5475秒

913条/秒

500万

93000毫秒

1.09毫秒

完成测试,但Tomcat1、Tomcat2占用内存到达Xmx指定上限1.7g,无错包。

Test2

1.7G

5565秒

898条/秒

500万

92987毫秒

1.11毫秒

6

2

500

500万

1000毫秒

Test1

968M

< 1

10149秒

492条/秒

500万

9077毫秒

2.02毫秒

完成测试,无一错包。

Test2

1G

10149秒

492条/秒

500万

9044毫秒

2.02毫秒

3.2.3      Nginx+2个TOMCAT的WEB服务器+缓冲

NO

客户端数

线程数

请求次数

间隔时间

测试服务器

Tomcat占用内存

服务器负载

持续时间

平均速度
(条/秒)

完成请求数

最大响应时长

平均响应时长

测试结果

1

2

250

150万

0毫秒

Test1

0.2G

< 1

64秒

23437

150万

9993毫秒

0.04毫秒

 

Test2

0.2G

59秒

25423

150万

3472毫秒

0.04毫秒

2

2

500

200万

25毫秒

Test1

0.4G

< 1

196秒

10202

200万

9616毫秒

0.10毫秒

开启Nginx缓存后,400万次请求全部完成,分别有241和216个错包。

Test2

0.4G

194秒

10361

200万

9608毫秒

0.10毫秒

3

2

500

300万

50毫秒

Test1

0.4G

< 1

379秒

7915

300万

9015毫秒

0.13毫秒

开启Nginx缓存后,600万次请求全部完成,无一错包。

Test2

0.2G

384秒

7812

300万

10234毫秒

0.13毫秒

4

2

500

300万

200毫秒

Test1

0.4G

< 1

1220秒

2459

300万

3018毫秒

0.40毫秒

开启Nginx缓存后,600万次请求全部完成,无一错包。

Test2

0.2G

1241秒

2417

300万

3384毫秒

0.41毫秒

5

2

500

500万

500毫秒

Test1

0.4G

< 1

5031秒

993

500万

3020毫秒

1.00毫秒

开启Nginx缓存后,1000万次请求全部完成,无一错包。

Test2

0.2G

5055秒

989

500万

3394毫秒

1.01毫秒

6

2

500

500万

1000毫秒

Test1

0.4G

< 1

10040秒

498

500万

3020毫秒

2.00毫秒

开启Nginx缓存后,1000万次请求全部完成,无一错包。

Test2

0.2G

10038秒

498

500万

78毫秒

2.00毫秒

注:本次测试所用jsp页面仅100个字节大小,测试过程中带宽压力可以忽略不计。测试过程中曾尝试过使用100k大小静态页面,结果显示在千兆内网下,无论是单Tomcat亦或是Nginx+2Tomcat,请求速度最大均不超过1000/秒,网络带宽使用已经达到800M,接近千M内网上限。因此,实际应用中,网络带宽对整个web服务的影响会非常大


3.3     测试结果分析

1.  系统参数的影响分析
1)       worker_processes 参数对Nginx性能的影响

测试过程中分别设定worker_processes为8、4、2、1时发现,该参数对nginx性能影响不大,对服务器资源消耗也没有太大影响,相关资料显示,该参数的值最好跟cpu核数相等,能够发挥最大性能,本次测试nginx所在服务器为2颗双核cpu,因此最终测试设定为4。

2)       MaxThread参数对tomcat并发性的影响

本次测试tomcat的 MaxThread参数设定为500,进行13000条/秒并发测试时,tomcat启动并发线程过多,将服务器cpu耗尽。分析MaxThread虽能够提高tomcat并发能力,但前提是在一个合理的范围内,要确保服务器负载不会因为并发线程过多而急剧升高,从而停止响应。

3)       -Xmx最大内存值对Tomcat能够持续响应高并发的影响

持续高并发请求状态下,有6次测试是因为tomcat内存达到指定最大值导致响应变慢,直至内存溢出停止响应,因此,Tomcat最大内存对tomcat能够持续响应高并发请求有很大的影响,调整该值,应该可以增加Tomcat响应高并发请求的总数,进而延长WEB服务能够支撑峰值的时间。

2.  各架构下的性能分析

1)    Nginx+2Tomcat的最大并发性低于单Tomcat,Nginx+2Tomcat最快为8980条/秒,单Tomcat为12986条/秒,分析可能是受nginx所在服务器性能影响所致。

2)    单tomcat在配置1.7g最大内存时,在持续超过1479条/秒的并发请求下,在稳定支撑约240万次响应后,Tomcat内存达到1.7上限,之后Tomcat响应会急剧变慢,错包急剧上升。

3)    Nginx+2tomcat架构下,2个tomcat分别配置1.7g最大内存时,在持续超过2900条/秒的并发请求下,能够稳定支撑约540万次左右响应,之后两个Tomcat内存都会达到1.7上限,响应会急剧变慢,但错包情况并未出现。

4)    在Nginx+2tomcat,同时配置了缓存的情况下,可以达到1.5万以上的并发处理能力

3.4     评测结果

1)    单个tomcat的处理能力在500条/秒左右

单个tomcat能稳定支持每秒500左右的并发请求。

2)    Nginx+Tomcat比单个Tomcat更稳定,不易出现错包,可以通过扩充tomcat集群(新增tomcat服务器)来提升系统的并发能力

单个tomcat在超出并发能力的提求下,处理能力大大下降,并出现大量错包,而采用Nginx+2Tomcat架构在各种测试下,均未出现错包,但处理能力也会下降。

单个tomcat能稳定支持每秒500左右的并发请求,而Nginx+2Tomcat能支持每秒1000左右的并发请求。所以可以通过新加tomcat服务器来提升系统的并发能力,但在tomcat的总体处理能力超过nginx的处理能力时无效。

3)    Nginx+2Tomcat配置了缓存后,静态页面的并发能力不再受tomcat的限制,单个nginx的并发处理能力能达到1.5万以上。

配置了缓存后,nginx+2tomcat的处理能力实测数据超过了1.5万次/秒,而单个tomcat可以支撑500次/秒,则从理论上计算一组Nginx+30个Tomcat集群可以支撑1.5万次/秒的并发处理。

注:为tomcat均分配1.7G内存。

 

4     配置选型

4.1     网络带宽

只考虑门户访问的带宽占用,后台管理页面等其他业务访问与门户访问相差2-3个数量级,这一部分网络流量占用忽略。同时考虑网络带宽利用率(70%)

根据业务设计能力,每秒网络流量=WEB网站每秒钟访问流量

=(每次访问占用的带宽×每秒访问次数)/带宽利用率

=(200K*8*n)/0.7

注:一般门户的首页大小>1M、平均200K/页面,我们以平均值来计算。

并发能力

占用的网络带宽

100次/秒

228 M

200次/秒

457 M

500次/秒

1442 M

1000次/秒

2286 M

 

4.2      架构和硬件配置选型

4.2.1     硬件配置参考

序号

产品功能

参考型号、配置

TPMC

1

主机设备

1.1

数据库服务器

IBM System x3850 M2, 4个处理器,每处理器为6核,共计24核。内存大小16G。SAS硬盘,硬盘大小587 GB。4U 机架,集成双千兆以太网接口,两块千兆的光纤网卡。

684508

1.2

WEB服务器

IBM System x3850 M2, 4个处理器,每处理器为6核,共计24核。内存大于8G。SAS硬盘,硬盘大小587 GB。4U 机架,集成双千兆以太网接口,两块千兆的光纤网卡。

684508

1.3

管理终端

IBM System x3560,1个Intel Xeon E5450处理器,内存大小2G,2U机架。

32600

2

网络设备

2.1

负载均衡器

RADWARE应用负载均衡设备,型号:为ODS-504,有,4个可选的千兆位电端口,1G主内存,500M处理能力(最大可通过License升级为4G)

 

2.2

防火墙

CISCO ASA5520防火墙
并发连接:280000
网络吞吐:450
安全过滤:225MB
网络端口:4个千兆以太网接口+1个快速
用户数限:无用户数限制用户
VPN支持:支持

 

2.2

交换机

Quidway S3952P-EI
传输速率:10Mbps/100Mbps/1000Mbps
网络标准:IEEE 802.1Q、IEEE 802.1D
端口数量:48
接口介质:10/100Base-T、1000Base-X
传输模式:全双工/半双工自适应
背板带宽:32Gbps

 

3

存储设备

3.1

光纤存储柜

光纤存储柜(EVA4100)

 

3.2

光纤交换机

光纤交换机( 4/32B SAN Switch)

 

 

注:上表为硬件的参考配置,根据网站规模的不同,在初期可以不用硬件负载均衡器。服务器性能也可以作适当缩减,达到一定规模后硬件的扩容请参考“4.3 硬件扩容策略

4.2.2     Web架构和硬件选型

并发能力

Web服务器架构

服务器配置

备注

<200次/秒

1)         Apache+n个Tomcat(n>=2);

2台web服务
2台数据库服务器

1台web服务器同时部署apache(nginx)和tomcat;
另1台部署tomcat。一起实现web负载均衡。
1台生产数据库,1台查询数据库

2)         Nginx+n个Tomcat(n=2);

200~500次/秒

1)         Apache+n个Tomcat(n>=2);

3台web服务
2台数据库服务器
2台缓存服务器

1台web服务器装apache(nginx);
另2台web服务器tomcat;
1台生产数据库,1台查询数据库

2)         Nginx+n个Tomcat(n=2);

注:同时配置缓冲

>500次/秒

Nginx+n个Tomcat(n>=2);
注:同时配置缓冲

n台web服务(n>5)
m台数据库服务器
2台缓存服务器
2台负载均衡器

1台web服务器装nginx;
其他web服务器tomcat;在web服务器>4台的时侯可以考虑划成多个nginx+tomcat集群。
生产数据库用ORACLE的RAC集群,也可考虑多种数据库并存如用mysql.

>1.5万次

多个Nginx+n个Tomcat(n>=2)组合;
注:同时配置缓冲

n台web服务(n>30)
m台数据库服务器
2台缓存服务器
2台负载均衡器

组成多个nginx+tomcat集群(1台ngix+5台tomcat),通过负载均衡器分流。
数据库用ORACLE的RAC集群。

 

说明:

1)理论上单个tomcat可以支持500的并发,考虑到门户的高可用性,可以考虑用Nginx+n个Tomcat(n>=2)的负载均衡架构。

2)当并发>500时可以考虑增加tomcat服务器,当tomcat增加达到30个时理论可以支撑1.5万次的并发请求。

3)当并发>1.5万次时则需要考虑增加一套Nginx+tomcat的组合,多个Nginx+tomcat通过硬件或是软件负载均衡器来实现平载均衡。

4)以上的硬件配置没考虑其他复杂的应用需求,如有其他应用(大容量的文件存储、接口服务、复杂的计算等)需求则需要配置相应的硬件。

 

4.3     硬件扩容策略

当网站发展到一定阶段,随着用户量不断扩大,现有的网络资源和服务器资源不能满足用户需要的时候,就需要对平台进行服务器和网络的扩容。以下是两种平台扩容的方式:

4.3.1      增加服务器

对于web的并发处理有瓶颈时,新增的web服务器,把新增的web服务器填加到Web服务器集群中,以增加WEB的并发处理能力。

对于数据库有处理压力时,可以增加数据库服务器,增加数据库服务器加入数据库的集群中。

4.3.2      增加存储

对于存储容量不能满足业务需要时,可以考虑在磁盘柜中新增加硬盘,甚至考虑新增磁盘柜。

4.3.3      升级服务器

可以升级服务器的内存、硬盘,甚至考虑用新的性能更高的服务器来替换。

4.3.4      网络扩容

1)    申请更大的网络带宽

2)    引入CDN

3)    升级内网交换机。

 

5     附录:一些主流网站的真实数据

1)    taobao

       服务中心200台服务器承载了70亿/天的请求

2)    维基百科

alexa 访问量排名第 6 的维基百科,每天有 3.4 亿个 PV,但其最高峰的 HTTP 请求数也只有五六万左右。

3)    facebook

120M+  activeusers

50B+  PVs permonth 50B+  PVs per month

10B+  Photos

1B+  connections

50K+  PlatformApps

400K+  AppDevelopers

 

LAMP +    Services

       AdServer

       Search

       NetworkSelector

       News Feed

       Blogfeeds

       PHP

       Memcache

       MySQLBlogfeeds

       CSSParser

       Mobile

       ShareScraper

4)    Amzon的一组数据:

超过5500万活动顾客的帐号和账单信息;

世界范围内超过100万个活动零售商;

构建一个页面所需要访问的服务API在100至150个;

每天数十亿的用户访问。

这是一组庞大的数字

5)    豆瓣网的一些数据:

        2.8M注册用户,约1/4活跃用户

        千万级非注册用户

        20M动态请求/天,峰值500~600/sec

        23台普通PC服务器(1U*15/2U*8)

        12台提供线上服务

        38G memcached

6)    ebay

 212,000,000 注册用户

 十亿

 每天十亿的PV

 每天260亿的SQL执行。

7)    Yupoo

 国内最大的图片服务提供商之一,Yupoo! 的 Alexa 排名大约在 5300 左右。同时收集到的一些数据如下:

带宽:4000M/S (参考)

服务器数量:60 台左右

Web服务器:Lighttpd,Apache, nginx

应用服务器:Tomcat

其他:Python, Java, MogileFS 、ImageMagick 等

 

8)    优酷网08年9月:

VV: 1.6亿+

日上传视频: 6万+

LAMP+lighttpd

Memcached

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值