Web网站架构设计

目录 [隐藏/显示]

知识在于分享,本文内容主要是我工作中的经验总结。里面所说的每一节如果单独详细写基本上不是一篇文章可以解决了。大家如对本文有什么想法和建议的欢迎来信讨论

1 - Web负载均衡

1.1 - 使用商业硬件实现

最常用的F5 与citrix netscaler。比如12306前端的web好像用的就是F5 的BIGIP。如果公司资金足够的话,相对使用开源软件来说理方便。 
优点:维护方便,性能稳定 
缺点:费用太高 


1.2 - 使用开源软件

可选择使用lvs或者nginx做web应用的负载均衡。 
Lvs工作在tcp 协议4层下,而nginx工作在tcp协议7层下。4层和7层差别举个实际例子:member.app.com,shop.app.com域名对外只有一 个ip,通过lvs指向后台10.0.0.1-10.0.0.10 这10台机器。你必须在这10台机器上都配置好member.app.com和shop.app.com的网站内容。这10台服务器都承载着 member.app.com和shop.app.com的前端请求,如果哪天你发现member.app.com的请求大于shop.app.com的 请求。想把shop.app.com请求只限定在10.0.0.1-10.0.0.5 这5台机器上,而member.app.com还是指向10.0.0.1-10.0.0.10这10台机器。你请必须将member.app.com和 shop.app.com域名重新指向不同的ip来实现。而通过nginx则可以实现修改配置文件即可实现。不必将member.app.com和 shop.app.com域名指向不同的外网ip. 
相对lvs来说,nginx所能实现的功能也比较多。不过相对于稳定和性能上来说还是lvs性能好一些。 
优点:免费,开源。性能稳定。 
缺点:维护配置成本高 


附:nginx与lvs做负载均衡的比较 

1.3 - 使用windows自带的互载均衡软件

Windows2003 的服务器都自带有NLB来实现。实现机制类似于lvs,无法做到以上nginx七层协议。使用windows实现是通过广播方式将请求发向同一网段的所有 ip。如果通过NLB实现,最好将同一组NLB的服务器划分在同一个vlan下。以防止广播到其它的ip上,增加交换机的流量。 
优点:免费(只要有windows就自带了),配置方便。不用增加单独服务器。 
缺点:数据广播方式实现,需要配置vlan解决。 


1.4 - 总结

相 对上面三种方式实现的互载均衡都有各自优点。如果小型windows网站服务器,采用windows下的nlb实现还是不错的选择。不用增加单独的服务 器。大型以上网站建议还是采用硬件(F5 big-ip)或开源下的lvs和nginx来实现。个人还是比较便向于nginx来实现,方便动态的对web的服务器进行调整。 

2 - 静态网站

静态网站相对来说存储静态网页内容(html,js,css,jpg,png)和用户上传文件及图片。 

2.1 - 静态域名划分

相 对静态网站来说建议将css,jpg,png及用户上传文件放在和主网站不同的域名上。不是指二级域名,是一级域名。如主网站用 www.website.com ,而css,jpg,png及用户上传文件使用file.imageswebsite.com域名。这样好处主要是可以减少主域名的cookies发送到 不需要使用cookies的文件服务器上。可以起到加快用户访问和减少服务器流量作用。比如:将用户的登入信息cookies写入到 website.com域名下,每当浏览器请求website.com域名下(包括二级域名)的任何网址都会将cookies信息发送请求的网址信息头 上。将不需要访问用户cookies的文件放在不同的域名下,将不会发送cookies信息。 大家有兴趣可以用firebug进行监控查看。

2.2 - 静态网站的缓存

2.2.1 - 使用CDN

如果资金允许,可使用商业的CDN服务。只需将域名指向CDN服务商指定的服务器即可对静态网站使用CDN加速。国内常见的CDN网宿、蓝讯、帝盟等。 

2.2.2 - 自己搭建CDN

如果你在全国各机房都有服务器也可以自己搭建CDN服务。 
使用硬件(F5 big-ip),根据用户请求的ip,将用户指到最近的idc机房服务器上。然后在各idc机房服务器上使用squid做反向代理从源服务器读取静态网站,对网站内容和用户上传图片的缓存。从而实现内容的加速。 

3 - 动态网站

动态网站相对静态网站来说,和用户的交互性多。开发动态网站的技术相对来说也是多种多样(asp.net,php,jsp等)。 

3.1 - 域名划分

动态网站域名建议根据功能点,使用二级域名来进行划分。比如一个电子商务网站,包括会员,商城,订单,支付,管理后台等。 
会员 member.website.com 
商城 shop.website.com 
订单 Order.website.com 
支付 pay.website.com 
管理后台 manager.website.com 
原则上动态域名下只存动态程序,动态网站用到的css,图片都应该在静态域名的图片服务器(file.imageswebsite.com)上。为动态域名下程序减少流量和请求。 
动态网站使用二级域名来划分功能有个好处可以实现cookies信息的共享。所有二级域名只需要将cookies信息写入website.com域名下,在其它的xxx.website.com域名下都能正常读取。从而为实现在各个动态域名上的统一认证而方便。 

附:Asp.net下from认证统一认证配置 

3.2 - 文件上传及显示

由于我们动态网站是多台部署,当用户上传文件时我们不能像单台服务器那样存在本地服务器上(其它服务器无法读取)。而是需要将用户文件做一个集中的存放地方。 

3.2.1 - 存放在数据库

所有web服务器,将用户的上传文件保存在数据库中。统一从数据库中读取和写入。 
最不推荐方式。相对来说数据库的资源是最昂贵的,用来存用户文件是最浪费了。另外,当用户数据越来越大时,对dba来说是一个最痛苦的问题。不方便做缓存及文件分发同步。 

3.2.2 - 存放在文件服务器

写入 
a)在文件服务器上安装ftp服务器。然后各web服务器,通过模拟ftp客户端。通过服务器的内网,将文件上传到文件服务器上。( C#模拟ftp方式,大家可以下载discuz nt源码查看,里面有实现方式。) 
b)通过windows内局域网的共享文件夹,各web服务器模拟windows用户访问共享文夹写入到文件服务器上。 

读取 
对文件的读取,如果是非公开的文件,还是通过原有写文件服务器的方式读取。 
如果是公开性的文件,如分图片。在文件服务器上建方个web网站做为数据源,将根目录指到用户上传的文件夹。然后通过文章上述 “静态网站缓存”方式,对用户上传文件网站做cdn的分发和缓存。从而对用户上传文件进行加速访问。 

3.3 - 动态网站内容更新

由于动态网站的分布式部署,从而导致一个网站的更新需要同步到其它的服务器上。建议提供一台专门的测试web服务器,每次更新将文件上传到测试服务器上。 测试通过后,再通过同步软件,将更新的网站文件同步到其它的web服务器上。可使用rsync实现文件同步,有linux和windows版的。 Windows安装rsync觉得麻烦也可以用 卧天同步王等相关软件来实现。 

3.4 - 动态网站缓存技术

Memcached 
Linux和windows下都有对应的客户端和服务端。如果对性能要求高建议安装linux下的服务端性能高些。客户端可以用.net,php进行调用。 


开发相关缓存服务 
大家也可以根据自己业务的需要,开发自己的分布式缓存服务。缓存算法常用LRU算法,经常使用排序在最前面。缓存服务相关算法介绍 
http://www.blogjava.net/DL88250/archive/2011/01/21/343327.html 
在.net下可以通过 remoting进行分部式缓存的开发。 


分布式的缓存大家可以参考 
http://wenku.baidu.com/view/0d0ef4ea81c758f5f61f67d9.html 

3.5 - 配置文件

一般我们的应用程的配置文件都是放在当前程序目录下。由于我们web应用程序是分开部署,如果一个配置节点内容修改。就需要同步到其它的服务器上。另外一般程序都在初始化读取配置内容。如果在程序运行中修改了配置只有重新启动程序进行更新。这就出现了一个配置同步的问题。 

3.5.1 - 通过同步软件实现

类似动态网站内容更新一样,使用rsync或都同步软件对配置文件进行同步。当UAT环境配置修改后,手工或定时将文件同步。应用程序定时从配置文件中更新配置。 

3.5.2 - 通过配置服务实现

自己开发配置服务程序,提供接口给各个应用程序读取配置方式。配置服务程序和各应用通过 tcp方式实时实现配置内容读取。 

3.5.3 - 通过数据库实现

将配置内容写入数据库,各应用程序通过读取数据库配置实现。各应用程序初始化从数据库中读取配置内容,读取完成后每隔固定时间从数据库中更新内容到本地。 

4 - 网页性能

4.1 - 网页压缩

静态网站压缩可以通过反向代理squid进行配置。常用浏览器都支持gzip网页格式的压缩。 
动态网站的话,各平台的 web服务器都有提供网页压缩的配置选项。基本上大家上google搜一搜都解决了。 

4.2 - 网页客户端缓存

在web服务器上设置静态网页文件的 Last-Modified和ETag 。如果服务器上文件没有更新,则不发送新的内容到客户端。 

4.3 - 网页开发内容调整

a)将多个js文件或css文件合并同一个文件。以减少http的请求。每个浏览器对同一时间下,同一域名下的http请求有连接限制。 
b)将css文件样式放在网页文件内容的头部,js文件放在网页文件的底部。让浏览先加载css文件,以便第一时间向用户展示界面。 
c)网页小icon可以合并成同一个大的文件icon,以减少http的请求。通过CSS Sprites 实现单个文件的显示。 
d)在firefox下安装 YSlow 对网页进行性能加载测试,根据测试建议对网页内容进行优化。 

5 - 数据库

建 立数据库时,有一个数据库预分配空间。建议初始分大一些,这样好处避免了在插入数据时达到数据库分配的空间。数据库自动分配数据库空间影响数据库插入的性 能。另外,数据库的自动增长建议按具体大小增长,比如2G根据你自己预计的大小。防止过快达到数据库上限导至系统频繁为库分配空间。 

5.1 - 数据库规划

Web 网站常用数据mysql,mssql,oracle,当然还有其它的一些数据库。基本上这三种数据库都有自己的优缺点。Mysql免费开源,mssql和 oracle都是商业软件。oracle用于大型企业数据库较多,一般电信银行用的oracle多些。而mssql相对来说少。从dba专业上来说 oracle相比mssql性能好些,当然价格也贵。从最近几年mssql已经在慢慢追上。数据库也可以考虑nosql类数据库,mongodb、 Redis等。另外开源的PostgreSQL据说也不错,有空大家可以看一看(http://bbs.chinaunix.net/thread- 1688208-1-1.html) 

5.2 - 数据库划分

根据业务应用来进行划分数据库。如我们上面的电子商务网站我们可以分为member,shop二个库。Member存储用于会员信息,shop库存储商品,订单,支付信息。 

5.3 - 表划分

建议对大数据进行表的划分,划分规则可按记录数,记录时间,记录的hash值进行划分。 
如果资金允许的话,可以考虑上存储设备。对数据性能的提升是巨大的。 

6 - 服务器监控

这里所说的服务器监控只是针对web服务器的运行状态的监控。比如网络流量,cpu,内存,硬盘负载。服务器监控常见通过SNMP协议进行,在linux 和 windows下都通用。针对服务器监控我这推荐使用cacti软件进行。服务器上都配置有双网卡,一个内网,一个外网。在内网卡上增加snmp协议,然 后在cacti 中增加需要监控的服务器。给cacti 个外网ip就可以通过web界面进行查看服务器的状态了。Cacti软件的介绍和配置大家可以上网搜搜,这里就不做介绍了。Cacti还可以监控服务器上 运行进程,如果进程停止运行可以发出报警邮件。 

7 - 附:Web系统逻辑架构图

Web网站架构设计_第1张图片 
Web架构图源文件下载 

aa

你可能感兴趣的:(架构设计)