企业应用最大的难点在于复杂的业务逻辑,大型网站最大的难点在于大量用户以及高并发和海量的数据存储。
互联网1年对于技术人员的成长等于传统行业3年。
会不会很大程度上在于你是否遇到过这些问题,遇到了这些问题,并且解决了,迈过了这个坎,你就获得了成长,所以百度有大
量搜索的专家,QQ有大量高并发的专家,阿里有大量海量数据处理的专家。
性能、可用性、可伸缩性、可扩展性、安全性。
一、架构图
二、常用架构模式
1.分层
无论是企业机构还是大型网站架构都会进行纵向的划分,根据功能划分为不同的层,下层为上层提供抽象接口,通常分为应用层
(含业务逻辑)-服务层-数据层(持久层),大型的网站切分后,每个层都可以部署在独立的服务器上,层与层之间通过远程服务调
用,以减轻应用服务器的计算压力。
2.分割
按功能进行横向的切分,对于访问频繁的例如首页,可以部署到一个单独的应用服务器中,
这样可以很好的做到可伸缩性。对于单表海量数据,通常也采用分表的方式进行分割,例如
facebook的用户表,分离的多个表中,通过分布式数据库进行存储和访问。
3.集群
为了减轻计算压力,通过部署集群,前端放置负载均衡服务器,将访问压力分散到不同的服务器上。同时为了保证高可用性,即
使简单的功能也至少要部署2台服务器的集群,以免单点故障,导致服务不可用。
4.冗余
为了保证高可用性,服务通过集群冗余,数据则采用主备复制,将数据放到多个服务器中,以免单点故障,数据丢失。通过主备
数据存储架构,也可以实现读写分离,提高性能。
5.异步
服务的消费者将服务调用发送到消息服务器中,服务器的生产者从消息服务器中读取消息队列,逐步进行处理,将消息发送到消
息服务器后立即返回,缩短了用户响应时间,并且有助于消峰。异步可能会影响到业务的处理流程,要从业务上支持异步。
6.缓存
因为不同硬件的速度不同,缓存在整个计算机体系到处可见,例如CPU的多级缓存等,将热点数据缓存到本地缓存或者分布式缓
存服务器中,减轻数据库压力,提升性能。
CDN、反向代理也是缓存。
三、高性能
测试分类:
1.性能测试:在可接受的资源消耗的情况下,进行并发测试,测试软件的性能情况。
2.负载测试:持续对系统加压,直到系统的吞吐量开始下降。
3.压力测试:系统可以承受的极限。
4.稳定性测试:长时间对系统进行性能测试,并均衡的分布压力,观察系统是否稳定。
a.前端:
1.减少http请求。合并js和css,减少http请求,因为1个http请求,服务器端要启动一个线程来响应,请求多了对资源
消耗增加。
2.压缩。压缩可以大大降低网络资源消耗,提高响应时间。
3.CDN。content distributed network 将静态资源,css,js,图片等缓存到离用户最近的网络提供商的服务器中,缩短
访问路径,减少网络环节,提高速度。
4.反向代理。普通代理位于浏览器一测,反向代理位于机房一测。访问后缓存静态资源,下次再访问就直接返回,减轻
了应用服务器的处理压力。由于反向代理和负载均衡机器处于的位置相同,所以也经常作为负载均衡服务器。
b.应用服务器。
1.缓存。
缓存分类:1)jboss cache,将缓存同步到各个集群节点中,如果集群节点多的话,会大大增加 网络的消
耗,另外缓存多太多的话,可能会撑爆了单机的内存。
2)分布式缓存memcached。通过路由算法,路由到一个节点中。
缓存误用:1)读写比高。至少1次写,2次读才有必要使用缓存,马上就失效的数据,不应该缓存 ,只是带
来了缓存一致性问题和增加了网络消耗。通常读写比很高,例如热门博客等。
2)没有热点数据。应该根据2:8原则,应该20%的数据,80%情况下会用到。如果没有热点数据就没有必要缓
存。
2.异步。
3.集群。
c.数据存储。
1.机械硬盘 VS 固态硬盘。固态硬盘有更好的随机读性能,机械硬盘需要移动磁盘臂实现数据读取,随机读性能比大致
为:10:1 ,机械硬盘读取1M数据,时间为2ms,固态硬盘为0.3ms
2.B+树 VS LSM树。传统数据库索引基于B+Tree,使数据按一定的顺序进行存储,加快数据访问速度。LSM是一个n阶合
并树,在内存中写入和读取,因此速度快。
3.RAID VS HDFS。 HDFS以block为单位进行存储,每次存储都同时复制到另外的两个机器中,保证了数据的可靠性,相
当于RAID1。读数据时,通过mapreduce分布式框架读取,保证了速度,相当于RAID0。
四、高可用
a.应用层。
由于应用层无状态,所以通过部署集群就可以实现高可用。
但是例如购物车等session信息实际是有状态的所以也要考虑session。
方法:1.session复制。复制到各个节点。缺点是网络消耗加剧,容易session不一致。 2.session绑定。每次请求都请
求到同一个服务器中。缺点是违背了高可用的原则。
3.cookie传递session信息。缺点是用户可以关闭cookie,cookie太大影响性能。
4.构件独立的session服务器。可以存到单独的数据库中。大型网站通常使用这种方式。
b.服务层。
1)设置超时时间。2)服务降级。 3)服务权重 4)幂级恒等性。
c.数据存储层。
通过数据库备份,将数据冗余保存到多个地方。
冷备和热备。
同步请求(同时请求到主数据库和从数据库,性能取决于性能较差的那一个)和异步请求(请求到主数据库,主数据库
通过异步方式复制到从数据库)。
d.监控。 1)用户行为监控。访问路径,浏览器、操作系统版本等。2)服务器性能监控。网络、内存、CPU占用。 3)运行数据
监控。如缓存命中率,平均响应时间等。
其他保证高可用的方式:
1)升级方式。先升级部分机器,再升级其他机器
2)自动化测试。
3)预生产环境测试。
4)灰度发布,AB测试。
5)分支开发,主线发布。
五、高伸缩
1.应用层。
?负载均衡方式。
1)HTTP请求重定向。每次都请求2次,影响性能。
2)DNS域名解析负载均衡。 有缓存,不即时生效。
3)反向代理负载均衡。
4)IP地址负载均衡。
4)数据链路层负载均衡。通过修改mac地址实现,请求直接返回给浏览器,性能好,目前大型网站基本用这个。Linux LVS。
负载均衡算法。
1)轮询 2)加权 3)最少连接 4)随机
2.分布式缓存
一致性哈希算法。通过这个算法解决增加服务器,缓存失效问题。
增加虚拟层解决方案。插入虚拟节点,分担增加服务器后的负载均衡问题。
3.CAP原理
C是数据一致性
A是可用性
P是分区耐用性
这3个只能保证其中的2个,大型网站要保证可用性,所以通常牺牲一定的数据一致性。
4.数据存储层。
a.分布式数据库。cobar.
b.noSQL产品。HBase。
《大型网站技术架构》 李智慧