伸缩性的概念

伸缩性是指通过改变部署机器/服务的数量来扩大或者缩小网站的服务处理能力。

各层可伸缩行的解决方案

实现可伸缩性的前提是进行垂直拆分和水平拆分。垂直拆分:将应用,数据存储和缓存原来部署在同一台服务器上,拆分成独立机器部署。水平拆分:将整个应用拆分成多个微服务独立容器部署。见下图:

可伸缩架构下载 可伸缩结构图_服务器

网站拆分图

  • 应用层可伸缩性解决方案

HTTP请求流程:用户请求经负载均衡设备,通过负载均衡算法从集群中选出一台服务器进行请求处理,处理完后响应用户。

划重点:负载均衡设备、负载均衡算法、集群。

思考

  1. 什么样的负载均衡设备?负载均衡有哪些分类?如何实现的?
  2. 服务通过什么方式组成集群的?怎么感知彼此存在的?

抽象提取方案:服务发现(服务注册+服务发现) + 负载均衡(负载均衡分类+算法)

1. 服务发现(Nginx、K8s、Dubbo)阐述:

Nginx:手动在upstream模块配置后端服务器列表,自身没有提供自动服务注册和发现,实现方案可参考:Nginx+Consul+Consul Template+Registrator

K8s: 基于DNS A记录解析做的服务发现,具体流程:创建个Service 对象,得到一个虚拟IP,被称为 ClusterIP。Service名及ClusterIP被自动注册到集群DNS中,并且会创建相关的 Endpoints 对象用于保存符合标签条件的健康Pod的列表,Service对象会向列表中的Pod转发流量。

Dubbo:基于注册中心做的服务发现,具体流程:Provider启动时,将java服务接口元信息注册到Dubbo的注册中心上。Consumer启动时,从Dubbo注册中心检索订阅java服务接口元信息。注册中心感知到Provider节点变化后会通知到Consumer。

综述,服务发现实现方案:基于DNS A记录解析和注册中心实现服务发现。

2. 负载均衡

负载均衡分类:二层(MAC)、三层(IP)、四层(IP+Port)、七层(HTTP)负载均衡,DNS负载均衡。

二层(MAC)负载均衡:负载均衡服务器和业务服务器都绑定相同的虚拟IP(VIP),通过修改MAC地址做负载均衡,又称为三角传输模式。优点:负载均衡服务器只负责请求转发,不负责请求响应(由后端服务器直接响应客户端),吞吐量大。缺点:负载均衡控制粒度粗。

可伸缩架构下载 可伸缩结构图_负载均衡_02

基于MAC负载均衡

三层(IP)负载均衡:只需负载均衡服务器绑定公网IP,业务服务器不用绑定公网IP。通过修改请求的目的IP转发到业务服务器处理,处理完后响应数据回传到负载均衡服务器,负载均衡服务器再将数据包源地址改为自身IP发送给用户。请求和响应都经负载均衡服务器,负载均衡服务器压力更大,比MAC负载均衡性能更差。

可伸缩架构下载 可伸缩结构图_架构_03

基于IP负载均衡

问题:响应数据如何回传到负载均衡服务器?

  1. 负载均衡服务器修改数据包目的IP的同时修改源地址为负载均衡的IP。
  2. 业务服务器的网关地址配置成负载均衡的IP。

四层(IP+Port)负载均衡:在三层IP负载均衡基础上,加上了四层端口Port,通过端口来决定流量负载到哪台服务器上。优点:基于端口转发,比三,四层负载均衡控制粒度细了。负载均衡软件:F5(硬件),LVS,HAproxy

七层(HTTP)负载均衡:在应用层基础上进行负载均衡的,可以基于URL转发,控制粒度更细。负载均衡软件:Nginx,HAproxy

DNS负载均衡:基于DNS A记录解析做的负载均衡。

综述,一般公司常用负载均衡是四层负载均衡和七层负载均衡,大型公司会用到DNS负载均衡。

负载均衡算法:轮询、加权轮询、随机、最少连接、ip_hash

Nginx:轮询、加权轮询、ip_hash、三方(fair、url_hash)

Dubbo:随机、权重轮询、最少活跃调用数、一致性Hash

  • 数据库可伸缩性解决方案

可伸缩架构下载 可伸缩结构图_负载均衡_04

数据库变化图

读伸缩性方案:随着流量增加,读多写少的数据库会遇到读的瓶颈,此时需要使用读写分离来解决,将读和写拆分开。 利用主从同步部署多个从服务器,可以做到读的无限扩容。

写伸缩性方案:随着流量和数据量增加,单库单表会遇到容量和磁盘/带宽IO瓶颈,此时需要分库分表来支持高并发写。

  • 缓存层redis可伸缩性解决方案

伸缩性方案:缓存使用场景最多的是高并发读,也可以使用主从同步+读写分离来解决,但是redis没有提供读写分离,这个需要自己实现。实现方案:redis哨兵模式+监听事件。