海量数据的解决方案:

1. 使用缓存;
2. 页面静态化技术;
3. 数据库优化;
4. 分离数据库中活跃的数据;
5. 批量读取和延迟修改;
6. 读写分离;
7. 使用NoSQL和Hadoop等技术;
8. 分布式部署数据库;
9. 应用服务和数据服务分离;
10. 使用搜索引擎搜索数据库中的数据;
11. 进行业务的拆分;

一、使用缓存
网站访问数据的特点大多数呈现为“二八定律”:80%的业务访问集中在20%的数据上。
例如:在某一段时间内百度的搜索热词可能集中在少部分的热门词汇上;新浪微博某一时期也可能大家广泛关注的主题也是少部分事件。
总的来说就是用户只用到了总数据条目的一小部分,当网站发展到一定规模,数据库IO操作成为性能瓶颈的时候,使用缓存将这一小部分的热门数据缓存在内存中是一个很不错的选择,不但可以减轻数据库的压力,还可以提高整体网站的数据访问速度。
使用缓存的方式可以通过程序代码将数据直接保存到内存中,例如通过使用Map或者ConcurrentHashMap;另一种,就是使用缓存框架:Redis、Ehcache、Memcache等。
使用缓存框架的时候,我们需要关心的就是什么时候创建缓存和缓存失效策略。
缓存的创建可以通过很多的方式进行创建,具体也需要根据自己的业务进行选择。例如,新闻首页的新闻应该在第一次读取数据的时候就进行缓存;对于点击率比较高的文章,可以将其文章内容进行缓存等。
内存资源有限,选择如何创建缓存是一个值得思考的问题。另外,对于缓存的失效机制也是需要好好研究的,可以通过设置失效时间的方式进行设置;也可以通过对热门数据设置优先级,根据不同的优先级设置不同的失效时间等;
需要注意的是,当我们删除一条数据的时候,我们要考虑到删除该条缓存,还要考虑在删除该条缓存之前该条数据是否已经到达缓存失效时间等各种情况!
使用缓存的时候还要考虑到缓存服务器发生故障时候如何进行容错处理,是使用N多台服务器缓存相同的数据,通过分布式部署的方式对缓存数据进行控制,当一台发生故障的时候自动切换到其他的机器上去;还是通过Hash一致性的方式,等待缓存服务器恢复正常使用的时候重新指定到该缓存服务器。Hash一致性的另一个作用就是在分布式缓存服务器下对数据进行定位,将数据分布在不用缓存服务器上。

二、页面静态化技术
使用传统的JSP界面,前端界面的显示是通过后台服务器进行渲染后返回给前端游览器进行解析执行。
当然,现在提倡前后端分离,前端界面基本都是HTML网页代码,通过Angular JS或者NodeJS提供的路由向后端服务器发出请求获取数据,然后在游览器对数据进行渲染,这样在很大程度上降低了后端服务器的压力。
还可以将这些静态的HTML、CSS、JS、图片资源等放置在缓存服务器上或者CDN服务器上,一般使用最多的应该是CDN服务器或者Nginx服务器提供的静态资源功能。
另外,在《高性能网站建设进阶指南-Web开发者性能优化最佳实践(口碑网前端团队 翻译)》这本书中,对网站性能的前端界面提供了一些很宝贵的经验,如下:
1、尽量减少http请求。
2、使用cdn。
3、添加expires头。 Expires是RFC 2616(HTTP/1.0)协议中和网页缓存相关字段。用来控制缓存的失效日期
4、采用Gzip压缩组件。
5、将样式表放在头部
6、将脚本放在底部
7、避免css表达式
8、使用外部的javascript和css
9、减少DNS查询
10、精简javascript
11、避免重定向
12、删除恢复的脚本
13、配置ETag
14、使Ajax可以缓存

三、数据库优化
数据库优化是整个网站性能优化的最基础的一个环节,因为,大多数网站性能的瓶颈都是开在数据库IO操作上。 对于数据库的优化来说,是一种用技术换金钱的方式。数据库优化的方式很多,常见的可以分为:数据库表结构优化、SQL语句优化、分区、分表、索引优化、使用存储过程代替直接操作等 。
1、表结构优化以及sql语句优化:
2、分表
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。数据库读写操作的时候根据事先定义好的规则得到对应的子表名,然后去操作它。
例如:用户表
用户的角色有很多种,可以通过枚举类型的方式将用户分为不同类别category:学生、教师、企业等 ,这样的话,我们就可以根据类别category来对数据库进行分表,这样的话每次查询的时候现根据用户的类型锁定一个较小的范围。
不过分表之后,如果需要查询完整的顺序就需要使用多表操作了。

3、分区
数据库分区是一种物理数据库设计技术,DBA和数据库建模人员对其相当熟悉。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。数据库读写操作的时候操作的还是大表名字,DMS自动去组织分区的数据。
当一张表中的数据变得很大的时候,读取数据,查询数据的效率非常低下,很容易的就是讲数据分到不同的数据表中进行保存,但是这样分表之后会使得操作起来比较麻烦,因为,将同类的数据分别放在不同的表中的话,在搜索数据的时候需要便利查询这些表中的数据。想进行CRUD操作还需要先找到对应的所有表,如果涉及到不同的表的话还要进行跨表操作,这样操作起来还是很麻烦的。
使用分区的方式可以解决这个问题,分区是将一张表中的数据按照一定的规则分到不同的区中进行保存,这样进行数据查询的时候如果数据的范围在同一个区域内那么就可以只对一个区中的数据进行操作,这样的话操作起来数据量更少,操作速度更快,而且该方法是对程序透明的,程序不需要进行任何的修改。

4、索引优化
索引的大致原理是在数据发生变化的时候就预先按指定字段的顺序排列后保存到一个类似表的结构中,这样在查找索引字段为条件记录时就可以很快地从索引中找到对应记录的指针并从表中获取到相应的数据,这样速度是很快地。
不过,虽然查询的效率大大提高了,但是在进行增删改的时候,因为数据的变化都需要更新相应的索引,也是一种资源的浪费。

5、使用存储过程代替直接操作
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
在操作过程比较复杂并且调用频率比较高的业务中,可以将编写好的sql语句用存储过程的方式来代替,使用存储过程只需要进行一次变异,而且可以在一个存储过程里做一些复杂的操作。

6、分离数据库中活跃的数据
正如前边提到的“二八定律”一样,网站的数据虽然很多,但是经常被访问的数据还是有限的,因此可以讲这些相对活跃的数据进行分离出来单独进行保存来提高处理效率。
其实前边使用缓存的思想就是一个很明显的分离数据库中活跃的数据的使用案例,将热门数据缓存在内存中。
还有一种场景就是,例如一个网站的所用注册用户量很大千万级别,但是经常登录的用户只有百万级别,剩下的基本都是很长时间都没有进行登录操作,如果不把这些“僵尸用户”单独分离出去,那么我们每次查询其他登录用户的时候,就白白浪费了这些僵尸用户的查询操作。

7、批量读取和延迟修改
批量读取和延迟修改的原理是通过减少操作数据库的操作来提高效率。
批量读取是将多次查询合并到一次中进行读取,因为每一个数据库的请求操作都需要链接的建立和链接的释放,还是占用一部分资源的,批量读取可以通过异步的方式进行读取。
延迟修改是对于一些高并发的并且修改频繁修改的数据,在每次修改的时候首先将数据保存到缓存中,然后定时将缓存中的数据保存到数据库中,程序可以在读取数据时可以同时读取数据库中和缓存中的数据。

8、读写分离
读写分离的实质是将应用程序对数据库的读写操作分配到多个数据库服务器上,从而降低单台数据库的访问压力。
读写分离一般通过配置主从数据库的方式,数据的读取来自从库,对数据库增加修改删除操作主库。

9、使用NoSQL和Hadoop等技术
NoSQL是一种非结构化的非关系型数据库,由于其灵活性,突破了关系型数据库的条条框框,可以灵活的进行操作,另外,因为NoSQL通过多个块存储数据的特点,其操作大数据的速度也是相当快的。

10、分布式部署数据库
任何强大的单一服务器都满足不了大型网站持续增长的业务需求。数据库通过读写分离之后将一台数据库服务器拆分为两台或者多台数据库服务器,但是仍然满足不了持续增长的业务需求。分布式部署数据库是将网站数据库拆分的最后手段,只有在单表数据规模非常庞大的时候才使用。
分布式部署数据库是一种很理想的情况,分布式数据库是将表存放在不同的数据库中然后再放到不同的数据库中,这样在处理请求的时候,如果需要调用多个表,则可以让多台服务器同时处理,从而提高处理效率。

11、应用服务和数据服务分离
应用服务器和数据库服务器进行分离的目的是为了根据应用服务器的特点和数据库服务器的特点进行底层的优化,这样的话能够更好的发挥每一台服务器的特性,数据库服务器当然是有一定的磁盘空间,而应用服务器相对不需要太大的磁盘空间,这样的话进行分离是有好处的,也能防止一台服务器出现问题连带的其他服务也不可以使用。

12、使用搜索引擎搜索数据库中的数据
使用搜索引擎这种非数据库查询技术对网站应用的可伸缩分布式特性具有更好的支持。
常见的搜索引擎如Solr通过一种反向索引的方式,维护关键字到文档的映射关系,类似于我们使用《新华字典》进行搜索一个关键字,首先应该是看字典的目录进行查找然后定位到具体的位置。
搜索引擎通过维护一定的关键字到文档的映射关系,能够快速的定位到需要查找的数据,相比于传统的数据库搜索的方式,效率还是很高的。

13、进行业务的拆分
为什么进行业务的拆分,归根结底上还是使用的还是将不同的业务数据表部署到不用的服务器上,分别查找对应的数据以满足网站的需求。各个应用之间用过指定的URL连接获取不同的服务,
例如一个大型的购物网站就会将首页、商铺、订单、买家、卖家等拆分为不通的子业务,一方面将业务模块分归为不同的团队进行开发,另外一方面不同的业务使用的数据库表部署到不通的服务器上,体现到拆分的思想,当一个业务模块使用的数据库服务器发生故障也不会影响其他业务模块的数据库正常使用。另外,当其中一个模块的访问量激增的时候还可以动态的扩展这个模块使用到的数据库的数量从而满足业务的需求。

大型网站应用之海量数据解决方案相关推荐

  1. 大型网站应用之海量数据和高并发解决方案

    一.网站应用背景 开发一个网站的应用程序,当用户规模比较小的时候,使用简单的:一台应用服务器+一台数据库服务器+一台文件服务器,这样的话完全可以解决一部分问题,也可以通过堆硬件的方式来提高网站应用的访 ...

  2. 大型网站高并发解决方案——集群

    文章目录 大型网站高并发解决方案--集群 前言 一.集群 1.集群的分类 2.负载均衡集群(LB) (1)负载均衡集群结构 (2)负载均衡设备分类 3.高可用集群(HA) 4.高性能运算集群(HPC) ...

  3. 大型在线实时应用解决方案

    前言: 各家互联网公司每年都有印有自己图腾的重大活动,例如天猫的双十一.京东的六幺八.芒果TV的跨年晚会等.这些活动不仅会带来流量的激增,同时活动的成败也几乎决定了产品线研发运维人员的荷包收益.所以每 ...

  4. 大型集团无线网络解决方案

          系统描述: 某集团是一家以电子.成型制造为主的大型集团企业,中山地区3个厂区,分布于中山市东区.富湾工业区.以及白沙湾工业区.工厂网络本来并无互联,但是由于发展以及白沙湾制造基地投产,使得 ...

  5. 大型报告厅,会议中心解决方案

    你们的大型培训室和报告厅是不是还在使用传统拼接屏+小白板的模式?这种模式,安装复杂,操作复杂,书写擦除复杂,后面的人看不清白板上书写的内容.超大型汇报厅一般主要用于各类会议.学术讨论.演讲.报告.新闻 ...

  6. 大型虚拟现实仿真系统解决方案

    虚拟现实技术传统的模拟技术相比,虚拟现实技术的主要特征是:操作者能够真正进入一个由计算机生成的交互式三维虚拟现实环境中,与之产生互动,进行交流.通过参与者与虚拟仿真环境的相互作用,并借助人本身对所接触 ...

  7. 大型网站概念及解决方案

    一.判断大型网站的标准 1.pv(page views)网页的浏览量 概念:一个网站所有的页面,在24小时内被访问的总的次数.千万级别,百万级别, 2.uv值(unique vistor)独立访客 概 ...

  8. 大型网站应用中MySQL的架构演变史

    没有什么东西是一成不变的,包含我们的理想和生活!MySQL作为一个免费的开源的关系型数据库,深受大家喜爱,从最初的无人问津到当下的去IOE,都体现出了MySQL举足轻重的作用.今天我们就从淘宝的发展来 ...

  9. 龙果学院mysql分布式集群代码_龙果学院-MySQL大型分布式集群解决方案

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1 课程概述 2 课程背景 3 纵观大型网站架构发展,总结持久化部分需要应对的问题 4 操作系统安装以及配置 5 在CentOS上通过yum安装mysql ...

  10. 从为何“万事开头难”谈大型网站应用设计——运用冥想

    古语说:"万事开头难".为何大多数人在经历过某件事后,都会更多的认可这个观点? 思考的方式分为两类,Positive Thinking和Negative Thinking. 做事的 ...

最新文章

  1. 2021.02.01.stata注释方法
  2. vue2.0 通过v-html指令渲染的富文本无法修改样式的解决方案
  3. C什么k什么_G、D、C、Z、T、K、L、Y,这些字母和火车级别有什么关系
  4. ASP.NET怎么防止多次点击提交按钮重复提交
  5. MySQL与MongoDB设计实例对比
  6. 剑网三《谢云流传》,展现的庞大世界观,背后的故事如何?
  7. 学会阅读硬件的原理图、数据手册大全
  8. 【渝粤教育】 国家开放大学2020年春季 1009离散数学(本) 参考试题
  9. excel教程自学网_Excel自学教程:万能查找函数Lookup的神应用和技巧
  10. python界面-Python GUI 编程(Tkinter)
  11. 房屋租赁管理系统mysql(含论文)
  12. vue移动端app项目
  13. Apple_Mail 登录163邮箱账号
  14. win10升级助手_Win7直接升级Win10,小编三种方法告诉你如何做到,建议收藏哦!
  15. 计算机网卡的总线接口分类有,网卡的详细分类是怎样的?以太网卡有将高层数据转换为比特流的功能吗?...
  16. 记各种纸尿裤用后感——花王大王MOONY尤妮佳好奇帮宝适等等等
  17. matlab非单位阶跃响应,MATLAB下二阶系统的单位阶跃响应
  18. 科学计算机已知角度和边长怎样算斜长,等腰三角形斜长计算公式
  19. 三次插值ClampedB样条曲线Matlab代码实现
  20. 树莓派3B+增加虚拟内存

热门文章

  1. StanfordDB class自学笔记 (11) Indexes and Transactions
  2. c语言顺序表的初始化Status,数据结构(c语言版)顺序表的建立、初始化、插入、删除、遍历等12个基本操作及测试...
  3. mysql取分组最新的一条_基于mysql实现group by取各分组最新一条数据
  4. farm ugly chicken kick(fuck)这个计算机词汇的由来
  5. 【题解】守望者的逃离
  6. SCU 4437 Carries(二分乱搞)题解
  7. 2014年物联网Internet of Things应用简介
  8. 最小发射功率下WSN的连通性和覆盖率
  9. Lucene使用Filter搜索过滤
  10. Vista暴力破解器只是一个玩笑 谁说破解谁撒谎