分布式系统负载均衡
2019-12-06 本文已影响0人
仰望forward
常见的互联网分布式系统架构分几层,一般如下:
- 客户端层:比如用户浏览器,APP端
- 反向代理层:技术选型Nginx或者F5等
- Web层:前后端分离场景下,Web端可以用NodeJS,RN,Vue
- 业务服务层:java,go
- 数据存储层:DB选型MySQL,Cache选型Redis,搜索选型ES等
第一层:客户端层->反向代理层的负载均衡
DNS轮询:DNS可以通过A(Address,返回域名指向的IP地址)设置多个IP地址。比如这里访问bysocket.com的DNS配置了ip1和ip2。为了反向代理层的高可用,至少会有两条A记录。这样冗余的两个IP对应的Nginx服务实例,防止单点故障。
每次请求bysocket.com域名的时候,通过DNS轮询,返回对应的IP地址,每个IP对应的反向代理层的服务实例,也就是nginx的外网IP。这样可以做到每一个反向代理层实例得到的请求分配是均衡的。
第二层:反向代理层->Web层的负载均衡
通过反向代理层的负载均衡模块处理。比如nginx有多种负载均衡方法:
- 请求轮询。请求按时间顺序,逐一分配到web层服务,然后周而复始。如果web服务层服务down掉,自动剔除
- ip哈希。按照ip的哈希值,确定路由到对应的web层。只要是用户的ip是均匀的,那么请求到web层也是均匀的。
- weight权重
第三层:web层->业务服务层
dubbo负载均衡;feign负载均衡
第四层:业务服务层->数据存储层的负载均衡
数据库存储层的负载均衡,一般通过DBProxy实现。比如MySQL分库分表。
当单库或者单表访问太大,数据量太大的情况下,需要进行垂直拆分和水平拆分两个维度。比如水平切分规则:
- Range、时间
- hash取模,订单根据店铺ID等
但伴随着这块的负载会出现下面的问题,需要解决:
- 分布式事务
- 跨库join等