在互联网行业,未来的趋势就是高并发、分布式系统。
作为一名互联网开发人员,一定要把握发展趋势,并沿着正确的路线提升自己。我也是刚刚开始了解什么是高并发、分布式的系统,怎样进行这种系统的架构设计。我觉得学习的思路应该是:根据了解到的内容,参考已经存在的方案,自己思考,并动手设计一套自己的系统架构,哪怕十分简陋,但一定要了解每一部分设计或者优化的目的、原则、思路、具体方法和使用到的技术,然后再一步步完善其中的每一部分,不断加入最新的方案和技术,并在实际开发中不断实践自己的方案,最终形成自己最优的架构设计。
下面是我参考了很多架构设计方案后总结出的系统优化策略。
搭建高并发系统,或针对系统进行高并发优化,需要明确系统高并发出现的时间规律,地域(空间)规律。得到用户流量、区域分布、请求特点、应用服务瓶颈点、服务器的性能指标等等,根据这些因素有针对性地对业务流程本身、系统架构进行优化。
优化的原则:应该有灵活的扩展性、尽量低的成本、高性能。
优化的思路(出发点):
- 负载均衡系统
- 反向代理系统
- Web服务器系统
- 缓存系统
- 分布式存储系统
- 数据库集群系统
- 异步计算策略
一、负载均衡系统
实现方式包括:硬件负载均衡、软件负载均衡。
硬件负载均衡效率高,价格贵,如F5等;
软件负载均衡系统价格低或免费,效率较硬件低,但一般够用,如LVS,nginx也有负载均衡功能。
二、反向代理系统
在系统架构中加入反向代理。
作用一:将请求映射到对应服务的服务器。首先需要划分业务,并统一约定和规范各个业务对应服务的URI,然后通过反向代理服务器将请求映射到各服务所在的服务器。这样可以避免在业务集中的情况下出现的单一功能发生瓶颈导致其他功能受到影响。(系统设计时,各业务服务应该按功能或模块进行拆分,便于进行横向分布式扩展)
作用二:提高系统吞吐量。数据在网络中传输很耗时,反向代理服务器可以使应用服务器不必再直接和客户端进行连接,阻塞进程等待数据接收完成,而是在反向代理服务器将数据缓冲完成后一次性快速传输给应用服务器。
作用三:对静态资源不必通过应用服务器,直接找到并返回,减轻应用服务器压力。
目前普遍使用Nginx作为反向代理服务器,它还是高性能http服务器,同时可以进行负载均衡。三、Web应用系统优化
- 页面静态化(HTML化);
动态页面静态化,可通过CMS系统对非动态信息页面进行静态化(静态化实际就是用程序将html页面的代码输出到一个html文件中,就成了静态页面);
静态化后的页面同样可以通过CDN加速,或存入缓存。
适用于更新不频繁的内容。
- 图片服务器和分离(CDN加速);
- 优化业务流程
- 更高效的算法
- 优化各种影响程序性能的代码细节
四、缓存系统
使用缓存减少对数据库的直接操作,减轻查询时的I/O压力。
按照存放位置不同,可分为客户端缓存、服务端缓存。
1.客户端缓存(主要是缓存页面):
- 浏览器缓存
- 网关、代理服务器缓存
2.服务端缓存:
- 页面缓存(常通过发布系统生成静态页面,适用于信息发布类网站,或数据非频繁进行动态变化的部分)。
缓存实现手段:可对页面整体缓存,也可以缓存片段,如ESI cache。使用CDN也算是一种缓存方式。
- 数据缓存。
缓存框架:ehcache
NoSQL:redis、memcache
使用缓存还应该使缓存命中率更高。五、分布式存储系统
对于需要占用大量存储空间的文档、图片、视频资源,单台服务器无法全部存储,需要大量大存储空间的服务器来保存,因此,使用大规模分布式存储系统提供基础的存储服务。
六、数据库系统
当数据库开始出现性能下降的时候,最优先的方案是:优化当前数据库的性能,而非立刻建立集群。应该保持简单原则,毕竟会增加很大复杂度。
1.当前数据库优化策略:
- 建立索引
- 优化sql
- 使用效率更高的操作方式。如大量数据批量插入。
2.建立集群:
- 读写分离
- 从库的负载均衡
- 分片、分库、分表(sharding)
3.mysql集群搭建方案:
- 使用官方推荐:Mysql Cluster方案
- 使用mysql中间件atlas方案
- 其他集群方案
七、异步计算方案
对于实时性要求不高,或者不重要但很耗时的操作,采取异步执行方案。即先行返回结果,再继续执行。如将用户上传的文件进行分发到多台机器、图片处理、视频转码等操作。
这里没有具体实施操作的说明,只是以尽量精准、全面的描述出我现在所理解的优化方案,各部分按照从顶层到低层的顺序介绍。当然,这只能是我的1.0架构方案,还需要不断完善。先分享给大家,希望能共同进步!