构建高负载高性能大型网站的十个终极秘诀

news/2024/5/10 6:17:59/文章来源:https://blog.csdn.net/sjmnh1/article/details/41550139
对互联网有了解的人都有自己的想法,有人就把想法付诸实现,做个网站然后开始运营。其实从纯网站技术上来说,因为开源模式的发展,现在建一个小网站 已经很简单也很便宜。当访问量到达一定数量级的时候成本就开始飙升了,问题也开始显现了。因为带宽的增加、硬件的扩展、人员的扩张所带来的成本提高是显而 易见的,而还有相当大的一部分成本是因为代码重构、架构重构,甚至底层开发语言更换引起的,最惨的就是数据丢失,辛辛苦苦好几年,一夜回到 创业 前。 
 
减少成本就是增加利润。很多事情,我们在一开始就可以避免,先打好基础,往后可以省很多精力,少操很多心。 
 
假设你是一个参与创业的技术人员,当前一穷二白,什么都要自己做,自己出钱,初期几十万的资金,做一个应用不是特别复杂的网站,那么就要注意以下几点: 
 
 
 
 
一、开发语言  
 
一般来说,技术人员(程序员)创业都是根据自己技术背景选择自己最熟悉的语言,不过考虑到不可能永远是您一个人写程序,这点还得仔细想想。无论用什 么语言,最终代码质量是看管理,所以我们还是从纯语言层面来说实际一点。现在流行的java、php、.net、python、ruby都有自己的优 劣,python和ruby,现在人员还是相对难招一些,性能优化也会费些力气,.net平台买不起windows server。java、php用的还是最多。对于初期,应用几乎都是靠前端支撑的网站来说,php的优势稍大一些,入门简单、 设计模式 简单、写起来快、 性能足够等,不过不注重设计模式也是它的劣势,容易变得松散,隐藏bug稍多、难以维护。java的优势在于整套管理流程已经有很多成熟工具来辅助,强类 型也能避免一些弱智BUG,大多数JAVA程序员比较注重设计模式,别管实不实际,代码格式看起来还是不错的。这也是个劣势,初学者可能太注重模式而很难 解决实际需求。 
 
前端不只是html、css这类。整个负责跟用户交互的部分都是前端,包括处理程序。这类程序还是建议用php,主要原因就是开发迅速、从业人员广泛。至于后端例如行为分析、银行接口、异步消息处理等,随便用什么程序,那个只能是根据不同业务需求来选择不同语言了。 
 
二、代码版本管理  
 
如果开发人员之间的网络速度差不多,就SVN;比较分散例如跨国,就hg。大多数人还是svn的. 
 
假设选了svn,那么有几点考虑。一是采用什么树结构。初期可能只有一条主干,往后就需要建立分支,例如一条开发分支,一条上线分支,再往后,可能 要每个小组一个分支。建议一开始人少时选择两条分支,开发和线上,每个功能本地测试无误后提交到开发分支,最后统一测试,可以上线时合并到上线分支。如果 喜欢把svn当做移动硬盘用,写一点就commit一次也无所谓,就是合并的时候头大一些,这些人可以自己建个分支甚至建立个本地代码仓库,随便往自己的 分支提交,测试完毕后再提交到开发分支上。 
 
部署,可以手工部署也可以自动部署。手工部署相对简单,一般是直接在 服务器 上svn update,或者找个新目录svn checkout,再把web root给ln -s过去。应用越复杂,部署越复杂,没有什么统一标准,只要别再用ftp上传那种形式就好,一是上传时文件引用不一致错误率增加,二是很容易出现开发人员 的版本跟线上版本不一致,导致本来想改个错字结果变成回滚的杯具。如果有多台服务器还是建议自动部署,更换代码的机器从当前服务池中临时撤出,更新完毕后 再重新加入。 
 
不管项目多小,养成使用版本管理的好习惯,最起码还可以当做你的备份,我的个人网站虽然就是一个wordpress,可还是svn了,只改动一两句css那也是劳动成果。 
 
三、服务器硬件  
 
别羡慕大客户和有钱人,看看机房散户区,一台服务器孤独的支撑的网站数不清。如果资金稍微充足,建议至少三台的标准配置,分别用作web处理、数据 库、备份。web服务器至少要8G内存,双sata raid1,如果经济稍微宽松,或静态文件或图片多,则15k sas raid1+0。数据库至少16G内存,15k sas raid 1+0。备份服务器最好跟数据库服务器同等配置。硬件可以自己买品牌的底板,也就是机箱配主板和硬盘盒,CPU内存硬盘都自己配,也可以上整套品牌,也可 以兼容机。三台机器,市场行情6、7万也就配齐了。 
 
web服务器可以既跑程序又当内存缓存,数据库服务器则只跑主数据库(假如是 MySQL 的话),备份服务器干的活就相对多一些,web配置、缓存配 置、数据库配置都要跟前两台一致,这样WEB和数据库任意一台出问题,把备份服务器换个ip就切换上去了。备份策略,可以drbd,可以rsync,或者 其他的很多很多的开源备份方案可选择。rsync最简单,放cron里自己跑就行。备份和切换,建议多做测试,选最安全最适合业务的,并且尽可能异地备 份。 
 
四、机房  
 
三种机房尽量不要选:联通访问特别慢的电信机房、电信访问特别慢的联通机房、电信联通访问特别慢的移动或铁通机房。那网通机房呢?亲,网通联通N久 以前合并改叫联通了。多多寻找,实地参观,多多测试,多方打探,北京、上海、广州等各个主节点城市,还是有很多优质机房的,找个网络质量好,管理严格的机 房,特别是管理要严格,千万别网站无法访问了,打个电话过去才知道别人维护时把你网线碰掉了,这比DOS都头疼。自己扯了几根光纤就称为机房的,看您抗风 险程度和心理素质了。机房可以说是非常重要,直接关系到网站访问速度,网站访问速度直接关系到用户体验,我可以翻墙看风景,但买个网游vpn才能打开你这 个还不怎么知名的网站就有难度了。或许您网站的ajax很出色,可是document怎么也不ready,一些代码永远绝缘于用户。 
 
五、架构  
 
初期架构一般比较简单,web负载均衡+数据库主从+缓存+分布式存储+队列。大方向上也确实就这几样东西,细节上也无数文章都重复过了,按照将来 会有N多WEB,N多主从关系,N多缓存,N多xxx设计就行,基本方案都是现成的,只是您比其他人厉害之处就在于设计上考虑到缓存失效时的雪崩效应、主 从同步的数据一致性和时间差、队列的稳定性和失败后的重试策略、文件存储的效率和备份方式等等意外情况。缓存总有一天会失效,数据库复制总有一天会断掉, 队列总有一天会写不进去,电源总有一天会烧坏。根据墨菲定律,如果不考虑这些,网站早晚会成为茶几。 
 
六、服务器软件  
 
Linux、nginx、php、mysql,几乎是标配,我们除了看名字,还得选版本。Linux发行版众多,只要没特殊要求,就选个用的人最多 的,社区最活跃的,配置最方便的,软件包最全最新的,例如debian、ubuntu。至于RHEL之类的嘛,你用只能在RHEL上才能运行的软件么?剩 下的nginx、php、mysql、activemq、其他的等等,除非你改过这些软件或你的程序真的不兼容新版本,否则尽量版本越新越好,版本新,意 味着新特性增多、BUG减少、性能增加。总有些道听途说的人跟你说老的版本稳定。所谓稳定,是相对于特殊业务来说的,而就一个php写的网站,大多数人都 没改过任何服务器软件 源代码 ,绝大多数情况是能平稳的升级到新版本的。类似于jdk5到jdk6,python2到python3这类变动比较大的升级还 是比较少见的。看看ChangeLog,看看升级说明,结合自己情况评估一下,越早升级越好,别人家都用php6写程序了这边还php4的逛游呢。优秀的 开源程序升级还是很负责任的,看好文档,别怕。 
 
七、数据库  
 
几乎所有操作最后都要落到数据库身上,它又最难扩展(存储也挺难)。对于mysql,什么样的表用myisam,什么样的表用innodb,在开发 之前要确定。复制策略、分片策略,也要确定。表引擎方面,一般,更新不多、不需要事务的表可以用myisam,需要行锁定、事务支持的,用innodb。 myisam的锁表不一定是性能低下的根源,innodb也不一定全是行锁,具体细节要多看相关的文档,熟悉了引擎特性才能用的更好。现代WEB应用越来 越复杂了,我们设计表结构时常常设计很多冗余,虽然不符合传统范式,但为了速度考虑还是值得的,要求高的情况下甚至要杜绝联合查询。编程时得多注意数据一 致性。 
 
复制策略方面,多主多从结构也最好一开始就设计好,代码直接按照多主多从来编写,用一些小技巧来避免复制延时问题,并且还要解决多数据库数据是否一致,可以自己写或者找现成的运维工具。 
 
分片策略。总会有那么几个表数据量超大,这时分片必不可免。分片有很多策略,从简单的分区到根据热度自动调整,依照具体业务选择一个适合自己的。避免自增ID作为主键,不利于分片。 
 
用存储过程是比较难扩展的,这种情形多发生于传统C/S,特别是OA系统转换过来的开发人员。低成本网站不是一两台小型机跑一个数据库处理所有业务的模式,是机海作战。方便水平扩展比那点预分析时间和网络传输流量要重要的多的多。 
 
NoSQL。这只是一个概念。实际应用中,网站有着越来越多的密集写操作、上亿的简单关系数据读取、热备等,这都不是传统关系数据库所擅长的,于是 就产生了很多非关系型数据库,比如Redis/TC&TT/MongoDB/Memcachedb等,在测试中,这些几乎都达到了每秒至少一万次 的写操作,内存型的甚至5万以上。例如 MongoDB ,几句配置就可以组建一个复制+自动分片+failover的环境,文档化的存储也简化了传统设计库 结构再开发的模式。很多业务是可以用这类数据库来替代mysql的。 
 
八、缓存  
 
数据库很脆弱,一定要有缓存在前面挡着,其实我们优化速度,几乎就是优化缓存,能用缓存的地方,就不要再跑到后端数据库那折腾。缓存有持久化缓存、 内存缓存,生成静态页面是最容易理解的持久化缓存了,还有很多比如varnish的分块缓存、前面提到的memcachedb等,内存缓 存,memcached首当其冲。缓存更新可用被动更新和主动更新。被动更新的好处是设计简单,缓存空了就自动去数据库取数据再把缓存填上,但容易引发雪 崩效应,一旦缓存大面积失效,数据库的压力直线上升很可能挂掉。主动缓存可避免这点但是可能引发程序取不到数据的问题。这两者之间如何配合,程序设计要多 动脑筋。 
 
九、队列  
 
用户一个操作很可能引发一系列资源和功能的调动,这些调动如果同时发生,压力无法控制,用户体验也不好,可以把这样一些操作放入队列,由另几个模块 去异步执行,例如发送邮件,发送手机短信。开源队列服务器很多,性能要求不高用数据库当做队列也可以,只要保证程序读写队列的接口不变,底层队列服务可随 时更换就可以,类似Zend Framework里的Zend_Queue类,java.util.Queue接口等。 
 
十、文件存储  
 
除了结构化数据,我们经常要存放其他的数据,像图片之类的。这类数据数量繁多、访问量大。典型的就是图片,从用户头像到用户上传的照片,还要生成不 同的缩略图尺寸。存储的分布几乎跟数据库扩展一样艰难。不使用专业存储的情况下,基本都是靠自己的NAS。这就涉及到结构。拿图片存储举例,图片是非常容 易产生热点的,有些图片上传后就不再有人看,有些可能每天被访问数十万次,而且大量小文件的异步备份也很耗费时间。 
 
为了将来图片走cdn做准备,一开始最好就将图片的 域名 分开,且不用主域名。很多网站都将cookie设置到了.domain.ltd,如果图片也在这个域名下,很可能因为cookie而造成缓存失效,并且占多余流量,还可能因为浏览器并发线程限制造成访问缓慢。 
 
如果用普通的文件系统存储图片,有一个简单的方法。计算文件的hash值,比如md5,以结果第一位作为第一级目录,这样第一级有16个目录。从0 到F,可以把这个字母作为域名,0.yourimg.com到f.yourimg.com(客户端dns压力会增大),还可以扩展到最多16个NAS集群 上。第二级可用年月例如,201011,第三级用日,第四级可选,根据上传量,比如am/pm,甚至小时。最终的目录结构可能会是 e/201008/25/am/e43ae391c839d82801920cf.jpg。rsync备份时可以用脚本只同步某年某日某时的文件,避免计 算大量文件带来的开销。当然最好是能用专门的分布式文件系统或更专业点的存储解决方案。 
 
码农 社区,专注于 WEB开发 http://w3croom.com/read.php?tid-4460.html  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_806238.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

it自学网站推荐

超详细的自学网站资源! w3cschool 2016-09-28 19:28活到才学到老,自学能力已经成为最重要的一种竞争力,特别是在IT行业,每个人都有自学的经历,我也不例外,这些是我在学习中、工作中收藏的网站资源。希望能帮…

Heroku 教程:使用 Heroku 快速搭建站点

简介 Heroku 是 Salesforce 旗下云服务商,提供方便便捷的各种云服务,如服务器,数据库,监控,计算等等。并且他提供了免费版本,这使得我们这些平时想搞一些小东西的人提供了莫大的便捷,虽然他有时…

c语言大学生自学网教学视频,6个质量最高的自学网站,悄悄的提成能力!

原标题:6个质量最高的自学网站,悄悄的提成能力!世界上没有蠢人,只有懒人。人生本来就是活到老,学到老,如果你不愿意接受新的知识,那么,你只能面临落后。自学很难,首先就要…

安居客检测到网页抓取_深圳seo网站优化快速吸引蜘蛛抓取的3种方法

最近SEOer也知道,百度下线了天级收录和周级收录,导致文章更新后收录没有以前那么快了,因此收到了太多的同行抱怨了,即便百度现在也上线了快速收录功能,但是这个效果也不是很明显,为此面对大部分苦恼的伙伴们…

自学网站大全(值得收藏)

自学,顾名思义就是自我学习。在这个信息爆炸的时代里,网络上有很多学习资源的。以下就是学习网站的介绍: 目录 综合类 中国大学MOOC(慕课)_国家精品课程在线学习平台 https://www.icourse163.org/ MOOC中国 - 慕课改变你,你改…

十分钟免费拥有永久网站

在人人都会上网的信息时代,拥有属于自己的网站,已经不是什么稀奇的事情了。Github Pages 就可以满足我们的需求了。它是 github 公司提供的免费的静态网站托管服务,用起来方便而且功能强大,不仅没有空间限制,还可以绑定…

怎么限制网页上传图片的尺寸_黑橙修图:有了这个网站,你再也不用担心你的图片超过限制大小了...

当我们在一些网站提交证件照或头像时,有时候会遇到图片大小超过网站限制的情况。比如前一阵就有朋友要我帮忙压缩一下证件照。要从xxxK压缩到xxk。其实压缩图片大小的方法有很多,有人可能会说:“ps里面,你xxxxxxxxx设置一下&#…

php复制统计源码整套_建站工具中百度统计代码的安装方法

以下是SEM培训班老师整理的在建站工具中百度统计代码的安装方法,仅供同学们参考学习。Discuz安装百度统计方法:首先在百度统计获取安装代码,然后登陆discuz后台,进入全局>站点信息>,复制统计代码并粘贴到“网站第…

base标签抓取错误:我不再用discuz程序建设门户网站[图]

2019独角兽企业重金招聘Python工程师标准>>> 以前我是采用discuz程序的门户来建设网站的,因为我一开始创建地方论坛的时候就采用了这套程序,不得不说的是,discuz论坛程序是国内最好的论坛系统,也得到了广泛的使用&…

大数据教程(2.11):大型网站架构图详解

2019独角兽企业重金招聘Python工程师标准>>> 很多知名的网站(如,百度;腾讯;360等)随着时间的推移,用户量越来越大,后台数据也越来越多。此时,服务器每秒钟的访问量可能就…

这10个免费电子书网站合集赶紧收藏了!

转载于《程序员书库》公众号 程序员书库(ID:OpenSourceTop)编译 链接:https://phreesite.com/free-ebook-download-sites/ 作为开发者多看点书还是应该的,要是想要看的书都能免费那就更好不过了,此前猿哥…

通过对nginx中FastCgi进程管理器的学习,了解php动态网站的网页的生成过程、nginx解析php程序的步骤...

关于factcgi和cgi的学习 1、FastCGI是什么? 首先我们看下CGI,CGI全称为通用网关接口 Common Cateway Interface.用于HTTP服务上的程序服务通信交流的一种工具,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI描述了服…

python虚拟环境的安装_Python虚拟环境,你有使用过吗?分分钟教你使用虚拟环境搭建一个小网站...

在开始之前,我们先做一点知识储备,从上图中,我们可以看到几个三个关键的信息:Python、virtualenv和Flask。 Python咱就不说了吧,简单、好入门、可以干好多事情。小到写脚本、大到做网站、数据分析等等。人生苦短&#…

如何找到网站服务器的源代码_如何找到一篇论文的源代码?

1. 如果这论文很老,论文里的算法在该领域有举足轻重的地位。那么网上很可能有工具包。例如我做的机器学习方向,经典的聚类、分类算法,MATLAB, python等常用语言都有丰富的工具包可供使用,一般有名的算法都会包括在其中。2. 如果论…

上传的文件在其他页面解析_渗透测试 对网站安全防护解析漏洞详情

天气逐渐变凉,但渗透测试的热情温度感觉不到凉,因为有我们的存在公开分享渗透实战经验过程,才会让这个秋冬变得不再冷,近期有反映在各个环境下的目录解析漏洞的检测方法,那么本节由我们高级渗透架构师来详细的讲解平常用到的web环境检测点和网站漏洞防护办法。3.14.…

如何在js中获取response.getwriter()的内容_常用的网站分析工具有哪些,网站流量质量如何分析?...

优化流量和改善页面不是网站分析师的直接工作,但一个优秀的网站分析师得有能力为产品和运营部门提供分析和建议,并在公司中形成数据氛围,保证各个部门向着同一个目标前进。毕竟,网站分析是一个发现问题、分析问题和解决问题的过程…

php网站 被 黑_为什么Swoole可以加速php

前言最近在研究Swoole,原来一直听别人在说Swoole可以加速,一直都是懵逼的。在研究了Swoole之后,我有了一些自己的理解。PHP-CGI 的黑历史对于 PHP 处理网络请求,大家基本上也都是在用 CGI 的方式来做的。那么,什么是 C…

m_Orchestrate learning system---网站的语言选择功能(中文英文)

m_Orchestrate learning system---网站的语言选择功能(中文英文) 一、总结 一句话总结:有两种方法,一是sessionjs端代码,而是sessionphp端代码。 推荐使用sessionphp端代码 用函数最方便,最简便&#xff0c…

微软正式发布Azure Storage上的静态网站

微软正式宣布了Azure Storage上的静态网站,提供了从托管在Azure Storage上的HTML、CSS和JavaScript文件提供内容的能力。静态网站包含内容固定的Web页面,同时仍然允许利用JavaScript等客户端代码来创建丰富的用户体验。 有了这个新功能,继用于…

千万级用户的大型网站,应该如何设计其高并发架构?

目录(1)单块架构(2)初步的高可用架构(3)千万级用户量的压力预估(4)服务器压力预估(5)业务垂直拆分(6)用分布式缓存抗下读请求&#xf…