大规模分布式应用之海量数据和高并发解决方案总结
Posted java6655
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大规模分布式应用之海量数据和高并发解决方案总结相关的知识,希望对你有一定的参考价值。
一、网站应用背景
开发一个网站的应用程序,当用户规模比较小的时候,使用简单的:一台应用服务器+一台数据库服务器+一台文件服务器,这样的话完全可以解决一部分问题,也可以通过堆硬件的方式来提高网站应用的访问性能,当然,也要考虑成本的问题。
当问题的规模在经济条件下通过堆硬件的方式解决不了的时候,我们应该通过其他的思路去解决问题,互联网发展至今,已经提供了很多成熟的解决方案,但并不是都具有适用性,你把淘宝的技术全部都搬过来也不一定达到现在淘宝的水平,道理很简单。
当然,很多文章都在强调,一个网站的发展水平,是逐渐的演变过来的,并不是一朝一夕的事情。虽然目前的情况互联网的泡沫越来越大,但是整个互联网技术的发展确实为我们提供了方便快捷的上网体验。下边是一张早期的淘宝官网的界面:
下边整理的是一些针对海量数据和高并发情况下的解决方案,技术水平有限,欢迎留言指导。
二、针对海量数据和高并发的主要解决方案
海量数据的解决方案:
-
使用缓存;
-
页面静态化技术;
-
数据库优化;
-
分离数据库中活跃的数据;
-
批量读取和延迟修改;
-
读写分离;
-
使用NoSQL和Hadoop等技术;
-
分布式部署数据库;
-
应用服务和数据服务分离;
-
使用搜索引擎搜索数据库中的数据;
-
进行业务的拆分;
高并发情况下的解决方案:
-
应用程序和静态资源文件进行分离;
-
页面缓存;
-
集群与分布式;
-
反向代理;
-
CDN;
三、海量数据的解决方案
(1)使用缓存
网站访问数据的特点大多数呈现为“二八定律”:80%的业务访问集中在20%的数据上。
例如:在某一段时间内百度的搜索热词可能集中在少部分的热门词汇上;新浪微博某一时期也可能大家广泛关注的主题也是少部分事件。
总的来说就是用户只用到了总数据条目的一小部分,当网站发展到一定规模,数据库IO操作成为性能瓶颈的时候,使用缓存将这一小部分的热门数据缓存在内存中是一个很不错的选择,不但可以减轻数据库的压力,还可以提高整体网站的数据访问速度。
使用缓存的方式可以通过程序代码将数据直接保存到内存中,例如通过使用Map或者ConcurrentHashMap;另一种,就是使用缓存框架:Redis、Ehcache、Memcache等。
使用缓存框架的时候,我们需要关心的就是什么时候创建缓存和缓存失效策略。
缓存的创建可以通过很多的方式进行创建,具体也需要根据自己的业务进行选择。例如,新闻首页的新闻应该在第一次读取数据的时候就进行缓存;对于点击率比较高的文章,可以将其文章内容进行缓存等。
内存资源有限,选择如何创建缓存是一个值得思考的问题。另外,对于缓存的失效机制也是需要好好研究的,可以通过设置失效时间的方式进行设置;也可以通过对热门数据设置优先级,根据不同的优先级设置不同的失效时间等;
需要注意的是,当我们删除一条数据的时候,我们要考虑到删除该条缓存,还要考虑在删除该条缓存之前该条数据是否已经到达缓存失效时间等各种情况!
使用缓存的时候还要考虑到缓存服务器发生故障时候如何进行容错处理,是使用N多台服务器缓存相同的数据,通过分布式部署的方式对缓存数据进行控制,当一台发生故障的时候自动切换到其他的机器上去;还是通过Hash一致性的方式,等待缓存服务器恢复正常使用的时候重新指定到该缓存服务器。Hash一致性的另一个作用就是在分布式缓存服务器下对数据进行定位,将数据分布在不用缓存服务器上。关于数据缓存的Hash一致性也是一个比较打的问题,这里只能大致描述一下,关于Hash一致性的了解,推荐一篇文章:http://blog.csdn.net/liu765023051/article/details/49408099
(2)页面静态化技术
使用传统的JSP界面,前端界面的显示是通过后台服务器进行渲染后返回给前端游览器进行解析执行,如下图:
当然,现在提倡前后端分离,前端界面基本都是html网页代码,通过Angular JS或者NodeJS提供的路由向后端服务器发出请求获取数据,然后在游览器对数据进行渲染,这样在很大程度上降低了后端服务器的压力。
还可以将这些静态的HTML、CSS、JS、图片资源等放置在缓存服务器上或者CDN服务器上,一般使用最多的应该是CDN服务器或者nginx服务器提供的静态资源功能。
另外,在《高性能网站建设进阶指南-Web开发者性能优化最佳实践(口碑网前端团队 翻译)》这本书中,对网站性能的前端界面提供了一些很宝贵的经验,如下:
因此,在这些静态资源的处理上,选择正确的处理方式还是对整体网站性能还是有很大帮助的!
(3)数据库优化
数据库优化是整个网站性能优化的最基础的一个环节,因为,大多数网站性能的瓶颈都是开在数据库IO操作上,虽然提供了缓存技术,但是对数据库的优化还是一个需要认真的对待。一般公司都有自己的DBA团队,负责数据库的创建,数据模型的确立等问题,不像我们现在几个不懂数据库优化的人只能在网上找一篇篇数据库优化的文章,自己去摸索,并没有形成一个系统的数据库优化思路。
对于数据库的优化来说,是一种用技术换金钱的方式。数据库优化的方式很多,常见的可以分为:数据库表结构优化、SQL语句优化、分区、分表、索引优化、使用存储过程代替直接操作等 。
1、表结构优化
对于数据库的 开发规范与使用技巧以及设计和优化,前边的时候总结了一些文章,这里偷个懒直接放地址,有需要的可以移步看一下:
a) mysql开发规范与使用技巧总结:http://blog.csdn.net/xlgen157387/article/details/48086607
b) 在一个千万级的数据库查寻中,如何提高查询效率?:http://blog.csdn.net/xlgen157387/article/details/44156679
另外,再设计数据库表的时候需不需要创建外键,使用外键的好处之一可以方便的进行级联删除操作,但是现在在进行数据业务操作的时候,我们都通过事物的方式来保证数据读取操作的一致性,我感觉相比于使用外键关联MySQL自动帮我们完成级联删除的操作来说,还是自己使用事物进行删除操作来的更放心一些。当然可能也是有适用的场景,大家如有很好的建议,欢迎留言!
2、SQL优化
对于SQL的优化,主要是针对SQL语句处理逻辑的优化,而且还要根据索引进行配合使用。另外,对于SQL语句的优化我们可以针对具体的业务方法进行优化,我们可以将执行业务逻辑操作的数据库执行时间记录下来,来进行有针对性的优化,这样的话效果还是很不错的!例如下图,展示了一条数据库操作执行调用的时间:
以上是关于大规模分布式应用之海量数据和高并发解决方案总结的主要内容,如果未能解决你的问题,请参考以下文章