一、 什么是负载均衡?

什么是负载均衡?

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

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

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

二、什么是高可用?

首先了解什么是高可用?

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

  1. Consistency(一致性)

  2. Availability(可用性)

  3. 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 有多种均衡方法:

  1. 请求轮询。请求按时间顺序,逐一分配到 web 层服务,然后周而复始。如果 web 层服务 down 掉,自动剔除

upstream web-server
{server ip3;server ip4;
}
  1. ip 哈希。按照 ip 的哈希值,确定路由到对应的 web 层。只要是用户的 ip 是均匀的,那么请求到 Web 层也是均匀的。还有个好处就是同一个 ip 的请求会分发到相同的 web 层服务。这样每个用户固定访问一个 web 层服务,可以解决 session 的问题。

upstream web-server
{ip_hash;server ip3;server ip4;
}

第 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. 从网络到分布式-负载均衡

    从网络到分布式-负载均衡 https://www.toutiao.com/i6939329630021124620/?tt_from=weixin&utm_campaign=client_sh ...

  2. 浅析nginx分布式负载均衡

    在当前大数据时代,数据尤为重要,但是在拥有大量数据的同时也给服务器带来了巨大的挑战,数据量大而服务器承载不了最终就会导致服务器宕机,以至于导致整个系统崩溃.那么怎么解决这一难题呢,这时候就出现了负载均 ...

  3. 什么是负载均衡?分布式负载均衡又是什么?

    本文原出处: 微信公众号-蓝鲸,已由本文作者于洋授权转载,未经同意请勿使用. 一. 什么是负载均衡? 一台服务器的处理能力,主要受限于服务器自身的可扩展硬件能力.所以,在需要处理大量用户请求的时候,通 ...

  4. 集群,分布式,负载均衡,负载均衡算法

    集群 集群的概念 计算机集群通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算机通常称为节点,通常通过局域网连接, ...

  5. 如何通过ETCD实现EasyDSS分布式负载均衡?ETCD部署方案

    EasyDSS的部分项目当中,需要频繁对视频做合成处理,但是视频处理非常耗费CPU,使用单一服务器会使CPU占用率一直处于高负载的状态,因此我们要对这种情况进行优化. 起初计划采用的nginx模式部署 ...

  6. DDD+分布式+负载均衡+服务治理已撸!微服务架构不就这点事?

    孙玄,前58集团技术委员会主席,前转转二手交易平台首席架构师.今天想跟你聊聊企业里那些年薪百万的架构师,他们的架构设计思维是如何升级的. 话不多说,咱们直接来聊点儿干的! 01.百万年薪的核心竞争力 ...

  7. 企业级负载均衡解决方案之二:美团点评四层负载均衡解决方案MGW

    一.前言 在互联网厂商业务不断扩展之后,多种服务的入口会导致接入流量的剧增,所以多数基于IPVS或者Nginx等初级负载均衡技术的早期方案都会面临故障或者失效,所以就像google开发meglev一样 ...

  8. 干货 | 独创分布式网络负载均衡最佳实践

    干货 | 独创分布式网络负载均衡最佳实践 原创:   京东云IaaS产品部   京东云开发者社区    昨天 一.概述 在高可用场景中,后端服务器集群之前通常会部署负载均衡器,负载均衡器作为访问流量的 ...

  9. 企业级负载均衡解决方案之一:Google四层负载均衡解决方案Meglev

    一.前言 在之前的文章<IPVS概览>中给出了IPVS作为负载均衡解决方案的一些技术要求,但是从产品部署的角度讲,IPVS比较适用的场景还是小规模的内网或者外网部署.由于IPVS是使用Li ...

  10. 【从单体架构到分布式架构】(二)请求增多,单点变集群(1):负载均衡

    这是我的第 47 篇原创文章作者 l 会点代码的大叔(CodeDaShu) 上一个章节,我们搭建了一个最简单的单体服务项目,单体架构就是把所有的功能都放在一个工程项目中. 但是当访问量不断增加,我们只 ...

最新文章

  1. IOI2011 BZOJ2600 ricehub
  2. 华为诺亚开源首个亿级中文多模态数据集-悟空,填补中文NLP社区一大空白
  3. DG环境数据库RMAN备份策略制定
  4. 用 Shell 脚本访问 MySQL 数据库
  5. [未解决]jQuery中autocomplete的source格式问题
  6. 如何对SAP Leonardo上的机器学习模型进行重新训练
  7. Android与Js进行交互
  8. 好心酸!三星可折叠屏手机Galaxy Fold下月也无法发货
  9. 设计原则之依赖倒置原则详解
  10. 变换模型——仿射变换和透射变换
  11. 牛逼的Python库MoviePy!利用Python自动剪辑tiktok视频!
  12. 共赴一场有温度的毕业典礼 风声家政商学院高级职业经理人研修班一期收官
  13. 高斯-约当消元法(随机程序,UVA 10828)
  14. 做移动端电子签名发现canvas的 一些坑
  15. 【ROS】将odom里程计数据转换为path路径消息
  16. 816墨盒计算机无法与,西通PG-815、CL-816兼容墨盒和总结
  17. 【python】实现SIMM算法
  18. 回归问题-逐步回归(Stepwise Regression)
  19. RHEL8修改root密码
  20. OC 教程 UI快速创建模板

热门文章

  1. opencontrail vrouter 中的数据流程
  2. python nltk 8 分析句子结构
  3. MATLAB —— 绘制频谱图
  4. 正弦函数的频谱图matlab,怎样用MATLAB画正弦函数以及怎样看频谱图?
  5. 青果信息系统操作问题
  6. 省时又省力的次世代角色流程也太!香!了!
  7. 如何保证分布式系统数据一致性
  8. 如何对网站服务器进行安全防护
  9. Barrett And Montgomery of Polynomials
  10. Codeforces 1180B