业务从简单到复杂,应用也在实践中不断扩展,为了解决网站在发展过程中面临的高并发访问、海量数据处理、高可用、高可靠运行等一系列问题与挑战,很多公司在实践中提出了许多的思路与解决方案,这些思路与解决方案在实践的检验中,有的被PASS了,有的则不断的得到补充与完善,逐渐稳定下来得到业界同行的共识与肯定,就形成了目前的比较成熟的大中型网站的架构模式。
模式,百度释义“某种事物的标准形式或使人可以照着做的标准样式”。模式的关键在于可参照性,可重复性,相同的问题类似的场景,可以使用相似的解决方案,这样避免人类智慧劳动的浪费,同时节省时间和人力成本,当然从更广义上来说,是知识的累积和文明成果的传承。当然不是任何模式都可以随意拿来复制的,因地制宜具体对待,才能结合自己的实际进行创新和发扬。
架构的模式通常涵盖以下几点:
一、分层
分层在计算机和通信领域是很常见的一种架构模式。从网络的OSI七层协议到硬件、系统、应用、数据的分层,都体现了一种架构的思想--简化问题,分而治之。
一个WEB网站典型的软件架构分三层,应用层--服务层--数据层。当然每一层都需要相应的软硬件来支撑。
我们说一下应用层。应用层主要需要实现页面静态化,动静分离,图片服务器分离,负载均衡。页面静态化:效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现。不仅内容发布时需要实时静态化,而且在有更新时再重新静态化也是大量使用的一种策略。有些不适合做静态化的页面应用,就需要单独分开,做动静分离。
动静分离的典型方案:APACHE+TOMCAT和NGINX+TOMCAT。当前互联网上有超过50%的网站主机使用Apache。Apache是开源界的首选Web服务器因为它的强大和可靠,而且适用于绝大部分的应用场合。但是它在高并发情况下效率不太高。相对于APACHE,NGINX在高并发的情况下,能保持低资源低消耗高性能,是Apache服务器不错的替代品。一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。后者的各种功能模块实现得比前者丰富,例如ssl 的模块就比前者好,可配置项多。
另外无论对于Apache还是NGINX,图片始终是最消耗系统资源的,如果将图片服务和应用服务放在同一个服务器的话,应用服务器很容易会因为图片的高I/O负载而崩溃,因此对于有些大型网站项目,我们有必要将图片服务器和应用服务器分离。部署独立的图片服务器(甚至是服务器集群)是大型网站图片存储解决方案中最常考虑的,因为有了独立的图片服务器后,我们才能对图片服务器做更有针对性的性能优化,比如从硬件角度说,图片服务器可以配置高端的硬盘,7200转的换成15000转的,而CPU却只要一般就可以了;从软件角度说,可以为图片服务器配置特殊的文件系统来满足对图片的I/O请求,如淘宝的TFS,就很好地解决了大规模小图片文件带来的I/O噩梦。还有XFS文件系统的读写性能也非常不错。
图片服务器分离后固然提升了图片访问的效率,大大缓解了服务器因图片造成的I/O瓶颈,但是分离以后图片的同步就成了一个大问题了。解决这个问题可以有以下几种方式: 1、NFS共享
如果你不想在每台图片服务器同步所有图片,那NFS共享是最简单也最实用的方式。这种方式基本不会有因同步造成的延时,但比较依赖nfs,nfs挂掉会直接影响web服务器。 2、FTP同步
用户上传完图片后利用ftp同步到各个图片服务器,php、java、asp.net基本上都能操作ftp。这样的话每个图片服务器就都保存一份图片的副本,也起到了备份的作用。但是缺点是将图片ftp到服务器比较耗时,如果异步去同步的话又会有延时,不过一般的小图片文件也还可以。3、rsync+inotify实时同步 rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异并且每次同步扫描所有文件比较耗时,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样就可以解决同步数据的实时性问题和效率问题。
对于应用层来说,负载均衡是通常需要考虑的。因为单台服务器的性能总是有限的,一般来讲一台PC服务器所能提供的并发访问处理能力大约为1000个,更为高档的专用服务器能够支持3000-5000个并发访问,即使这样的能力还是无法满足负载较大的网站的要求。尤其是网络请求具有突发性,当某些重大事件发生时,网络访问就会急剧上升从而造成网络瓶颈。例如电商的双11促销就是很明显的例子。所以必须采用多台服务器提供网络应用服务,并将网络应用请求分配给多台服务器来分担,才能 提供处理大并发的能力 。当使用多台服务器来分担负载的时候最简单的办法是将不同的服务器用在不同的方面。按提供的内容进行分割,可以将一台服务器用于提供新闻页面,而另一台用于提供游戏页面或者可以按服务器的功能进行分割,将一台服务器用于提供静态页面访问而另一些用于需要大量消耗资源的动态页面访问。负载均衡的思路下多台服务器为对称方式,每台服务器都具备等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。由于建立内容完全一致的Web服务器并不复杂,可以使用服务器同步更新或者共享存储空间等方法来完成。因此负载均衡技术就成为建立一个高负载Web站点的关键性技术。
分层架构是逻辑上的,在物理部署上,三层架构可以部署在同一个物理机器上,但是随着网站业务的发展,必然需要对已经分层的模块分离部署,即三层结构分别部署在不同的服务器上,是网站拥有更多的计算资源以应对越来越多的用户访问。
所以虽然分层架构模式最初的目的是规划软件清晰的逻辑结构以便于开发维护,但在网站的发展过程中,分层结构对网站支持高并发向分布式方向的发展至关重要。
2、分隔
如果说分层是将软件在横向方面进行切分,那么分隔就是在纵向方面对软件进行切分。
网站越大,功能越复杂,服务和数据处理的种类也越多,将这些不同的功能和服务分隔开来,包装成高内聚低耦合的模块单元,不仅有助于软件的开发维护也便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。
大型网站分隔的粒度可能会很小。比如在应用层,将不同业务进行分隔,例如将购物、论坛、搜索、广告分隔成不同的应用,有对立的团队负责,部署在不同的服务器上。
3、分布式
对于大型网站,分层和分隔的一个主要目的是为了切分后的模块便于分布式部署,即将不同模块部署在不同的服务器上,通过远程调用协同工作。分布式意味着可以使用更多的计算机完同样的工作,计算机越多,CPU、内存、存储资源就越多,能过处理的并发访问和数据量就越大,进而能够为更多的用户提供服务。
在网站应用中,常用的分布式方案有一下几种.
分布式应用和服务:将分层和分隔后的应用和服务模块分布式部署,可以改善网站性能和并发性、加快开发和发布速度、减少数据库连接资源消耗。
分布式静态资源:网站的静态资源如JS、CSS、Logo图片等资源对立分布式部署,并采用独立的域名,即人们常说的动静分离。静态资源分布式部署可以减轻应用服务器的负载压力;通过使用独立域名加快浏览器并发加载的速度。
分布式数据和存储:大型网站需要处理以P为单位的海量数据,单台计算机无法提供如此大的存储空间,这些数据库需要分布式存储。
分布式计算:目前网站普遍使用Hadoop和MapReduce分布式计算框架进行此类批处理计算,其特点是移动计算而不是移动数据,将计算程序分发到数据所在的位置以加速计算和分布式计算。
4、集群
对于用户访问集中的模块需要将独立部署的服务器集群化,即多台服务器部署相同的应用构成一个集群,通过负载均衡设备共同对外提供服务。
服务器集群能够为相同的服务提供更多的并发支持,因此当有更多的用户访问时,只需要向集群中加入新的机器即可;另外可以实现当其中的某台服务器发生故障时,可以通过负载均衡的失效转移机制将请求转移至集群中其他的服务器上,因此可以提高系统的可用性。
5、缓存
缓存目的就是减轻服务器的计算,使数据直接返回给用户。在现在的软件设计中,缓存已经无处不在。具体实现有CDN、反向代理、本地缓存、分布式缓存等。
使用缓存有两个条件:访问数据热点不均衡,即某些频繁访问的数据需要放在缓存中;数据在某个时间段内有效,不过很快过期,否在会因为数据过期而脏读,影响数据的正确性。
6、异步
使用异步,业务之间的消息传递不是同步调用,而是将一个业务操作分成多个阶段,每个阶段之间通过共享数据的方法异步执行进行协作。
具体实现则在单一服务器内部可用通过多线程共享内存对了的方式处理;在分布式系统中可用通过分布式消息队列来实现异步。
异步架构的典型就是生产者消费者方式,两者不存在直接调用。
7、冗余
网站需要7×24小时连续运行,那么就得有相应的冗余机制,以防某台机器宕掉时无法访问,而冗余则可以通过部署至少两台服务器构成一个集群实现服务高可用。数据库除了定期备份还需要实现冷热备份。甚至可以在全球范围内部署灾备数据中心。
8、自动化
具体有自动化发布过程,自动化代码管理、自动化测试、自动化安全检测、自动化部署、自动化监控、自动化报警、自动化失效转移、自动化失效恢复等。
9、安全
网站在安全架构方面有许多模式:通过密码和手机校验码进行身份认证;登录、交易需要对网络通信进行加密;为了防止机器人程序滥用资源,需要使用验证码进行识别;对常见的XSS×××、SQL注入需要编码转换;垃圾信息需要过滤等。