聊聊负载均衡

栏目: 后端 · 发布时间: 6年前

内容简介:以下仅仅是是个人在一个下午的思考负载均衡应用于分布式系统中,也可以说是一个核心模块,主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题,使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性,提高资源的利用率最大化,提高系统的吞吐量,响应延时等等, 我所分享的主要是一些总结层次的,对于一些基础一些不会过多的描述, 像是负载均衡模式,算法,我不具体细节,这些网上都有很多的资料,我想从一个更高层次上分享一下自己对负载均衡的应用和理解。

以下仅仅是是个人在一个下午的思考

什么是负载均衡

负载均衡应用于分布式系统中,也可以说是一个核心模块,主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题,使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性,提高资源的利用率最大化,提高系统的吞吐量,响应延时等等, 我所分享的主要是一些总结层次的,对于一些基础一些不会过多的描述, 像是负载均衡模式,算法,我不具体细节,这些网上都有很多的资料,我想从一个更高层次上分享一下自己对负载均衡的应用和理解。

有哪些常见的负载均衡方式

我这里指的是广泛的负载均衡,并不会特定指定web相关负载均衡

客户端方式

  1. http利用DNS智能负载均衡根据域名地域运营商解析到不同服务器,流量负载均衡
  2. 客户端内置算法自动连接多域名多服务器
  3. 微服务架构客户端通过服务注册中心获取后端服务列表(springcloud stack && kubkernetes service && dubbo 等等)
  4. mysql分库分表 客户端sharding
  5. 消息队列多消费者消费队列中的任务

从上边的整理可以看到,利用客户端实现的负载均衡方式会比较多,自定义程度会更高,有较大的自由度,根据自己的需求变更,这样做的前提是需要一个集中的存储,这个存储存储可以是像让dns机构存储的dns相关对应ip信息,也可以是像微服务中用的较多的etcd, zookeeper一样的分布式存储并watch服务相关相关信息,甚至可以更简单的像 mysql 客户端sharding直接统一客户端的所有配置文件进行一个配置,甚至可以是直接存储在内存的数据。

服务端方式

服务端负载均衡就更多了:

  1. 基于tcp4层的haproxy/lvs
  2. 基于七层http的nginx,trafik
  3. 基于7层mysql的相关proxy mycat,sharding-sphere, kingsharding
  4. 自身软件实现 elasticsearch, 分布式存储

甚至有直接基于硬件的:

硬件F5(--太贵--)

从上可以看到,基于4,7层的负载均衡技术会相对比较成熟,在各个领域都会有相关的产品,而且这一层很可能是流量入口,肯定都会是一些高性能相关软件产品,甚至是一些昂贵的硬件产品, 不过这一层也是最好玩的,可以基于负载均衡或者负载均衡的思路做一些更好玩,更有用的功能。

负载均衡应用的更高级应用 -- 负载均衡可以玩的就特别多了

7层http

由于掌握了流量了入口,获取了所有数据,所有很容易根据数据进行自定义的操作,我举一些例子,像openresty, 这是一个基于nginx与 lua 的高性能Web平台,由于内核还是基于nginx,所以性能损失很小,在保持高性能的同时,你可以在不更改代码的情形下增加你自定义的功能,同时由于openresty是7层的负载均衡,你可以在lua代码中获取到每个http的连接,状态码,url,request参数等等。

  1. 服务网关: 基于连接,你可以很快的设计出一个防止cc攻击的程序, 限制异常访问的ip, 基于url, ip你可以用如令牌桶限流算法限制每个用户每个接口的调用频次。
  2. 自定义调度算法: 基于url, request参数等你能根据请求的参数,将不同的流量进行分发到不同的服务器组。
  3. 服务化upstreaming : 你可以利用一个注册中心去保存你后端服务的server,然后lua程序去watch注册中心,动态更新注册列表。

4层tcp

下边举例一个4层的例子,如基于lvs, 4层能获取到的数据会相对少一些,而且会更底层,操作起来难度会更高。 阿里云利用开源软件keeplived + lvs 并结合隧道vxlan协议实现了基于多租户的4层负载均衡。

a 防御ddos攻击: 基于SYNPROXY模块实现 syn flood类型攻击

b lvs集群实现: lvs和上联交换机运行OSPF协议,lvs和交换机运行OSPE心跳,当一台或多台lvs挂掉还有其他lvs集群提供服务。

c 租户隔离: lvs集群和后端多租户利用vxlan进行通行,保证了lvs在云负载均衡中的隔离性。

描述一个基于软件程度的:

相信稍微大一点的公司都会用到elasticsearch这个搜索引擎,也会用到他的集群模式,具体集群的实现细节我就不做过多的描述了,有兴趣的可以去看看官网。

elasticsearch利用负载均衡相关概念实现了基于数据的分片(数据负载均衡),请求的转发(计算负载均衡)

  1. 数据分片: elasticsearch自身实现了索引sharding, 首先这就是一种数据负载均衡,数据进行分散,不集中到某个节点,保证高可用的同事,将数据计算存储都分摊到各自服务器。
  2. 数据同步: 利用数据sharding的多副本,在保证高可用的同时,也保证了读数据的负载均衡,在进行数据查询的过程中,数据读取会分散到各自的分片数据,如果有多个副本,可以从多个副本中随机选取副本查询,提升查询性能。

从上边的分片副本策略上肯定你能学习到其中的精髓,应用于像分布式存储,数据库设计上边。

关于elasticsearch想多提一句,它自身实现多种分配负载均衡算法,可以根据cpu/mem/网络io, 也可以基于分片数,索引量,甚至可以自定义,根据自身情形找到最合适的算法,这个很像很像openstack vm的虚拟机调度算法和kubernetes pods的调度算法。

上边简单的描述了几项基于负载均衡的应用,负载均衡技术在互联网中真的是非常基础,使用面也非常广,像还有数据库,消息队列,缓存等技术都利用负载均衡的理念,总体来说呢,就是我们无论是在设计程序软件,还是系统设计,架构优化,都可以多想想是否可以用负载均衡的方式解决你的问题。

我总结一下:

简单来说,做好负载均衡就是分别从客户端和服务端考虑,将计算任务分散,数据节点分散,网络任务分散,提升的可用性和扩展性,我这里说得比较虚,个人根据实际情况选择合适的调度策略,解决自身的问题就好。


以上所述就是小编给大家介绍的《聊聊负载均衡》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Just My Type

Just My Type

Simon Garfield / Profile Books / 2010-10-21 / GBP 14.99

What's your type? Suddenly everyone's obsessed with fonts. Whether you're enraged by Ikea's Verdanagate, want to know what the Beach Boys have in common with easy Jet or why it's okay to like Comic Sa......一起来看看 《Just My Type》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具