浅谈网站架构设计1ChinaUnix技术沙龙1。网站架构是件艺术活儿,要求架构师熟悉网络、系统、代码、数据库,这些环节都很重要!2。百万级、千万级、亿级,对程序、文件服务器、数据库、网站架构的要求都是不一样的,我现在做的网站比较关注的有几个方面的内容,PV,UV,并发,并发峰值。3。现在的负载均衡器的抗并发能力都很强,所以单纯以这个值来衡量网站是完全不行的,你的前端的硬件F5能抗10万并发,但你后端的中间件或数据库顶不住,这一切都是空谈!4。系统架构师应该要做的是提升站点整体的性能、可用性,不止是前端代理,后端应用服务器、数据库、中间件等,都要综合考虑。这个架构里任何一个点存在瓶颈,整体系统处理能力就大打折扣,我们不要让它们之一形成短板效应。5。我们应该尽量做到以下几点:一、保证高可用;二、保证高可扩展性;三、尽量把用户往外面推,保证源服务器的压力小。6。下面我以现在手上负责的二个网站来说明下今天的主题一个是以百万级PV访问量设计的,另一个是千万级PV访问量设计的。7。8。9。如果有硬件防火墙,主机本身的iptalbes可以关掉;如果没有硬件防火墙,建议开启系统本身的iptalbes,一个防火墙规则如下:#!/bin/bashiptables-Fiptables-F-tnatiptables-Xiptables-PINPUTDROPiptables-POUTPUTACCEPT#loadconnection-trackingmodulesmodprobeiptable_natmodprobeip_conntrack_ftpmodprobeip_nat_ftpiptables-AINPUT-s122.70.148.99-jACCEPTiptables-AINPUT-s122.70.148.51-jACCEPTiptables-AINPUT-s222.35.136.151-jACCEPTiptables-AINPUT-ilo-jACCEPTiptables-AOUTPUT-olo-jACCEPTiptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPTiptables-AOUTPUT-mstate--stateESTABLISHED,RELATED-jACCEPTiptables-AINPUT-ptcp-mmultiport--dport80,22-jACCEPTiptables-AINPUT-picmp--icmp-typeecho-request-mlimit--limit1/s--limit-burst5-jACCEPTiptables-AINPUT-picmp--icmp-typeecho-request-jDROPiptables-Nsyn-floodiptables-Asyn-flood-mlimit--limit100/s--limit-burst150-jRETURNiptables-Asyn-flood-jDROPiptables-IINPUT-jsyn-flood10。机房的选择尽量选择BGP机房,双线次之。网站前端一定要放置硬件防火墙,国内的DDOS攻击非常流行的。防火墙的模式我们可以选择路由和透明二种,根据具体环境而定。11。防火墙我一般是选择用华赛或JUNIPER系列,近期考虑用金盾。12。负载均衡器的选择根据它们的特点来挑选即可,LVS的性能最好的,特别是后端的节点超过10个以上时,但它对网络的要求高,而且不能做动静分离,所以我建议将其作为数据库的负载均衡。13。HAProxy性能优异,稳定性强,自带强大的监控页面,并且支持动静分离,我们已用HAProxy+Keepalived实现了亿级/日的网站,所以这里也向大家推荐!14。现在很多朋友参考淘宝的架构,说最前端一定要放四层负载均衡,这个其实是针对淘宝这种巨量级别(十几亿PV/日)的,我们的网站一般用HAProxy/Nginx+Keepalived基本可以满足的需求。15。Apache作为PHP服务器,用于电子商务/电子广告网站非常稳定的,在8G内存的标准配置下,抗并发能力也是非常不错的,并非只有Nginx这一种选择;其实很多集群环境都是由最原先的一台ApacheWeb服务器发展起来的(公司要求平滑升级)。16。再说下文件服务器层,由于网站的后期宣传策话,名气也越来越大,PV值也越来越高,原先的DRBD+Heartbeat+NFS已经越来越顶不住压力了,这时候我们可以在NFS前面增加一层反向代理缓存。17。Squid文件缓存层主要是用来减轻我们后端NFS文件服务器的压力。18。另外,分布式文件存储MFS或GlusterFS现在也是很流行的趋势,它们在缓减文件层的压力方面性能表现优异。19。真正的像淘宝级的网站,都是自己开发分布式文件系统,如淘宝的TFS和豆瓣的DouBanFS。20。session共享我们可以用memcached来实现,其实负载均衡器自身都带了算法,能够实现会话保持,比如HAProxy的balacnsource,再比如Nginx的ip_hash;其实在大型网站里,一般要求有会话的功能比较少,比如广告类网站。21。个人感觉数据库这一层是制约整个网站性能比较关键的一环,我们应该如何设计和架构此层呢?22。数据库的压力应该如何来减减轻呢?一、增加数据库缓存,比如memcached或redis;二、将前后台分离出来,针对性后台的查询我们全部转到slave机器上去,这样的话不影响主要业务逻辑。23。对网站的逻辑数据库,如、bbs、blog等,进行分库;对主要业务数据库,进行数据的水平切分或垂直切分或混合切分。24。如果读的压力持续增加,我们还可以考虑master-slaves-slaves级联复制架构。如果读写压力巨大的话,可以考虑自己开发数据库层,例如DoubanDB。25。谢谢大家的宝贵时间!!26。