一个成熟的网站架构并非一开始设计就具有高可用、高伸缩、高性能等特性的,它是随着用户量和业务线不断增长,基础架构才逐渐健壮的。在发展初期,通常都是从0到1,不会一上来就整一些大而全的架构,也不多人这么任性。html
说明
数据库
适用业务:电商/门户/招聘网站后端
开发语言:PHP和JAVA缓存
Web服务:Nginx/Tomcat8服务器
数据库:MySQL网络
操做系统:CentOS架构
物理服务器:Dell R730/R430并发
录制视频地址:http://edu.51cto.com/course/10288.html负载均衡
此文章为博主原创,转载请注明出处,抵制不道德行为!框架
1、单台服务器部署
项目开发完成上线,用户访问量寥寥无几。
2、WEB与数据库独立部署
有必定用户访问量,单台服务器性能有些吃力,想提升并发能力,增长一台服务器,将HTTP请求与SQL操做负载分散不一样服务器。
3、动静分离-初期
什么是动静分离?静态页面与动态页面分离部署。
4、数据库主从与查询缓存
uRedisCache
使用Redis缓存数据库查询结果,将热数据放到内存中,提升查询速度,减小数据库请求。
uMySQL主从
基于binlog异步复制。
uHA
MySQL:Keepalived
u怎么保证Redis缓存时效性?
a) 增长中间件,在主从同步延迟时间内,中间件将SQL读操做还路由到主。
b) 主从同步延迟时间后,再异步发起一次淘汰Cache。
c) 增长消息队列和清理Cache程序,入库同时也写入消息队列,缓存清理程序订阅消息队列,一旦有数据更新,从新Cache。
d) Cache中的Item必定要设置过时时间。
5、七层负载均衡、共享存储与Redis高可用
访问量愈来愈大,单台服务器性能已没法支撑,因而增长负载均衡,水平扩展WEB节点,同时调整动静分离。
u七层负载均衡
根据域名或者后缀转发不一样的upstream。
uNFS网络文件系统
共享存储存放网站程序或者静态资源。
uRedis主从
u动静分离-中期
uHA
LB:Keepalived
NFS:DRBD+Heartbeat
Redis:Sentinel/Keepalived
uSession如何会话保持?
a)源IP Hash
b)Session共享
c)Session Sticky(粘滞会话)
d)Session复制
6、数据库架构扩展
访问量上来了,SQL操做天然也就多了,单台数据库读性能到达瓶颈,响应很慢;业务读多写少,须要提高读性能,考虑扩展数据库架构。
u一主多从
基于binlog异步复制,多个从库同步主库。
u读写分离
a)代码逻辑层区分读写库。
b)使用中间件代理,对SQL解析区分处理;开源主流的有:Atlas、MyCat等。
u分库、分表、分区
分库:根据业务类型分离相关表到不一样数据库;例如WEB、BBS、Blog等。
分表:单个表上千万条记录,操做耗时长,采用垂直拆分和水平拆分,将数据分散存储到不一样小表上。
分区:根据表字段分红多个区块,这些区块能够分布在不一样磁盘上。
以上主要是分散磁盘I/O压力,提升处理性能。
u从库四层负载均衡
当多个从库时,采用LVS实现负载均衡,对程序提供VIP,访问透明。
uHA
主库和从库LB:Keepalived
7、SOA面向服务架构
uSOA
面向服务架构设计理念,拆分臃肿程序架构,以核心业务为单位分解,服务化、模块化,分布式部署。
u服务化治理
使用Dubbo分布式框架,治理SOA服务化,Dubbo提供高性能和透明化RPC远程调用方案 。
u配置中心
使用Zookeeper存储服务链接信息。
u消息队列
使用RabbitMQ解耦服务,保障服务直接通讯。
8、DNS轮训与数据库全文检索引擎
uDNS轮询
DNS负载均衡技术实现原理是在DNS服务器上一个主机名配置多个IP地址,用户访问时,轮训返回解析记录,从而达到负载均衡目的。
u全文检索引擎
像电商网站首页都会有查询表单,当商品多且品种多,关系型数据库庞大,想要快速从数据库中精确检索出用户想要的商品就显的力不从心了。
引入全文检索引擎,创建索引缓存,快速查询海量数据,缓解数据库压力;开源主流的有:ElasticSearch、Sphinx。
9、静态缓存服务器
每次请求静态资源负载都会落在WEB节点和NFS存储上,并且这些资源都是不多变更的,咱们把这些资源缓存到上层,请求到来时先判断本地是否有缓存,若是有就直接返回,从而减小后端HTTP请求,响应会快不少。
10、分布式文件系统与CDN
u分布式文件系统
当图片、视频不少时,NFS在处理效率和存储容量上受局限,这时用分布式文件系统(DFS)就比较合适了,DFS是一种NAS存储架构,C/S模式,多台廉价服务器组成存储集群,提供高性能、高可用、高扩展等特性。客户端挂载到本地,就像访问本地文件系统同样访问远程服务器文件。
uCDN
每次请求静态资源都会落在WEB节点和存储上,并且这些资源都是不多变更的,若是把这些资源放到网站入口,岂不减小后端大量HTTP请求,有什么方法呢?
使用CDN技术,它经过一种缓存技术将频繁访问的资源(主要静态)分布到全国各地边缘服务器,用户先访问CDN服务器,CDN根据职能DNS返回客户端就近网络中的缓存服务器,若是这个缓存服务器有缓存请求的静态资源就直接返回,不然回源站获取返回,从而提升网站访问速度,减小后端服务器压力。
11、四层负载均衡与NoSQL数据库
u四层负载均衡
七层负载均衡要分析应用层协议,效率没有四层高,有些应用场景并不须要分析应用层协议,只想实现转发负载,那么,四层负载均衡是首选。
固然,也能够四层代理七层负载均衡,方面扩展七层负载均衡。
uNoSQL数据库
因为个别SQL查询量大,已经没法在深度优化,能够考虑使用NoSQL非关系型数据库,它的产生就是解决大规模、高并发、大数据量等问题。但比较适合非结构化数据存储,好比详情页内容、原始数据等。
12、如今
u弹性伸缩
自动扩容,节点降级。
u微服务
更细粒度拆分应用,实现服务化、轻量级、自动化部署等。
u内存化
磁盘数据尽量在内存中处理。
u异地容灾
若是不可容忍网站不可用,应考虑到异地备份或异地双活。
u应急预案
十3、谈古至今
尽可能将请求拦截在前面,从而减小数据库和HTTP请求
数据库层是架构瓶颈,须要精心设计,好比架构扩展、SQL优化(压缩、索引等)
避免单点
分解压力
扩展性
找瓶颈出方案
十3、应急预案
SRE:网站可靠性工程师
保证网站不宕机是他们的使命!
制做应急预案大体如下几步:
一、系统分级
按照业务系统重要性划分,好比订单服务挂了,将影响用户没法下单,所以须要投入更多的资源保障;好比管理后台挂了,不会影响到用户;根据业务划分不一样级别,实施不一样的质量保障和成本投入。
二、全链路分析
梳理从网站入口到数据存储的各个环节,找出依赖服务,假设性去分析问题,若是某环节故障,影响范围怎样。
三、全方位监控
对相关链路实施全面监控,包括基础资源监控、服务状态监控、接口监控、日志监控等,确保出现问题有依据可追溯。
四、制定应急预案
多思考方案可行性,不按期进行预案演习,验证预案正确性和可控性及掌握恢复时间。
十4、应对策略
网络接入层:
a)机房故障:从DNS轮训摘除该机房或者切换到其余机房
b)VIP网络异常:切换备用VIP
代理层:
a)IP限流:某些IP访问太大致使后端负载压力太高;实施IP限流
b)后端应用异常:如软硬件故障,摘除异常节点;若是某机房问题切换到其余机房
应用层和服务层:
a)服务异常:某服务访问超时,响应慢;摘除服务或切换到正常服务
b)程序线程池不够用:线程池设置过小,致使请求堆积;提供参数开关,好比动态调整线程池大小
c)请求量太大:请求量太大,超过实际处理能力;请求限流或者设置请求阈值自动扩展节点
缓存层和数据层:
a)Redis挂掉:主从切换
b)MySQL挂掉:主从切换,切换后验证
c)机房故障:切换缓存库/数据库到其余机房