资讯专栏INFORMATION COLUMN

分布式系统的负载均衡 | 架构干货

twohappy / 353人阅读

摘要:是的默认负载均衡策略。一致性哈希负载均衡。所以负载均衡是分布式系统架构设计中必须考虑的因素之一。考虑主要是如何让下游接收到的请求是均匀分布的第层客户端层反向代理层的负载均衡。通过轮询第层反向代理层层的负载均衡。

一、 什么是负载均衡?

什么是负载均衡?

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

负载均衡(LB,Load Balance),是一种技术解决方案。用来在多个资源(一般是服务器)中分配负载,达到最优化资源使用,避免过载。

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

二、什么是高可用?

首先了解什么是高可用?

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

Consistency(一致性)

Availability(可用性)

Partition tolerance(分区容错性)

那高可用(High Availability)是什么?高可用,简称 HA,是系统一种特征或者指标,通常是指,提供一定性能上的服务运行时间,高于平均正常时间段。反之,消除系统服务不可用的时间。

衡量系统是否满足高可用,就是当一台或者多台服务器宕机的时候,系统整体和服务依然正常可用。

举个例子,一些知名的网站保证 4 个 9 以上的可用性,也就是可用性超过 99.99%。那 0.01% 就是所谓故障时间的百分比。比如电商网站有赞,服务不可用会造成商家损失金钱和用户。那么在提高可用性基础上同时,对系统宕机和服务不可用会有补偿。

比如下单服务,可以使用带有负载均衡的多个下单服务实例,代替单一的下单服务实例,即使用冗余的方式来提高可靠性。

总而言之,负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一。一般通过负载均衡,冗余同一个服务实例的方式,解决分布式系统的大流量、高并发和高可用的问题。负载均衡核心关键:在于是否分配均匀。

三、常见的负载均衡案例

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

两个相同的服务实例 hello service ,一个端口 8000 ,另一个端口 8082

通过 Kong 的负载均衡 LB 功能,让请求均匀的分发到两个 hello 服务实例

Kong 的负载均衡策略算法很多:默认 weighted-round-robin 算法,还有 consumer: consumer id 作为 hash 算法输入值等

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

负载均衡策略算法并不高级,最简单的是随机选择和轮循

四、互联网分布式系统解决方案

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

客户端层:比如用户浏览器、APP 端

反向代理层:技术选型 Nignx 或者 F5 等

Web 层:前后端分离场景下, Web 端可以用 NodeJS 、 RN 、Vue

业务服务层:用 Java 、Go,一般互联网公司,技术方案选型就是 SC 或者 Spring Boot + Dubbo 服务化

数据存储层:DB 选型 MySQL ,Cache 选型 Redis ,搜索选型 ES 等

一个请求从第 1 层到第 4 层,层层访问都需要负载均衡。即每个上游调用下游多个业务方的时候,需要均匀调用。这样整体系统来看,就比较负载均衡

第 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分片类似

原创不易,争取多画图,图解胜千言(泥瓦匠@bysocket.com)

参考资料:

《关于负载均衡的一切》https://mp.weixin.qq.com/s/xv...

《Dubbo 的负载均衡》http://dubbo.apache.org/zh-cn...

https://zh.wikipedia.org/wiki...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75440.html

相关文章

  • 干货 | 三分钟带你挑选专属负载均衡

    摘要:有状态四层负载均衡,专注于提供四层有状态负载均衡服务,主要面向基于的四层有状态业务,可提供高性能低延时会话保持等四层应用服务能力。产品定价目前三款负载均衡均免费,后续将采取不同的收费策略。 对于云厂商来说,在提高系统可用性、扩展系统服务能力方面,负载均衡可谓是重要一环。 负载均衡可将用户的业务请求按照一定策略自主分发给多台后端服务器处理,从而调整资源利用情况,消除由于单台后端服务器故障...

    NSFish 评论0 收藏0
  • 一篇读懂布式架构负载均衡技术:分类、原理、算法、常见方案等

    摘要:内容概述本文将从负载均衡技术的分类技术原理常见实现算法常用方案等入手,为您详细讲解负载均衡技术的方方面面。这其中,四层和七层负载均衡技术最为常用,它们也是本文介绍的重点。对应的负载均衡器称为四层交换机,主要分析层及层,实现四层负载均衡。 1、引言 关于负载均衡的解释,百度词条里:负载均衡,英文叫Load Balance,意思就是将请求或者数据分摊到多个操作单元上进行执行,共同完成工作任...

    keke 评论0 收藏0
  • 干货 | LVS虚拟服务器简介

    摘要:工作方式现在虚拟服务器以三种方式实现。即使负载均衡器只有全双工网络适配器,虚拟服务器的最大吞吐量也可以达到以上。隧道功能可用于构建高性能的虚拟服务器。这可以大大提高虚拟服务器的可扩展性。 showImg(https://segmentfault.com/img/bVbtNqp?w=688&h=113); LVS即Linux Virtual Server,虚拟服务器是一个可高扩展且高可用...

    netmou 评论0 收藏0
  • 技术干货 | 如何规划基于Docker微服务架构

    摘要:今天小数又漂洋过海给大家运来一篇干货,在今天的文章中,我们将一同了解如何在上规划一套成功的微服务架构。通过在基于的微服务之前安装反向代理,输入的请求可被正确分发至多主机上的任意数量容器实例当中。规划技巧四安装反向代理及或管理平台。 今天小数又漂洋过海给大家运来一篇干货,在今天的文章中,我们将一同了解如何在Docker上规划一套成功的微服务架构。 Docker的人气仍然持续升温,这主要归...

    awokezhou 评论0 收藏0
  • 《大型网站系统与Java中间件》读书笔记(上)

    摘要:另一个用户请求过来,负载均衡器指派这个请求到服务器。这样就平摊了请求这种方式就叫做轮询策略还有很多种,就看你想怎么实现了,反正这个逻辑的代码放在负载均衡器上。 前言 只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 这本书买了一段时间了,之前在杭州没带过去,现在读完第三章,来做做笔记 showI...

    baukh789 评论0 收藏0

发表评论

0条评论

twohappy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<