`
ssxxjjii
  • 浏览: 938656 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

百万级高流量网站前期准备

阅读更多

一个从日几千访问的小小网站,到日访问一两百万的小网站,怎么才能让它平滑的度过这个阶段,别在技术上出现先天不足,写给一些技术人员,也写给不懂技术的创业者。

  对互联网有了解的人都有自己的想法,有人就把想法付诸实现,做个网站然后开始运营。其实从纯网站技术上来说,因为开源模式的发展,现在建一个小网站已经很简单也很便宜。当访问量到达一定数量级的时候成本就开始飙升了,问题也开始显现了。因为带宽的增加、硬件的扩展、人员的扩张所带来的成本提高是显而易见的,而还有相当大的一部分成本是因为代码重构、架构重构,甚至底层开发语言更换引起的,最惨的就是数据丢失,辛辛苦苦好几年,一夜回到创业前。

  减少成本就是增加利润。很多事情,我们在一开始就可以避免,先打好基础,往后可以省很多精力,少操很多心。

  假设你是一个参与创业的技术人员,当前一穷二白,什么都要自己做,自己出钱,初期几十万的资金,做一个应用不是特别复杂的网站,那么就要注意以下几点:
  一、开发语言

  一般来说,技术人员(程序员)创业都是根据自己技术背景选择自己最熟悉的语言,不过考虑到不可能永远是您一个人写程序,这点还得仔细想想。无论用什么语言,最终代码质量是看管理,所以我们还是从纯语言层面来说实际一点。现在流行的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上传那种形式就好,一是上传时文件引用不一致错误率增加,二是很容易出现开发人员的版本跟线上版本不一致,导致本来想改个错字结果变成回滚的杯具。如果有多台服务器还是建议自动部署,更换代码的机器从当前服务池中临时撤出,更新完毕后再重新加入。

  不管项目多小,养成使用版本管理的好习惯,最起码还可以当做你的备份,我的 http://zhiyi.us 虽然就是一个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看风景,但买个网游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备份时可以用脚本只同步某年某日某时的文件,避免计算大量文件带来的开销。当然最好是能用专门的分布式文件系统或更专业点的存储解决方案。

分享到:
评论

相关推荐

    百万级访问网站前期的技术准备

    在构建一个能够承受百万级访问量的网站时,前期的技术准备至关重要。这涉及到多个方面的考虑,包括架构设计、技术选型、性能优化以及运维策略等。以下是对这些关键点的详细解析: 一、架构设计 1. 分层架构:采用...

    试谈百万级访问网站前期的技术准备.doc

    【标题】:试谈百万级访问网站前期的技术准备 【描述】:在互联网时代,创建一个网站变得越来越容易,但随着访问量的增加,技术挑战也随之而来。本文将探讨在构建一个可应对百万级访问的网站时需要考虑的关键技术...

    房地产销售前期准备方案.doc

    房地产销售前期准备方案是房地产项目成功的关键步骤,它涵盖了销售道具准备、人员准备、销售制度制定以及销售策略的规划。以下是这些方面的详细说明: 一、销售道具准备 销售道具是房地产销售中的核心元素,它们为...

    高级网络分析技术.pdf

    2. **网络流量监测**:通过工具如Wireshark等,可以捕获和分析网络流量,了解数据传输的实时状态,找出可能导致性能下降的因素,如带宽占用过高、异常流量等。 3. **故障定位与排除**:当网络出现故障时,网络分析...

    高级TCP/IP编程.pdf

    1. **连接管理**:TCP通过三次握手建立连接,确保数据传输前的双方都已准备好。四次挥手断开连接,防止数据丢失。书中会详细介绍这些过程以及异常情况的处理。 2. **套接字API**:在Unix/Linux系统中,网络编程主要...

    搜索引擎优化技术 简介、提示以及如何帮助增加流量和排名?.docx

    面对数以百万计的网站,您如何确保您的网站脱颖而出?这就是SEO(搜索引擎优化)发挥作用的地方。 SEO 就像您网站的指南,向 Google 或 Bing 等搜索引擎展示您的网站的内容及其重要性。通过遵循本指南,您的网站可以...

    门店搭建私域流量攻略(共16份).zip

    这四个环节是私域流量建设的完整流程,涵盖了从前期准备到后期收益的整个过程。 压缩包内的几个案例文档,如《如何建立企业微信私域流量(在线教育).docx》、《如何建立企业微信私域流量(美妆品牌).docx》和《如何...

    钏山甲大狼高级直播运营系统课,直播运营+主播选品+视频-视频教程网盘链接提取码下载.txt

    【进阶】新号前7场注意事项 【进阶】如何正确选品破场观 【进阶】如何利用泛流量洗精准流量 【进阶】如何预判下一场直播峰值 【高阶】低价梯度涨价核心原理和方法 【高阶】AB链核心原理和方法 【高阶】复合...

    JSP+SQL网站流量统计管理系统(源代码+论文).zip

    配套的论文对系统的设计思想、实现方法、技术选型及性能评估进行了详细阐述,对于学习JSP和SQL结合的Web开发,以及理解网站流量统计系统的实现,具有很高的参考价值。 总的来说,《JSP+SQL网站流量统计管理系统》是...

    HDLC高级数据链路控制.doc

    1. 建立数据链路连接阶段:网络层向链路层发出连接请求时,链路层的发送端向接收端发出 SNRM(置正常响应模式)无编号帧,若接收端准备就绪,则发出 UA(无编号帧确认)无编号帧,表示同意建立数据链路连接。...

    聚生网管 局域网 控制流量 IP

    5. **使用聚生网管前必读.txt**:这份文本文件可能包含了一些使用软件前的重要注意事项,比如系统需求、兼容性问题、可能遇到的问题以及解决策略等,确保用户在开始使用前做好充分准备。 6. **使用聚生网管远程管理...

    插入式涡街流量计比对方法探讨.zip

    插入式涡街流量计因其安装方便、维护简单和精度较高而受到青睐。本篇文章将深入探讨插入式涡街流量计的比对方法,以确保测量数据的准确性和可靠性。 1. 流量计的校准与比对基础 - 校准:流量计的校准是验证其性能...

    千亿级电商秒杀解决方案专题

    冷启动策略则是在系统资源充足时,提前创建服务实例,准备应对即将到来的大流量。 六、数据库优化 通过主从复制、分库分表等手段,提升数据库处理能力。使用索引优化查询速度,合理设计数据结构,避免全表扫描。 ...

    懒觉猫闲鱼 - 初级+ 高级 课程.zip

    卖货前你要做好这4项准备。 第3节:那些月入上万的卖家,都做对了这3点。 第4节:60秒选出,可日赚200元的虚拟产品 第5节:7个技巧,帮你选出能日销100单的实物产品。 第6节:从这个渠道找货,你不用压货,就能找到...

    公路桥梁隧道施工组织设计-某一级公路施工组织设计方案

    一级公路通常指具有较高服务水平和交通流量的道路,其设计速度、车道数量、路基宽度等均有特定标准。施工组织设计应充分考虑这些因素,确保设计方案满足国家相关规范和设计要求。 二、施工前期准备 1. 现场勘查:对...

    创为企业网站的设计与实现毕业论文.pdf

    【前期准备与素材处理】 在网站制作之前,需要收集和整理相关素材,如企业LOGO设计、横幅(banner)设计、产品图片、文字内容等。LOGO是企业视觉识别系统的核心,要体现企业特色和品牌理念;横幅设计要吸引人且与...

    商贸版超小流量统计 v1.0 beta-ASP源码.zip

    综上所述,商贸版超小流量统计 v1.0 beta ASP源码是一个用于商业网站流量监测的系统,涉及到ASP编程、数据库管理、网络安全等多个方面,对于学习和研究ASP开发以及网站数据分析的人员具有较高的参考价值。...

    大流量WEB架构-LVS集群配置.pdf

    在构建大规模、高流量的Web服务时,LVS(Linux Virtual Server)是一个非常关键的技术。LVS是一种基于Linux内核的高性能负载均衡解决方案,它允许将大量网络请求分散到多个后端服务器,以实现服务的高可用性和性能...

    明星影视语录带书,抖音快手小红书视频号多平台矩阵操作,自带流量-教程网盘链接提取码下载.txt

    在所有短视频带货项目中,我会首选带书,因为这个品类的销量大,佣金率高,退货率低 而在所有带书项目中明星影视语录带书是起号最快最容易,并且能一直持续做的项目。...前期准备 实操过程 变现方式

    基于spring boot的JAVA商城系统,是前后端分离、为生产环境多实例完全准备、数据库为b2b2c商城系统设计.zip

    它可能包含了负载均衡、集群部署、数据库复制等技术,以应对生产环境中可能出现的大流量和高并发场景,确保系统的稳定运行。 “数据库为b2b2c商城系统设计”表明系统采用了特定的数据库架构来支持B2B2C(Business-...

Global site tag (gtag.js) - Google Analytics