目录
背景
- 大型互联网网站及应用是随着业务的逐步发展与不断创新慢慢演化而成的。在这个进化过程中,会有一些通用的问题需要解决,也会有一些常规的中间件需要构建,本文将对这个演化过程中涉及的分布式技术架构常用套路进行说明与分析。
1、单机架构
- 上线初期,负载较小,应用程序、数据库、文件等所有的资源都部署在一台服务器上。
- 架构上一般采用LAMP(Linux+Apache+Mysql+PHP)技术或Java MVC技术。
2、应用服务与数据服务分离
- 随着访问量的不断增多,服务器的负载持续升高,越来越多的数据及文件资源导致存储不足,这时候需要将应用服务与数据服务进行分离。
- 应用和数据分离后,不同特性的服务器承担不同的角色,并发处理能力和数据存储空间得到了改善。
- 原有的LAMP(Linux+Apache+Mysql+PHP)技术或MVC技术仍然能支撑这种架构。
3、应用服务器集群架构
- 单一应用服务器能够处理的请求连接有限,在业务访问高峰期内,应用服务器成了网站的最大瓶颈。
- 使用集群架构是解决高并发问题的常用套路:将来自用户的访问请求分发到应用服务器集群中的任何一台服务器上,使得单位时间内可以接纳更多的访问请求。
- 加入负载均衡调度服务:通过成熟的负载均衡系统可以有效分配外部请求的流量,使应用服务器的负载压力不再成为整个网站的瓶颈。
3.1 应用服务器集群架构下的Session管理
- 问题:同一客户的请求在负载均衡机制下,会被分配到不同的应用服务器,造成产生不同的Session,即同一个客户在同一网站下产生了不同的状态。
- 解决方案:引入基于Redis的K-V内存数据库,将用户请求产生的Session集中存储并共享,可解决Session不同步的问题。
4、数据库读写分离
- 业务量的急速增加,对于数据库的读写频率也会明显升高,数据库因为负载压力过高也成为网站的瓶颈。大多数业务对数据库的操作是读多写少,将数据库读库与写库分离,是解决此问题的常用套路。
应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到读数据库,即读数据库的数据与主数据库保持同步,这样当应用服务器读数据的时候,就可以通过读数据库获得数据。
- 应用服务器端使用专门的数据访问模块,比如通过Spring+Mybatis配置多数据源,实现应用端的读写分离。
5、利用缓存技术进行加速
- 数据缓存:将业务系统中的“热数据”放入缓存中,应用服务在读取这些数据中,直接从缓存中读取,可以减少数据库的访问压力,从而提高整个网站的数据访问速度。
- 使用反向代理和CDN加速网站响应:既加快了用户访问速度,也减轻后端服务器的负载压力。
CDN和反向代理的基本原理都是缓存,区别在于CDN部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己最近的网络提供商机房获取数据;而反向代理则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果反向代理服务器中缓存着用户请求的资源,就将其直接返回给用户。
6、分布式数据库系统与分布式文件系统
- 与应用服务一样,任何强大的单一服务器都满足不了持续增长的业务需求,单机的数据库系统与文件系统同样也会遇到瓶颈。
- 将不同的业务数据拆分到不同的数据库中,并将对应不同的业务数据库部署在不同的物理服务器上,形成分布式数据库系统。
- 同理存储的文件也可以按文件的业务属性进行拆分,并部署在不同的物理服务器上,形成分布式文件系统。
- Mycat是现阶段流行的分布式数据库系统;常见的分布式文件系统有FastDFS等。
7、NoSQL数据库作为补充
- 互联网与大数据的高速发展,需要面对高效存储、高可扩展性等难题,NoSQL(Not Only SQL)数据库快速的查询响应,灵活的数据模型等特性,正好可以作为传统关系型数据的一个有力补充。
8、使用搜索引擎
- 随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂,大型互联网应用需要非数据库查询技术如搜索引擎。
- Elasticsearch是一个实时的分布式搜索和分析引擎,可以用于全文搜索,结构化搜索以及分析,该技术目前在互联网行业得到了广泛应用。
9. 分布式服务
- 将大型应用中的功能按单一职责的原则进行拆分,每个拆分出来的功能都可被称为一项服务,通过中间件技术(RPC、消息队列、分布式事务等)实现各个服务之间的相互连接与通讯。
9.1 微服务
- 微服务也是一种分布式服务:把服务按单一职责原则进行拆分,形成更小的粒度,独立部署与运行,并由独立的团队负责服务的生命周期管理。