网站架构的硬架构
通常老板花钱请我们架构网站的时候,会给我们提出一些目标,诸如网站每天要能承受100万PV的访问量等等。这时我们要预算一下大概需要多大的带宽,计算带宽大小主要涉及两个指标(峰值流量和页面大小),我们不妨在计算前先做出必要的假设:
第一:假设峰值流量是平均流量的5倍。
第二:假设每次访问平均的页面大小是100K字节左右。
如果100万PV的访问量在一天内平均分布的话,折合到每秒大约12次访问,如果按平均每次访问页面的大小是100K字节左右计算的话,这12次访问总计大约就是1200K字节,字节的单位是Byte,而带宽的单位是bit,它们之间的关系是1Byte = 8bit,所以1200K Byte大致就相当于9600K bit,也就是9Mbps的样子,实际情况中,我们的网站必须能在峰值流量时保持正常访问,所以按照假设的峰值流量算,真实带宽的需求应该在45Mbps 左右。
当然,这个结论是建立在前面提到的两点假设的基础上,如果你的实际情况和这两点假设有出入,那么结果也会有差别。 先看我们都需要哪些服务器:服务器,页面服务器,数据库服务器,应用服务器,日志服务器等等。
对于访问量大点的网站而言,分离单独的服务器和页面服务器相当必要,我们可以用lighttpd来跑服务器,用apache来跑页面服务器,当然也可以选择别的,甚至,我们可以扩展成很多台服务器和很多台页面服务器,并设置相关域名,如imgdomain和 wwwdomain,页面里的路径都使用绝对路径,如<img src=http://imgdomain/abcgif />,然后设置DNS轮循,达到最初级的负载均衡。当然,服务器多了就不可避免的涉及一个同步的问题,这个可以使用rsync软件来搞定。
数据库服务器是重中之重,因为网站的瓶颈问题十有八九是出在数据库身上。现在一般的中小网站多使用MySQL数据库,不过它的集群功能似乎还没有达到stable的阶段,所以这里不做评价。一般而言,使用MySQL数据库的时候,我们应该搞一个主从(一主多从)结构,主数据库服务器使用innodb表结构,从数据服务器使用myisam表结构,充分发挥它们各自的优势,而且这样的主从结构分离了读写操作,降低了读操作的压力,甚至我们还可以设定一个专门的从服务器做备份服务器,方便备份。不然如果你只有一台主服务器,在大数据量的情况下,mysqldump基本就没戏了,直接拷贝数据文件的话,还得先停止数据库服务再拷贝,否则备份文件会出错。但对于很多网站而言,即使数据库服务仅停止了一秒也是不可接受的。如果你有了一台从数据库服务器,在备份数据的时候,可以先停止服务(slave stop)再备份,再启动服务(slave start)后从服务器会自动从主服务器同步数据,一切都没有影响。但是主从结构也是有致命缺点的,那就是主从结构只是降低了读操作的压力,却不能降低写操作的压力。
为了适应更大的规模,可能只剩下最后这招了:横向/纵向分割数据库。所谓横向分割数据库,就是把不同的表保存到不同的数据库服务器上,比如说 用户表保存在A数据库服务器上,文章表保存在B数据库服务器上,当然这样的分割是有代价的,最基本的就是你没法进行LEFT JOIN之类的操作了。所谓纵向分割数据库,一般是指按照用户标识(user_id)等来划分数据存储的服务器,比如说:我们有5台数据库服务器,那么 “user_id % 5 + 1”等于1的就保存到1号服务器,等于2的就保存到2号服务器,以此类推,纵向分隔的原则有很多种,可以视情况选择。不过和横向分割数据库一样,纵向分割数据库也是有代价的,最基本的就是我们在进行如COUNT, SUM等汇总操作的时候会麻烦很多。综上所述,数据库服务器的解决方案一般视情况往往是一个混合的方案,以其发挥各种方案的优势,有时候还需要借助memcached之类的第三方软件,以便适应更大访问量的要求。
如果有专门的应用服务器来跑PHP脚本是最合适不过的了,那样我们的页面服务器只保存静态页面就可以了,可以给应用服务器设置一些诸如appdomain之类的域名来和页面服务器加以区别。对于应用服务器,我还是更倾向于使用prefork模式的apache,配上必要的xcache之类的PHP缓存软件,加载模块要越少越好,除了mod_rewrite等必要的模块,不必要的东西统统舍弃,尽量减少httpd进程的内存消耗,而那些服务器,页面服务器等静态内容就可以使用lighttpd或者tux来搞,充分发挥各种服务器的特点。
如果条件允许,独立的日志服务器也是必要的,一般小网站的做法都是把页面服务器和日志服务器合二为一了,在凌晨访问量不大的时候cron运行前一天的日志计算,不过如果你使用awstats之类的日志分析软件,对于百万级访问量而言,即使按天归档,也会消耗很多时间和服务器资源去计算,所以分离单独的日志服务器还是有好处的,这样不会影响正式服务器的工作状态。
一、前端优化
网站性能优化是一个很综合的话题,涉及到服务器的配置和网站前后端程序等各个方面,我只是从实际经历出发,分享一下自己所尝试过的网站性能优化方法。之所以在标题上挂一个web20,是因为本文更偏重于中小网站的性能优化,我所使用的系统也是典型web20的LAMP架构。
首先讲讲前端的优化,用户访问网页的等待时间,有80%是发生在浏览器前端,特别是页面和页面中各种元素(、CSS、Javascript、flash)的下载之上。因此在很多情况下,相对于把大量的时间花在艰苦而繁杂的程序改进上,前端的优化往往能起到事半功倍的作用。雅虎最近将内部使用的性能测试工具yslow向第三方公开,并发布了著名的网站性能优化的十三条规则,建议你下载并安装yslow,并作为测评网站优化效果的工具。下面我挑其中特别有价值的具体说明一下优化的方法:
对于第一次访问您网站,尚未在浏览器cache中缓存您网站内容的用户,我们可以做的事情包括:
1)减少一个页面访问所产生的package-infophppackage=APC)、TurckMMCache()、phpaccelebrator(),还有收费的ZendPerformanceSuite
3)将静态内容和动态内容分开处理
apache是一个功能完善但比较庞大的webserver,它的资源占用基本上和同时运行的进程数呈正比,对服务器内存的消耗比较大,处理并行任务的效率也一般。在一些情况下,我们可以用比较轻量级的webserver来host静态的、样式表和javascript文件,这样可以大大提升静态文件的处理速度,还可以减少对内存占用。我使用的webserver是来自俄罗斯的nginx,其他选择方案还包括lighttpd和thttpd等。
4)基于反向代理的前端访问负载均衡
当一台前端服务器不足以应付用户访问时,通过前端机实现web访问的负载均衡是最快速可行的方案。通过apache的mod_proxy可以实现基于反向代理的负载均衡,这里推荐使用nginx做代理服务器,处理速度较apache更快一些。
5)应用缓存技术提高数据库效能,文件缓存和分布式缓存
数据库访问处理并发访问的能力是很多网站应用的关键瓶颈,在想到使用主从结构和多farm的方式构建服务器集群之前,首先应该确保充分使用了数据库查询的缓存。一些数据库类型(如mysql的innoDB)自身内置对缓存的支持,此外,还可以利用程序方法将常用的查询通过文件或内存缓存起来。比如通过php中的ob_start和文件读写函数可以很方便的实现文件形式的缓存,而如果你拥有多台服务器,可以通过memcache技术通过分布式共享内存来对数据库查询进行缓存,不仅效率高而且扩展性好,memcache技术在livejournal和Craigslistorg等知名网站应用中都得到了检验。
6)服务器运行状态的检测,找到影响性能的瓶颈所在
系统优化没有一劳永逸的方法,需要通过检测服务器的运行状态来及时发现影响性能的瓶颈,以及可能存在的潜在问题,因为网站的性能,永远取决于木桶中的短板。可以编写一些脚本来检测web服务的运行,也有一些开源的软件也提供了很好的功能
7)良好的扩展架构是稳定和性能的基础
一些技巧和窍门可以帮你度过眼前的难关,但要想使网站具备应付大规模访问的能力,则需要从系统架构上进行彻底的规划,好在很多前人无私的把他们架构
网站的经验分享给我们,使我们可以少走甚多弯路。我最近读到的两篇有启发的文章:
-从LiveJournal后台发展看大规模网站性能优化方法
-Myspace的六次重构
最后不得不提到程序编码和数据库结构对性能的影响,一系列糟糕的循环语句,一个不合理的查询语句、一张设计不佳的数据表或索引表,都足以会使应用程序运行的速度成倍的降低。培养全局思考的能力,养成良好的编程习惯,并对数据库运行机制有所了解,是提高编程质量的基础。
搭建LAMP环境
1
把下载好的Lamp工具包 lamptgz 文件放到路由器的共享盘根目录下
地址: \\192168311\XiaoMi\
2
用安装好的 PUTTY 连到路由器的22端口,初始界面什么都不用修改,直接填入小米路由器的 IP 地址:192168311,确认开始连接路由器。
3
成功弹窗界面需要登录 root 权限,
帐号:root
密码:admin
密码输入时是隐藏不可见的,不用担心,输入密码确认就行了。
至此成功SSH到路由器的root用户了。
4
现在我们直接把最重要的 LAMP包解压到正确的位置,命令如下:
tar zxvf lamptgz -C /userdisk/lamp/
完成后查看是否有 etc 和 usr 两个文件名,有就成功了
cd /userdisk/lamp/ && ls
成功,输入 exit,暂时退出PUTTY。
5
打开浏览器,回到小米路由器的 Web 界面,点击系统设置选项后,在该页的 URL后面粘贴
#!pro/lamp 回车确认
进入隐藏的 LAMP 设置界面
7个按钮从上至下,除了第六个 Stop Dropbear不用按,其他按顺序按一遍。
点过 1 号按钮后, 当2号按钮显示 Created时,就可以按 3 号,当4号显示 Mounted 时,可以继续按 5 号,最后按 6 号,也就是最下面一个,当显示 Started 时,恭喜你,服务器的环境搭建成功!
开启服务
1
用安装好的 WinSCP 软件SSH到
地址:192168311
端口:22
帐号:root
密码:admin
非常直观的方式可以看到左边:本地目录和右边:远程目录(路由器内的文件系统)
在路由器端打开文件:userdisk/lamp/etc/lighttpd/lighttpdconf
按 Alt+F 组合键输入:serverport = 8088
把查找得到的结果当中端口号:8088 修改为:8080
2
回到之前连接 SSH 的 Putty,不过这次是 SSH 去开启 Lighttpd 服务,所以同样的 IP,不同的端口,这里我们用到的是 2222 端口。
地址:192168311
端口:2222
帐号:www
密码:admin
3
开启 lighttpd 服务,命令如下:
lighttpd -f /etc/lighttpd/lighttpdconf 回到浏览器访问 http://192168311:8080
只要能够看到页面,不管是404页面还是空白页面或者是helloworld,都证明该服务成功启动。我们架设的 HTTP 服务器的根目录位于
/userdisk/lamp/data/www/document_root
挂载网站目录,使其可见
1
对于我这种初学者来说,很多地方需要调试,需要修改。 而所有的设置和调整都通过 SSH 或者 linux 命令,对我来说非常困难。
所以把/userdisk/lamp 这个经常需要调整修改的目录挂载到 Windows 下小米路由器可见的共享盘中。
所以,首先来到路由器windows下的共享盘根目录中创建一个名为 Lamp 的文件夹
2
用 Putty SSH 到小米路由器,获取 root 权限并执行以下命令
cd/userdisk/ && mount-o bind data /userdisk/data/Lamp/
OK了,再回到windows下小米路由的共享盘看看Lamp文件夹下面是否已经成功出现了 etc 之类的文件夹呢?
其中的ThunderDB文件夹内是挂载生成的uuid地址,不用理会也不用修改他。
0条评论