1. 先做需求分析,确定网站在一年内的性能指标,以及需求是存储密集型还是计算密集型还是请求密集型,找到系统瓶颈和技术难点。。同时预估网站增长到1亿独立用户(差不多是国内网站的峰值了)时这个性能指标又是什么一个量级。
2. 再做技术选型,从web前端Load Balance/CDN/Web Server选型,到存储后端Database/Nosql选型,以及编程语言(php/jsp/asp/js/python/ruby)选型,编程框架选型。这时候切记选合适的,不要盲目上高精尖技术,小公司一切因陋就简。facebook还是从php+mysql起家的。选自己能掌控的,你对什么语言什么框架熟悉就选什么,或者你能招到什么样的员工选什么。
3. 做技术方案设计,主要考虑就是结合产品需求,考虑系统瓶颈,健壮性,可扩展性,安全性,技术余量等方面,设计一个实用的技术方案。
4. 具体实现
5. 选择或编写合适的性能测试和监控工具,做好紧急扩充方案。
==========================================================
不同的网站侧重点不同吧,我的几点看法
1.前端负载均衡 可以采用F5等硬件,也可以采用LVS、NGINX
2.静态资源分离,用静态服或CDN
3.CACHE是肯定要的,有很多选择,memcached 、mongodb 、redis、Tokyo Cabinet等多了去了
4.如果是采用MYSQL的话,主从肯定要做的(master-master/slave),读写分离(mysql proxy,也可以从程序逻辑进行分离),分库分表(减少单表及单个数据库数据容量),数据结构和索引要定义好
5.分析好哪些数据要实时,哪些数据处理可以异步
6.再不够就做成分布式系统
真正难的是在实施过程,怎么去取舍,如何设计细节和运用得更完美。我经常是用到了,但没有运用得更加完美。
===========================================================
没有最好的架构只有最适合的架构。
所谓高访问量、高负载是一个什么概念?这个仁者见,仁智者见智。只能说通过分析网站的定位、时间成本、经济成本来决定设计一个网站用什么样的技术。
架构很重要。当然这也跟成本挂钩。如果一开始就明确了后续的流量会很大,那么花大量的时间设计一个合理的架构显得尤为重要。这是需要更多的时间、人力成本投入。就像同学们说的,小公司小网站一切从简,先出来产品先。
最简单的架构1台机器什么都放一起也可以。最开始豆瓣就是这样的。流量上去后,加机器呗。
好点的架构例如,一堆机器做负载均衡,一堆机器做web服务器,一堆机器做数据库服务器,就像上面的同学所说的结构。
若流量再上去了,数据块扛不住了,加一个缓存层。这点其实不好操作,没有很统一的解决方案。往往需要应用做大量的修改。淘宝的架构会比较牛逼些,中间层非常强大。现在一般大家用开源解决方案memcached等,用廉价的服务器换取访问的快速性,还是很值得。
编程语言就更不重要了,什么熟悉用什么。这有时候会跟项目经理的喜好有关,php、python、java、c都不错,只要你愿意。
说白了具体问题具体分析。怎么节约成本,节约时间快速迭代开发是王道。
============================================================
大家说得都很好,我就如何充分发挥Web服务器的并发处理能力谈谈。
针对操作系统做优化,是提高性能的本质手段。软件是跑在操作系统上的,实现某个特定功能的软件也有很多种。
Nginx、Lighttpd为何能逐渐取代Apache,是建立在充分了Linux内核的基础上的,能把Linux的最大优势发挥出来而做出的设计。Apache使用多进程处理高并发的网络和文件IO,但进程调度是非常耗时间的。相比而言Nginx采用轻量级的单进程多线程方式来处理,CPU消耗明显降低,吞吐量明显提升,可以使用ab来做压力测试。
做压力测试时要注意100个用户同时向服务器分别进行10次请求,与1个用户想服务器连续进行1000次请求,对服务器的压力是不一样的。前者压力大一些。因为前者任何时刻服务器网卡接收缓冲区中只有来自该用户的1个请求,而后者服务器网卡接收缓冲区中最多有100个等待处理的请求。
针对Web服务器一台Web服务器在单位时间内能处理的请求越多越好,也就是要提高吞吐率(每秒能处理的请求数)。这就需要做到以下几点:
1. 为了弥补PHP的一些不足,有时对于处理长连接等事务,需要使用C开发。对于Linux下C,要注意如下几点:
1)为了使多CPU支持得更好,应该使用POSIX的LinuxThreads,它是由内核级clone的线程,这样内后的进程调度器调度起来要轻松得多。但是线程切换比由用户态库函数实现的线程pthread要多一些。
2)使用2.6内核出的epoll(异步内核回调函数通知)网络模型。
3)使用sendfile。很多时候,用户请求服务器的静态文件,如:图片、CSS等。操作系统处理这些请求的过程中,磁盘文件的数据先经过内核缓冲区,然后到达用户内存空间,随后又被送到网卡对应的内核缓冲区,接着再被送入网卡进行发送。这样数据从内核出去,又从内核进来,转了一个大圈。所以Linux提供sendfile来直接内核到到内核的操作。发送大文件的时候sendfile显得尤其重要。
2. 进程切换,前面已经提到Apache的多进程之间的"上下文切换"次数相比Lighttpd、Nginx是要大的惊人的。所以在开发大访问量、高负载网站的时候,Lighttpd、Nginx是首选。
3. 控制好锁的使用,锁是非常耗资源的,但有时不得不用来控制共享的数据。在运行的情况下关闭Web服务器访问日志,可以大大减少锁等待时的延迟时间。
4. 控制好内存的分配与释放。一次分配很多的内存减少内存碎片整理。往往Web服务器吞吐量降低,是由于内存不够造成的。
5. 持久连接(Keep-Alive),对于图片密集型或网页等小数据请求处理有很明显的加速作用。若使用HTTP短连接,发送完一个数据马上断开,又创建新连接。建立TCP连接本身是一个不小的开销。可以直接使用TCP传送数据或HTTP头中加入"Connection:Keep-Alive"选项。
近期评论