nginx负载均衡详解

发布时间:2021-09-15 22:56:01 作者:chen
来源:亿速云 阅读:188

这篇文章主要介绍“nginx负载均衡详解”,在日常操作中,相信很多人在nginx负载均衡详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nginx负载均衡详解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

核心功能

上面简短的定义中我们大致可以看到两个内容:将请求分发,操作单元;其实就是控制器+执行器模式、Master+Worker模式等等,是不是很熟悉;当然一个成熟的负载均衡器不光有这两个核心功能,还有一些其他的功能,下面看看都有哪些核心功能:

有了以上几个核心的功能,一个负载均衡器大致就形成了,可以把这几个原则用在很多地方,形成不同的中间件或者说内嵌在各种中间件中,比如接入层的LVS,F5,Nginx等,服务层各种RPC框架,消息队列RocketMQ、Kafka,分布式缓存Redis、memcached,数据库中间件shardingsphere、mycat等等,这种分而治之的思路在各种中间件中广泛使用,下面对一些常见的中间件是如何做负载均衡的进行分析,大体上可以分为有状态和无状态两种类型;

无状态

执行单元本身没有状态,其实是更加容易去做负载均衡,每个执行单元都是一样的,常见的无状态的中间件有Nginx,RPC框架,分布式调度等;

接入层

Nginx可以说是我们最常见的接入层中间件了,提供四层到七层的负载均衡功能,提供了高性能的转发,对以上的几个核心功能提供了支持;

upstream tomcatTest {
     server 127.0.0.1:8081;   #tomcat-8081
     server 127.0.0.1:8082;   #tomcat-8082
}
location / {
     proxy_pass http://tomcatTest;
}

以上配置是静态的,如果需要添加或者删除,需要对Nginx重启,很不方便,当然也提供了动态的单元配置,需要借助第三方的服务注册中心比如Consul,etcd等;原理大致如下:

操作单元启动就会注册到Consul中,同样宕机会从Consul中移除;Nginx侧会启动一个Consul-template监听程序,监听Consul上操作单元的变更,然后更新Nginx的upstream,最好重加载upstream;

upstream tomcatTest {
     ip_hash  //根据ip负载均衡,也就是常说的ip绑定
     server 127.0.0.1:8081;   #tomcat-8081
     server 127.0.0.1:8082;   #tomcat-8082
}
upstream tomcatTest {
     server 127.0.0.1:8081 max_fails=2 fail_timeout=20s;
}
location / {
     proxy_pass http://tomcatTest;
     proxy_next_upstream error timeout http_500;
}

当在fail_timeout内出现了max_fails次失败,表示此执行单元不可用;通过proxy_next_upstream配置,当出现配置的错误时,会重试下一台执行单元;

upstream tomcatTest {
     server 127.0.0.1:8081;
     check interval=3000 rise=2 fall=5 timeout=5000 type=tcp;
}

interval:检测间隔时间; rise:检测成功多少次后,操作单元标识为可用; fall:检测失败多少次后,操作单元标识为不可用; timeout:检测请求超时时间; type:检测类型包括tcp,http;

服务层

服务层主要的就是微服务框架比如Dubbo,Spring Cloud等,内部都集成了负载均衡策略,使用起来也是非常方便;

<dubbo:reference interface="" loadbalance="roundrobin" />

Ribbon配置随机规则:

@Bean
public IRule loadBalancer(){
	return new RandomRule();
}
<dubbo:reference cluster="failback" retries="2"/>

分布式调度将调度器和执行器分离,执行器也是通过注册中心的方式提供给调度器,然后由调度器进行负载均衡操作,流程已基本相似,此处不再一一介绍; 可以发现无状态的负载均衡其实更多情况以来注册中心,通过注册中心来动态的增减执行单元,从而很方便的达到扩容缩容;

有状态

有状态的执行单元相对于无状态来说更加有难度,因为每个节点的状态是整个系统的一部分,不是能随意增减的节点的;常见的有状态中间件有:消息队列,分布式缓存,数据库中间件等;

消息队列

现在高吞吐量,高性能的消息队列越来越成为主流,比如RocketMQ,Kafka等,有强大的水平扩展能力;RocketMQ中引入Message Queue机制,Kafka引入分区(Partition),一个Topic对应多个分区,采用分而治之的思路来提高吞吐量,性能;可以看一个RocketMQ的简易图: nginx负载均衡详解

分布式缓存

常见的分布式缓存有redis、memcached,为了能够容纳更多的数据一般都会做分片处理,分片的方式也是多种多样,就拿redis来说可以客户端做分片,基于代理的分片,还有官方提供的Cluster方案;

数据库层

数据库层做均衡处理应该说是最复杂的,首先是有状态的,其次是数据的安全性至关重要,常见的数据库中间件包括:mycat,shardingjdbc等;

<tableRule name="sharding-by-date">
    <rule>
        <columns>create_time</columns>
        <algorithm>sharding-by-date</algorithm>
    </rule>
</tableRule>
<function name="sharding-by-date" class="io.mycat.route.function.PartitionByDate">
    <property name="dateFormat">yyyy-MM-dd</property>
    <property name="sBeginDate">2021-01-01</property>
    <property name="sEndDate">2051-01-01</property>
    <property name="sPartionDay">10</property>
</function>

指定了开始时间,结束时间,以及分区的天数;因为数据是随时间连续的,所以这种方式扩展性是很好的;如果是取模的方式就要考虑清楚分片的数量了,后面如果想改变分片数量就很麻烦了,不像缓存可以使用一致性hash来保证命中率就行了;

到此,关于“nginx负载均衡详解”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. Nginx负载均衡(架构之路)详解
  2. Nginx负载均衡的配置

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

nginx

上一篇:怎么用Emacs发送电子邮件和检查日历

下一篇:Java多线程的实现原理及案例

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》