1、服务器硬件 java
建议至少三台的标准配置,分别用做web处理、数据库、备份。mysql
web服务器至少要8G内存,双sata raid1,若是经济稍微宽松,或静态文件或图片多,则15k sas raid1+0。数据库至少16G内存,15k sas raid 1+0。备份服务器最好跟数据库服务器同等配置。硬件能够本身买品牌的底板,也就是机箱配主板和硬盘盒,CPU内存硬盘都本身配,也能够上整套品牌,也可 以兼容机。三台机器,市场行情六、7万也就配齐了。nginx
web服务器能够既跑程序又当内存缓存,数据库服务器则只跑主数据库(假如是MySQL的话),备份服务器干的活就相对多一些,web配置、缓存配置、数据库配置都要跟前两台一致,这样WEB和数据库任意一台出问题,把备份服务器换个ip就切换上去了。备份策略,能够drbd,能够rsync,或者其余的不少不少的开源备份方案可选择。rsync最简单,放cron里本身跑就行。备份和切换,建议多作测试,选最安全最适合业务的,而且尽量异地备份。web
2、架构 sql
初期架构通常比较简单,web负载均衡+数据库主从+缓存+分布式存储+队列。数据库
只是您比其余人厉害之处就在于设计上考虑到缓存失效时的雪崩效应、主从同步的数据一致性和时间差、队列的稳定性和失败后的重试策略、文件存储的效率和备份方式等等意外状况。编程
缓存总有一天会失效,数据库复制总有一天会断掉,队列总有一天会写不进去,电源总有一天会烧坏。根据墨菲定律,若是不考虑这些,网站迟早会成为茶几。后端
3、服务器软件 浏览器
Linux、nginx、java、mysql、svn几乎是标配,缓存
以上准备完毕,如今咱们有了运行环境,有了基本架构骨架,有了备份和切换方案,应该开始着手设计开发方面的事情了。
4、数据库
几乎全部操做最后都要落到数据库身上,它又最难扩展(存储也挺难)。对于mysql,什么样的表用myisam,什么样的表用innodb,在开发以前要肯定。复制策略、分片策略,也要肯定。表引擎方面,通常,更新很少、不须要事务的表能够用myisam,须要行锁定、事务支持的,用innodb。 myisam的锁表不必定是性能低下的根源,innodb也不必定全是行锁,具体细节要多看相关的文档,熟悉了引擎特性才能用的更好。现代WEB应用越来 越复杂了,咱们设计表结构时经常设计不少冗余,虽然不符合传统范式,但为了速度考虑仍是值得的,要求高的状况下甚至要杜绝联合查询。编程时得多注意数据一致性。
复制策略方面,多主多从结构也最好一开始就设计好,代码直接按照多主多历来编写,用一些小技巧来避免复制延时问题,而且还要解决多数据库数据是否一致,能够本身写或者找现成的运维工具。
分片策略。总会有那么几个表数据量超大,这时分片必不可免。分片有不少策略,从简单的分区到根据热度自动调整,依照具体业务选择一个适合本身的。避免自增ID做为主键,不利于分片。
用存储过程是比较难扩展的,这种情形多发生于传统C/S,特别是OA系统转换过来的开发人员。低成本网站不是一两台小型机跑一个数据库处理全部业务的模式,是机海做战。方便水平扩展比那点预分析时间和网络传输流量要重要的多的多。
NoSQL只是一个概念。实际应用中,网站有着愈来愈多的密集写操做、上亿的简单关系数据读取、热备等,这都不是传统关系数据库所擅长的,因而就产生了不少非关系型数据库,好比Redis/TC&TT/MongoDB/Memcachedb等,在测试中,这些几乎都达到了每秒至少一万次的写操做,内存型的甚至5万以上。例如MongoDB,几句配置就能够组建一个复制+自动分片+failover的环境,文档化的存储也简化了传统设计库结构再开发的模式。不少业务是能够用这类数据库来替代mysql的。
5、缓存
数据库很脆弱,必定要有缓存在前面挡着,其实咱们优化速度,几乎就是优化缓存,能用缓存的地方,就不要再跑到后端数据库那折腾。缓存有持久化缓存、内存缓存,生成静态页面是最容易理解的持久化缓存了,还有不少好比varnish的分块缓存、前面提到的memcachedb等内存缓存,memcached首当其冲。缓存更新可用被动更新和主动更新。被动更新的好处是设计简单,缓存空了就自动去数据库取数据再把缓存填上,但容易引起雪 崩效应,一旦缓存大面积失效,数据库的压力直线上升极可能挂掉。主动缓存可避免这点可是可能引起程序取不到数据的问题。这二者之间如何配合,程序设计要多动脑筋。
6、队列
用户一个操做极可能引起一系列资源和功能的调动,这些调动若是同时发生,压力没法控制,用户体验也很差,能够把这样一些操做放入队列,由另几个模块去异步执行,例如发送邮件,发送手机短信。开源队列服务器不少,性能要求不高用数据库当作队列也能够,只要保证程序读写队列的接口不变,底层队列服务可随时更换就能够,相似Zend Framework里的Zend_Queue类,java.util.Queue接口等。
7、文件存储
除告终构化数据,咱们常常要存放其余的数据,像图片之类的。这类数据数量繁多、访问量大。典型的就是图片,从用户头像到用户上传的照片,还要生成不一样的缩略图尺寸。存储的分布几乎跟数据库扩展同样艰难。不使用专业存储的状况下,基本都是靠本身的NAS。这就涉及到结构。拿图片存储举例,图片是很是容易产生热点的,有些图片上传后就再也不有人看,有些可能天天被访问数十万次,并且大量小文件的异步备份也很耗费时间。
为了未来图片走cdn作准备,一开始最好就将图片的域名分开,且不用主域名。不少网站都将cookie设置到了.domain.ltd,若是图片也在这个域名下,极可能由于cookie而形成缓存失效,而且占多余流量,还可能由于浏览器并发线程限制形成访问缓慢。