Create Date:2009/06/10
Last Upate:2009/06/11
进行下面的话题之前,先了解一下什么CMS与CMS网站系统的特性。
系统特性
CMS也可以简单的理解成像无太多交互的新闻网站、企业网站等。这类系统的有如下特点:
一、流量集中
大部分的CMS的情况就是热门新闻可能占整个系统的流量的80%,甚至更多。而其它新闻可能访问就会相当的少。所以如何对热门或突发新闻的处理优化,就是相大很大程度上对系统的优化。
二、实时性
或许CMS要求实时性不如像BBS或CMS系统要求那么高,但是可能为了配合真理部的工作,删除或更新指定文章时。如何做到即时有效的更新,这就是需要考虑的问题了。
三、页面统一
CMS系统不像如SNS系统一样,不同的用户看到的内容都是不一样的
四、交互性
CMS系统与其它的BBS、SNS系统最大的区别就是基本上没有任何交互性可言。
针对上述两个特点,就要考虑系统设计前需要解决的问题。
问题分析
一、数据库瓶颈问题
这种大流量、高并发的系统,按照传统的CMS设计,会出现大量的类SELECT查询请求,无疑会让数据库出现系统瓶颈问题。由木桶原理来说,这块是最容易出现系统短板的地方。如何有效的避免数据库瓶颈问题是最需要解决的问题。
二、热门及突发新闻的处理
因为CMS的特性,出现冷热不均。可能出现突发新闻的那一瞬间,过高的流量导致整体系统响应延迟。如何有效的对突发新闻的处理,也是很重要的一环。
三、业务的扩展性与伸缩性
这个问题不单单是CMS系统存在的。如何在当前的系统架构下添加或移除一些模块。而不影响或最小影响已经上线的系统。这也是要认真考量的。
四、高可用性及流量分配
这是任何线上系统不可避免的话题,如何保证在大流量、高并发或者受到一些攻击时保证系统的高可用性。当然这一层面,所牵扯的话题还是比较多的,比如具体部署方案,成本等等。接下来慢慢说到。
解决方案
通过上面提及的问题进行逐个解决。
一、数据库
为了减轻数据库的压力,最直接有效的办法就是让用户尽可能或者不需要对数据库进行交互。实现这一点,可以使用的方案有很多种,也可参考进行多重方案的复用。
1、读写分离
因为CMS的特性,我们可以使用类似于一读一写或一写多读的使用方案。如:Master—-Slave—-Slave这种方式。现有的程序级方案有MySQL Proxy等。当然也可以通过自定义的读写分离规则来进行判断。
2、数据库的拆分
这一层面不涉及过多的技术上的知识,主要是对现行业务上的总体认识。主要涉及了业务上的拆表、拆库等。所以早期数据库及程序设计业务逻辑中要有足够业务前瞻性。
3、静态化
直接从程序级别生成静态化,这样终端用户基本上不会跟数库有相关的交互。这样做最起码可以效的减少对数据库95%以上甚至更大的压力。
4、数据库缓存
这级属于程序级别的优化。主要是查找程序代码中经常访问的相同数据或将一些同用信息。将其直接缓存或内存级缓存数据库中。现有的解决方案众多,如OSCache、ehcache或memcached等等;
二、应用系统
1、缓存还是缓存
没错,能用缓存的地方尽量使用,这样的好处是大大的。当程序生成了静态页面后,需要在应用服务器的前端,加上页面缓存服务器,可以一组,可以是多组。这样可以大大的减轻应用服务器压力。缓存住哪些资源呢?这个是需要根据业务类型的不同进行不同的缓存,建议缓存住网页静态文件,JS,CSS,小图片等等。解决方案有Squid、lighty、Varnish等等
2、突发及热门新闻
同样还是程序级别的话题,可以将热门新闻直接生成至其它服务器群组,与现有的主应用服务器进行分离。方法可以采用,当某个页面在一定时间段浏览量到达一定时,直接触发某个条件传输至指定服务器群组。或直接在网站后台设置为热门新闻。这种方式有待于补充。
3、缓存的时效性问题
经常频繁的更新缓存,那么缓存系统存在的意义就不大了。我们可以在程序中在做post动作前加入如squidclient这样的命令来实时的部分缓存进行更新。当然每次更新缓存都要花去一些时间,为了加快速度,所以会用到异步更新缓存的机制
4、后端应用服务器的优化
这里是指后端应用服务器上的优化,包括但不限于Apache、nginx等。比如使用mod_zip对文本类的文件进行压缩,当然不建议对图片再次进行压缩;使用mod_expires来控制HTTP的"Expires:"和"Cache-Control:"头内容进行客户端的缓存;使用tags来对HTTP请求的唯一性进行校验。当然这里要说的就太多太多了,具体的改篇再扯。
(时间不早了,睡鸟。未完待续,明日继续)
Recent Comments