<关于大型网站技术>李智慧 读书笔记+总结
1、大型网站是什么?
所谓大型网站的定义并不是单单指访问并发量,还有处理的业务量,而非单单的静态页面的访问[静态网页不需要记录用户状态,即Session,只需要Cookies就够了]
2、如何部署简单的网站?
简单的网站部署可分为 客户端(APP,Browser)-Web应用-DataBase,常用做法:机房+服务器(一台放数据库,一台放项目)或者现在的云服务器[DataBase的作用就是有效的有序的用数据结构管理数据的存储和操作的工具]。网站应用程序分开部署到不同的服务器中有点可以提高并发率,并且一台冗机了不影响另外一台的工作。
3、如何解决用户在线问题?
用户在线问题(使用会话Session来解决),同样也可以通过Session来确定this访问的是哪个客户端。Session
是一个Map结构,不同的服务器间的Session要时刻保持同步(不断的传递复制)。Sessionid->一个Web容器(Tomca服务管理工具,IIS服务管理工具)会生成一个用户唯一的id,需同步的Session越多,Web应用承载的并发数就随着服务器的增多到一个临界值后Web应用的并发数还会降低。[原因就处在Session的同步问题上,越多复杂度越高,所占用的资源也就越多]解决方法:采用独立的Session服务器(Memcached分布式缓存服务器)
4、分布式是什么?
分布式:把一个需要巨大计算能力才可以解决的问题分成若干个小部分,依次解决了这些小部分的问题再汇总整合起来便解决了这一个大问题->分布式计算,同理可得分布式存储->可扩展的系统存储结构(把Session放在Cookies进行传输,个人认为不安全,反编译,Session一般有Useid和Password倒是不一定放在一次访问请求中,但是可以采用Https加密传输协议,对传输的请求进行密钥等方式加密,就算是被截取了数据包也不能得到数据)
分布式缓存:缺点会有读数据延时。对读数据进行分类,经常不发生变化的缓存数据放在缓存中.FaceBook是将数据事先都进行了合并操作,再进行批量操作。那么问题来了,大数据时代的搜索如何解决:导出到本地文件,建立索引,倒排索引,效率低于直接数据库搜索。Memcached分布式缓存服务器。在读数据库的操作中,需要把并行转化为串行。
5、如何解决负载和均衡?
解决方案:F5一个做负载和均衡的硬件设备,可以将用户的请求均匀的发布到后台的服务器编译,LVS一个做负载均衡的软件,这样的设备可以存储Sessionid对应的服务器id简称Session粘滞。
6、如何应对大流量?
峰值:最大瞬间值。SOA架构。12306采用限制访问数量,实现网站范围性可用。对于读远远大于写
的网站可以采用读写数据库分离的解决方案。
7、关于数据库拆分
单库数据库->数据库读写分离->缓存技术->搜索技术->拆分数据库->垂直拆分+水平拆分。拆分主库的数据:①比如分开商品表和交易表,把两个表放在单独的数据库垂直拆分,拆分数据库的压力。②把一张表拆分到两台服务器上,水平拆分。关于水平拆分被拆出的表和原表有关联查询即用join查询需改变;数据的增删改(物理删除,逻辑删除)。解决方案:ORM技术(ibatis、mybatis半ORM产品)与SQL更亲近,Hibernate(ORM映射框架),hql查询语言。
数据库水平拆分后,主键设计会变得很难,单表的查询会有难度,外键的设计会变难,数据新增按什么规则把数据存储到具体的数据表里?解决方案:被水平拆分的表主键可以设为一个字段,作为自增标记,如两个可以拆分为1、3、5、7和2、4、6、8以此类推,根据拆分的表的个数设计步长。预估一个表最多会存多少,1-2亿,2亿-4亿以此类推自增列作最大限制。还可以使用整数哈希求余的算法,整数哈希值mod3余数1->DB_01,余数2->DB_02,余数3->DB_03。主键生成规则,做一个主键生成系统,计算GUID,不推荐使用,缺点过多。
启迪一.数据库读写分离的目的是让读和写的操作不影响效率。
启迪二.减少数据的检索范围。
8、做系统开发需要注意哪些?
能用简单的方案解决问题就一定要舍弃复杂的方案,当系统需使用高难度技术的时候,我们一定要让自己感受到这是迫不得已的。500错误:网站逻辑错误;504错误:网站服务端不提供服务。数据库间的同步用Java程序做,不要使用存储过程。海量数据的数据库!数据库的存储方面压力很大的时候,我们所能做的只有降低运算能力。
(个人总结 转载请注明出处)