一、网络架构的优化
传统网络结构的用户的请求流程(DNS解析流程):
1、用户在浏览器输入要访问的网站的域名,如果操作系统检查到本地hosts文件中缓存着这个域名的映射关系,则直接调用,完成域名解析。
2、如果hosts文件中没有,则浏览器向本地DNS请求解析,如果缓存着映射关系,则返回结果,完成解析;
3、如果本地DNS没有,则将请求发往RootDNS(根DNS服务器)判断域名网站授权的DNS服务器;
4、网站授权DNS服务器将解析得到的IP地址发回本地DNS,本地DNS缓存映射关系并将IP地址发回给用户;
5、用户在得到IP地址后,向其发出HTTP请求。
那么这个过程有什么影响效率的因素呢?
1、DNS解析过程中,并不预先判断目标服务器是否正常工作;即使该服务器已经不能提供服务了,用户的请求仍将被发往这台服务器,造成服务的中断。
2、现有的互联网以数据包传输为基础,任何一个数据包的丢失或出错都必须重新发送,而平均一个重传过程需要3秒钟,从而导致延迟。并且现有的HTTP协议也有诱发延迟的因素,据调查,完整下载一个网页,需要在用户和服务器之间往返20~100次。
3、现有的路由技术以路由器工作状态的历史数据为依据来确定当前数据包的传输路径,无法真实反应当前的路由和网络连接状况。这往往会导致数据传输所经过的路径并不是当前的最佳路径。而且,众多的路由器和交换机不但使数据传输的时间延迟增大,还会增加出错的几率,因为任何一个路由器出现问题都会影响到整个传输过程。
比较现实的解决办法是使用CDN(内容分发网络)。
1、CDN=更智能的镜像+缓存+流量导流
CDN加速=智能DNS+多服务器
如上面公式,CDN是多台服务器加智能DNS的结合体。
2、CDN服务,其实就是把页面静态内容或静态化的动态内容缓存到不同地区很多台专门的缓存服务器上(如图片缓存服务器,静态HTML缓存服务器、文件缓存服务器等),
然后根据用户线路所在的地区通过CND服务商的智能DNS自动选择一个最近的缓存服务器让用户访问,如果静态缓存服务器中没有请求的内容,才向动态服务器发出请求,以此提高速度,这种方案对页面静态内容效果非常好,所以Web设计中页面静态化是很有必要的。
3、CDN与DNS的关系:CDN服务需要智能DNS的帮助才能实现把用户引导到离自己最近的缓存服务器上。好的CND服务提供商必须有好的智能DNS做基础。
4、CDN优点:本地Cache加速,镜像加速,远程加速,带宽优化,集群抗攻击。
二、HTTP传输优化
因为客户端与服务器之间通信是通过HTTP实现的,所以如果能加快HTTP传输效率,对解决高并发也有很大益处。
1、TCP连接复用、TCCP1.1特性长连接,减少过多次TCP连接的时间消耗。
2、HTTP压缩,如Apache的mod_deflate与gzip压缩。
三、动态服务器层的优化
如果通过各种静态缓存服务器都无法满足请求,那么就终于访问到了动态服务器层。一般来说能到达这一层的请求相对较少了,是非访问数据库不可的地步了,如发布内容,第一次浏览博客、评论等情况。
这一层是我们通过程序实现的(Java程序或PHP程序等),在这一层可以尽量优化控制代码,优化方案如下:
1、在程序级别实现分布式访问,分布式访问每个数据库的cache缓冲节点。
2、也可以仿照静态服务器层将动态服务器拆分成多台服务器进行负载均衡。
3、通过消息队列等数据结构实现在数据库空闲时的异步访问,解决高并发(如邮件群发、消息群发这些功能)。
四、数据库的优化
1、根据业务选择合适的的数据库。
2、采用数据库缓存技术,如memcache、redis等。可通过动态服务器层的程序来控制数据库缓存的分布式访问。
3、采用MySQL主从结构。
4、如果业务量更加巨大时,可以对数据库进行拆表,拆库,实现数据库级别的负载均衡。
注:数据库层可能涉及到大量的I/O操作,这对性能是有很大影响的。如索引存在外存中,MySQL使用B+树结构来尽量减少I/O操作的次数。
一些高并发的处理方案可以参看另一篇博客