http://my.oschina.net/u/173426/blog/618865
来源:互联网 发布:知乎 期货合理杠杆 编辑:程序博客网 时间:2024/05/29 04:56
看了很多文章,都是关注微观细节上优化,而我喜欢从大的往小的说。
1、服务器集群、负载均衡
毫无疑问,程序写得再好,只能最大利用一台服务器的性能,让单台服务器能够支持更多的人访问请求。但别忘了,单台服务器性能再高也是有限的,
带宽也是有限的,要想支撑更多的并发量,只能采用多服务器集群方式,每台服务器支撑一定数量的并发,这就是负载均衡概念。
负载均衡分为硬件负载均衡(如F5、dns负载均衡)和软件负载均衡(如Nginx/LVS/HAProxy),硬件级负载均衡转发到的必须是具有外部ip的服务器,而这台服务器又是一台软件负载均衡服务器,转发给内部局域网的多台服务器,最终接入web系统。
一般来说,一台搭建有Nginx/LVS/HAProxy 的软件负载均衡服务器,支撑的并发数在5万以内(理论最高值),正常在一半(2.5万)左右,要考虑并发量在千万级,那就需要400台以上的具有外部ip的软件负载均衡服务器。
2、web网站集群、缓存集群、session集群
每一台最终用户接入的服务器都部署完全一样的web服务,这些web程序虽然可以统一连接数据库作为数据全局共享,但是数据库连接操作影响了很大的性能,所以需要使用缓存数据提高性能,这些缓存数据可能分布在不同的服务器中,为了保持数据的一致性,必须同步共享。个人数据保存在Session中也一样,每台服务器保存的Session数据也需要同步。
这些数据的集群共享,已经有很多成熟的方案,比如 mecached session manager 等。
3、数据库集群
数据库服务器集群无非也是想达到负载均衡提高吞吐量的作用,传统的数据库如 MySQL /oracle/ sqlserver 等,可以采用分布式安装部署,通过分表分区技术达到负载均衡,但是,为了保护数据的一致性,只能均衡读操作的负载,无法均衡写操作的负载,也就是插入数据库时,还是采用只在中心服务器插入,然后复制到其他服务器,这就导致了瓶颈出现在中心服务器的插入性能上。
4、内存数据库
内存操作比传统数据库采用的磁盘读写操作,速度上不是一个量级的,如果中心数据库采用内存数据库,那么将会很好地解决插入瓶颈的问题,大大提高并发量。
gemfire是比较成熟商业化的内存数据库,现在已经有了开源版本,据说12306就是采用它,缺点是开发文档比较少。
mongodb是开源的比较有影响力的内存数据库,基于类json格式结构数据库,比较靠近关系型数据库,用于统计查询过滤的系统是很好的选择。
redis 是纯key-value的缓存数据库,结构比较单一,用作缓存比较合适。
5、缓存数据集群
缓存数据可以减少数据库的频繁操作,提高性能,但是为了保证数据的一致性,这些分布在不同服务器的缓存数据需要集群共享。
mecached 是不错的分布式缓存。
6、session集群
用户数据一般保存在session中,类似于缓存数据,Session数据也需要集群共享。
mecached session manager 是值得推荐的 集群Session方案。
7、独立文件存储服务器
说完了服务器集群,现在该说怎么优化单台服务器性能了。
下载文件,显示图片,这些都是占用很大带宽的资源,带宽不够,还会消耗cpu性能。
我们把文件和图片都保存到独立的文件服务器里,这样web服务器就会只负责运算和传输少量文字内容,显示图片或下载文件转向文件服务器,显示图片或下载文件慢也不会影响后面的用户操作,增加高并发量。当然,文件服务器也可以多台镜像服务器负载均衡提高下载速度。
8、html静态化
很多数据库里的固定资源(比如新闻内容)可以查询出来后转成html页面,这样就不需要每次都去查询数据库,直接访问html页面提高速度。
值得注意的是,html静态化只适用于某些特定场合,很多系统是无法静态化的,不要抱以太高的希望。
就这些了,可能还有些没想到的方面。
关注我写的开源框架 ErpCore & BigCore ,
下载源码到 http://www.8088net.com
- http://my.oschina.net/u/173426/blog/618865
- http://my.oschina.net/u/2352897/blog
- http://my.oschina.net/u/138995/blog/177925
- http://my.oschina.net/u/159469/blog/315817
- http://my.oschina.net/u/946060/blog/337419
- http://my.oschina.net/u/1177694/blog/491834
- http://my.oschina.net/ryanhoo/blog/93801
- http://my.oschina.net/f839903061/blog/85183
- http://my.oschina.net/songxinqiang/blog/192567
- http://my.oschina.net/u/1245614/blog/481573?p={{page}}
- Quartz实现动态定时任务--http://my.oschina.net/u/1177710/blog/284608
- DWR框架简单实例 (http://my.oschina.net/u/1790925/blog/366346)
- angular js摸态框的用法(转载自http://my.oschina.net/u/2332658/blog/491066)
- 博客已搬家至http://my.oschina.net/u/2298483
- 我加入了http://my.oschina.net/u/2330384
- Ubuntu下装QQ2014(http://my.oschina.net/oscfox/blog/315951)
- ffmpeg http://my.oschina.net/michaelyuanyuan/blog/68606
- tomcat证书配置//http://my.oschina.net/zhxm/blog/161159
- C++ - PAT - 1045. 快速排序(25)
- Python readline() from a string?
- Asp.NET MVC 导入Excel数据教程 手把手教你系列!!!
- myeclipse启动失败:Failed to create the Java Virtual Machine
- 华为交换机ARP安全
- http://my.oschina.net/u/173426/blog/618865
- LeetCode: Path Sum
- Docker入门实践(三) 基本操作
- 六、Lua中的迭代器与泛型for
- Swift学习:2.17 可选链
- 或与异或的本质区别
- unity处理地理信息中的图片
- WAMP初识,JAVA JDBC连接WAMP的MYSQL数据库
- 数据结构(1)—— 数据结构的三大结构