六、nginx负载均衡

ops/2024/12/15 22:09:08/

负载均衡:将四层或者七层的请求分配到多台后端的服务器上。

从而分担整个业务的负载。提高系统的稳定性,也可以提高高可用(备灾,其中一台后端服务器如果发生故障不影响整体业务).

负载均衡的算法

round robin 轮询 rr

负载均衡的默认算法,请求轮流分配给后端服务器。

轮询算法适合用于后端处理器能力相近的情况,默认的算法,可以不加。

默认

加权轮询-weight round robin

轮询的升级版,给每个后端服务器赋予不同的权重。

处理能力更强的服务器设置更高的权重,处理能力低的设置低权重。

高峰时间可以通过这个方法进行流量的优化,适用于服务器处理能力差异比较大的情况。

weight=number

ip_Hash

当我们访问后端服务器,根据客户端的IP地址,使用hash算法计算出IP地址的hash值,然后再根据请求发送到相应的后端服务器。

如果客户端访问的ip地址相同,通过hash算法,再一次的请求会分配到上一次访问的服务器,保证会话的稳定。

负载均衡的会话保持——>ip_Hash

会话保持到期之后,会话中断,重新请求会重新计算hash值。

ip_hash;

最小连接数

配合加权轮询一起使用,最小连接数的算法可以将请求发送到当前连接比较少的后端服务器。

这种算法适用后端服务器处理任务耗时不同的情况,可以有效的避免所有的请求集中在处理能力更强的后端服务器上。

least_conn;

weight=number

URL_Hash

根据请求当中url地址来计算hash值,如果客户端请求的url地址相同,客户端的请求会被分配到同一个服务器。

后台服务器的数量发生变化,会影响结果。(这个讨论无意义)

hash_$request_uri  consistest;

负载均衡的特点

1、根据算法把请求分配到不同的服务器

2、客户端访问的是代理地址,响应也是代理服务器响应。

3、客户端并不了解后端服务器的情况

4、可以提高安全性,后端服务器是隐藏的。

5、负载均衡是有缓存的,可以直接访问缓存,提高响应的速度。

负载均衡的架构

我们做个实验,三台主机,具体配置如下:

zw4:192.168.254.14(代理服务器)

zw5:192.168.254.15(后端)

zw6:192.168.254.16(后端)

客户端:浏览器

配置流量分发,主要是依靠服务器完成的,主要配置在代理服务器完成配置算法。

七层代理

upstream:模块仅支持http协议,用来处理http的请求和响应。

upstream:只能写在http模块当中,不能在server也不能在全局。

基于IP的七层

轮询

配置完之后,我们访问主机(192.168.254.14)的nginx,会发现轮流访问的是设定的2台服务器的nginx,并且状态码为200,表示没有缓存。

加权轮询

这时候权重高的服务器被访问的次数多一点,状态码依然为200,没有缓存。

ip_hash

这时候第一次会根据hash算法匹配到一台服务器,之后再访问都是他了,并且状态码为304,表示访问缓存,这是根据IP地址的hash缓存,也是会话保持。

最小连接数配合轮询

这时候和轮询没什么区别,这是因为不好演示最小连接数,状态码依然为200。

URL_hash

这时候第一次会根据算法匹配到一台服务器,之后再访问都是他了,并且状态码为304表示缓存。注意:这里的缓存是url缓存,url地址不变才导致的访问服务器不变,并不是真正的会话保持。

最后我们停掉192.168.254.15的nginx后,会发现负载均衡依然再正常运行,并且只能访问192.168.254.16的nginx,证明了高可用。

基于域名的七层

 基于域名的七层代理

首先配置代理服务器zw4的nginx主配置文件

注意:1、如果使用域名才做七层,需要把客户端访问的真实IP地址传递给服务端

           2、如果经过代理,所有经过的代理地址也要传递给服务端

接着三台主机都配置域名解析,记得也要修改另外两台后端(zw5和zw6)的nginx上的localhost。

这时候我们发现负载均衡已正常工作,当然也是默认的轮询算法。

四层代理

stream:模块不支持http协议,仅支持tcp和udp,处理数据包流量分发。

四层代理只能写在全局模块当中。

根据上面的实验我们依然在代理服务器zw4上配置nginx的主配置文件,注意server中的端口号不能和下面http模块中server的端口号一样,所有这里我们随便定了个81。

重启nginx后,我们发现负载均衡的算法依然是轮询。

注意:

四层算法默认是轮询,也支持加权轮询和最小连接数支持。

ip_hash和uri_hash,不能在四层算法中使用,因为四层不能处理响应。


http://www.ppmy.cn/ops/142216.html

相关文章

IDEA关闭注释折叠

参考:IDEA关闭注释折叠(注释doc的rendered view模式)_idea toggle rendered view-CSDN博客

ansible自动化运维(四)jinjia2模板

Jinjia2模板 前面说到playbook组成的时候,有介绍到template模块,而template模块对模板文件进行渲染时,使用的就是jinja2模板引擎,jinja2本身就是基于python的模板引擎,所以下面先来了解一下jinjia2模板的一些用法 基…

.NET中的JSON序列化库:Newtonsoft.Json与System.Text.Json对比与示例

在.NET生态系统中,存在多个用于JSON序列化的库,其中最为常用和知名的包括Newtonsoft.Json(也称为Json.NET)和System.Text.Json。以下是这两个库的区别: Newtonsoft.Json(Json.NET) 功能与灵活…

Python的3D可视化库【vedo】2-3 (plotter模块) 增删物体、控制相机

文章目录 4 Plotter类的方法4.3 渲染器内的物体操作4.3.1 添加物体4.3.2 移除物体4.3.3 渲染器的内容列表 4.4 相机控制4.4.1 访问相机对象4.4.2 重置相机状态4.4.3 移动相机位置4.4.4 改变相机焦点4.4.5 改变相机朝向的平面4.4.5 旋转相机4.4.6 对齐相机的上朝向4.4.7 缩放 pl…

在springBoot项目如何对本地配置文件和云服务配置文件独立配置

springBoot中配置文件本地和云服务配置文件独立配置 1.首先我们创建好一个springBoot项目后,需要再创建两个application.yml配置文件,如图 2.然后在各自的配置文件中配置各自环境的信息,注意的是在创建各自环境的yml文件时,必须…

WPF Combox使用 Text无法选择正确获取CHange后的Text

使用固定ComboxItem 无法通过 selectitem as object 来进行回去到 Content内的对香数据。那我只能这个样干&#xff1a; private void CBPaiweiLeixingSelect_Change(object sender, SelectionChangedEventArgs e){ ComboBox ThisBox sender as ComboBox;List<EDaxiaosuixi…

1125 子串与子列 (暴力搜索,PAT甲级中文版,C++实现)

子串是一个字符串中连续的一部分&#xff0c;而子列是字符串中保持字符顺序的一个子集&#xff0c;可以连续也可以不连续。例如给定字符串 atpaaabpabtt&#xff0c;pabt是一个子串&#xff0c;而 pat 就是一个子列。 现给定一个字符串 S 和一个子列 P&#xff0c;本题就请你找…

【Zabbix】解决乱码问题

1. 在控制面板-外观和个性化-字体里面找到楷体 2. 上传至/usr/share/zabbix/assets/fonts/&#xff0c;注意命名要小写 3. 修改/usr/share/zabbix/include/defines.inc.php内容 将defines.inc.php中的内容为simkai 4. 刷新页面解决