聊聊负载均衡

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

什么是负载均衡

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

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

我这里指的是广泛的负载均衡,并不会特定指定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的调度算法。

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

我总结一下:

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

    原文作者:算法小白
    原文地址: https://juejin.im/post/5bcae11c5188255c59673d20
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞