伸缩性的概念
伸缩性是指通过改变部署机器/服务的数量来扩大或者缩小网站的服务处理能力。
各层可伸缩行的解决方案
实现可伸缩性的前提是进行垂直拆分和水平拆分。垂直拆分:将应用,数据存储和缓存原来部署在同一台服务器上,拆分成独立机器部署。水平拆分:将整个应用拆分成多个微服务独立容器部署。见下图:
网站拆分图
- 应用层可伸缩性解决方案
HTTP请求流程:用户请求经负载均衡设备,通过负载均衡算法从集群中选出一台服务器进行请求处理,处理完后响应用户。
划重点:负载均衡设备、负载均衡算法、集群。
思考:
- 什么样的负载均衡设备?负载均衡有哪些分类?如何实现的?
- 服务通过什么方式组成集群的?怎么感知彼此存在的?
抽象提取方案:服务发现(服务注册+服务发现) + 负载均衡(负载均衡分类+算法)
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地址做负载均衡,又称为三角传输模式。优点:负载均衡服务器只负责请求转发,不负责请求响应(由后端服务器直接响应客户端),吞吐量大。缺点:负载均衡控制粒度粗。
基于MAC负载均衡
三层(IP)负载均衡:只需负载均衡服务器绑定公网IP,业务服务器不用绑定公网IP。通过修改请求的目的IP转发到业务服务器处理,处理完后响应数据回传到负载均衡服务器,负载均衡服务器再将数据包源地址改为自身IP发送给用户。请求和响应都经负载均衡服务器,负载均衡服务器压力更大,比MAC负载均衡性能更差。
基于IP负载均衡
问题:响应数据如何回传到负载均衡服务器?
- 负载均衡服务器修改数据包目的IP的同时修改源地址为负载均衡的IP。
- 业务服务器的网关地址配置成负载均衡的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
- 数据库可伸缩性解决方案
数据库变化图
读伸缩性方案:随着流量增加,读多写少的数据库会遇到读的瓶颈,此时需要使用读写分离来解决,将读和写拆分开。 利用主从同步部署多个从服务器,可以做到读的无限扩容。
写伸缩性方案:随着流量和数据量增加,单库单表会遇到容量和磁盘/带宽IO瓶颈,此时需要分库分表来支持高并发写。
- 缓存层redis可伸缩性解决方案
伸缩性方案:缓存使用场景最多的是高并发读,也可以使用主从同步+读写分离来解决,但是redis没有提供读写分离,这个需要自己实现。实现方案:redis哨兵模式+监听事件。