首页 > 编程知识 正文

如何实现分布式系统的负载均衡(分布式系统如何负载均衡)

时间:2023-05-04 05:23:17 阅读:101249 作者:1004

一、 什么是负载均衡?

什么是负载平衡?

记得第一次接触Nginx是在实验室,当时需要用Nginx在服务器上部署网站。Nginx是一个服务组件,用于反向代理、负载平衡、HTTP缓存等。这里的负载平衡是什么?

负载平衡是一种技术解决方案。它用于在多个资源(通常是服务器)之间分配负载,以优化资源使用并避免过载。

资源相当于每个服务实例的执行操作单元。负载均衡是将大量的数据处理操作分配给多个操作单元执行,用于解决互联网分布式系统的大流量、高并发和高可用性问题。什么是高可用性?

00-1010首先,什么是高可用性?

这就是CAP定理,分布式系统的基础,分布式系统的三个指标:

一致性可用性分区容差什么是高可用性?高可用性,简称HA,是系统的一个特性或指标,通常意味着具有一定性能的服务运行时间高于平均正常时间段。否则,消除系统服务不可用的时间。

衡量系统是否满足高可用性意味着当一台或多台服务器停机时,整个系统和服务仍然正常可用。

比如一些知名网站保证四个9以上的可用性,即可用性超过99.99%。那0.01%就是所谓停机时间的百分比。比如电商网站受到好评,服务不到位会造成商家亏钱,用户流失。然后在提高可用性的基础上,对系统停机和服务不可用进行补偿。

例如,对于订购服务,可以使用具有负载平衡的多个订购服务实例来代替单个订购服务实例,即使用冗余来提高可靠性。

总之,负载平衡是分布式系统架构设计中必须考虑的因素之一。一般来说,分布式系统的大流量、高并发和高可用性问题是通过负载均衡和相同服务实例的冗余来解决的。负载均衡的关键在于分布是否均匀。

二、什么是高可用?

场景1:在微服务架构中,网关路由到特定的服务实例hello:

hello service的两个完全相同的服务实例,一个端口8000,另一个端口8082,通过Kong的负载均衡LB功能,有很多负载均衡策略算法,使得请求均匀分布到hello Service Kong的两个实例:默认的加权循环算法,以及作为hash算法输入值的consumer: consumer id等。

场景2:在微服务架构中,服务A调用服务b的集群。通过了Ribbon客户端负载平衡组件:

负载均衡策略的算法并不先进。最简单的是随机选择和循环赛

三、常见的负载均衡案例

常见的互联网分布式系统架构分为几层,一般如下:

客户端层:如用户浏览器、APP端反向代理层:Web层如技术选择Nignx或F5:在前后端分离的场景下,Web端可以使用NodeJS、RN、Vue业务服务层:Java、Go、一般互联网公司,技术方案选择为SC或Spring Boot Dubbo服务数据存储层:DB选择MySQL、Cache选择Redis、搜索选择es等。从第一层到第四层,所有的逐层访问都需要负载平衡。即每个上游调用多个下游业务方时,需要平均调用。这样,整个系统的负载更加平衡。

第1层:客户端层-反向代理层的负载平衡

如何实现客户端层和反向代理层的负载均衡?

答案是:DNS轮询。DNS可以通过A (Address,返回域名指向的IP地址)设置多个IP地址。例如这里,访问bysocket.com的DNS配置为ip1和ip2。为了反向代理层的高可用性,至少会有两条A记录。这两个冗余ip对应的nginx服务实例可以防止单点故障。

每次你请求bysocket.com的域名,你都可以通过DNS轮询返回一对。

应的 ip 地址,每个 ip 对应的反向代理层的服务实例,也就是 nginx 的外网ip。这样可以做到每一个反向代理层实例得到的请求分配是均衡的。

第 2 层:反向代理层 -> Web 层 的负载均衡

反向代理层 -> Web 层 的负载均衡如何实现呢?

是通过反向代理层的负载均衡模块处理。比如 nginx 有多种均衡方法:

请求轮询。请求按时间顺序,逐一分配到 web 层服务,然后周而复始。如果 web 层服务 down 掉,自动剔除upstream web-server { server ip3; server ip4; } ip 哈希。按照 ip 的哈希值,确定路由到对应的 web 层。只要是用户的 ip 是均匀的,那么请求到 Web 层也是均匀的。 还有个好处就是同一个 ip 的请求会分发到相同的 web 层服务。这样每个用户固定访问一个 web 层服务,可以解决 session 的问题。upstream web-server { ip_hash; server ip3; server ip4; } weight 权重 、 fair、url_hash 等

第 3 层:Web 层 -> 业务服务层 的负载均衡

Web 层 -> 业务服务层 的负载均衡如何实现呢?

比如 Dubbo 是一个服务治理方案,包括服务注册、服务降级、访问控制、动态配置路由规则、权重调节、负载均衡。其中一个特性就是智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

为了避免避免单点故障和支持服务的横向扩容,一个服务通常会部署多个实例,即 Dubbo 集群部署。会将多个服务实例成为一个服务提供方,然后根据配置的随机负载均衡策略,在20个 Provider 中随机选择了一个来调用,假设随机到了第7个 Provider。LoadBalance 组件从提供者地址列表中,使用均衡策略,选择选一个提供者进行调用,如果调用失败,再选另一台调用。

Dubbo内置了4种负载均衡策略:

RandomLoadBalance:随机负载均衡。随机的选择一个。是Dubbo的默认负载均衡策略。RoundRobinLoadBalance:轮询负载均衡。轮询选择一个。LeastActiveLoadBalance:最少活跃调用数,相同活跃数的随机。活跃数指调用前后计数差。使慢的 Provider 收到更少请求,因为越慢的 Provider 的调用前后计数差会越大。ConsistentHashLoadBalance:一致性哈希负载均衡。相同参数的请求总是落在同一台机器上。

同样,因为业务的需要,也可以实现自己的负载均衡策略

第 4 层:业务服务层 -> 数据存储层 的负载均衡

数据存储层的负载均衡,一般通过 DBProxy 实现。比如 MySQL 分库分表。

当单库或者单表访问太大,数据量太大的情况下,需要进行垂直拆分和水平拆分两个维度。比如水平切分规则:

Range 、 时间hash 取模,订单根据店铺ID 等

但伴随着这块的负载会出现下面的问题,需要解决:

分布式事务跨库 join 等

现状分库分表的产品方案很多:当当 sharding-jdbc、阿里的 Cobar 等

五、小结

对外看来,负载均衡是一个系统或软件的整体。对内看来,层层上下游调用。只要存在调用,就需要考虑负载均衡这个因素。所以负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一。考虑主要是如何让下游接收到的请求是均匀分布的:

第 1 层:客户端层 -> 反向代理层 的负载均衡。通过 DNS 轮询第 2 层:反向代理层 -> Web 层 的负载均衡。通过 Nginx 的负载均衡模块第 3 层:Web 层 -> 业务服务层 的负载均衡。通过服务治理框架的负载均衡模块第 4 层:业务服务层 -> 数据存储层 的负载均衡。通过数据的水平分布,数据均匀了,理论上请求也会均匀。比如通过买家ID分片类似

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。