聊聊负载均衡

如下仅仅是是我的在一个下午的思考mysql


什么是负载均衡nginx

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

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

我这里指的是普遍的负载均衡,并不会特定指定web相关负载均衡spring

客户端方式sql

  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的调度算法。

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

我总结一下:

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

相关文章
相关标签/搜索