haproxy和nginx负载均衡(干货)

admin1年前笔记112
出于对负载均衡工具的疑问,分别对haproxy和nginx的负载均衡进行了抓包分析,分析的过程跟大家分享下。先说下对haproxy抓包得到的结论吧:haproxy在负载均衡的一台后端挂掉后,如果还没达到探测的时间点时,请求还会往挂掉的这台转发,请求会丢失。

haproxy负载均衡的实验过程如下:

1: 先看下haproxy的配置。配置inter 20000为20s检测一次,这个是为了更明显的抓下haproxy的负载均衡探测机制。

listen test9090
        bind 127.0.0.1:9090
        mode tcp
        server localhost90 127.0.0.1:90 check inter 20000
        server localhost91 127.0.0.1:91 check inter 20000

2: 后端我是用nginx进行测试,看下nginx的配置如下。可在/var/www/html/建个index.html进行测试

server {
            listen       90;
            listen       91;
            location /{
                    root /var/www/html;
            }
    }

先用curl 127.0.0.1:9090进行测试,并在机器上开两个窗口看下抓包是否均衡正常,两个窗口运行的命令分别如下:tcpdump -i lo -nn 'port 90' tcpdump -i lo -nn 'port 91'看下负载均衡能否正常工作。

屏幕截图 2023-11-06 092952.png

上面抓包的截图证明nginx监听的90和91端口都有在监听。使用抓包来检测比看日志来更细点,所以还是用抓包来分析了。

3: 抓包查看haproxy的健康检测机制

因为我们配置了inter 20000,也就是告诉haproxy20s检测一次,抓包查看也是20s检查一下。注意下,这个检测是在客户端无任务请求的时候进行探测的,也就是处理请求跟探测是分开的。
屏幕截图 2023-11-06 093008.png

4: 模拟线上故障,nginx挂掉91端口

把listen 91这个nginx的配置去除,然后reload一下,会发现前端的请求如果分发到91端口的话,就会挂掉,经抓包发现haproxy需要探测三次才会把故障的给切下线。我们配置的是20s探测一次,也是最长可能得探测60s才能把故障的切除掉。如果这60s内有1w请求的话,那就会丢掉5k个。如果用在线上的话,探测机制肯定不会是20s一次,一般最多3s会切换掉。
屏幕截图 2023-11-06 093019.png

nginx负载均衡的配置如下:

1: 先看下nginx的反向代理负载均衡配置,如下:

upstream backend {
        server 127.0.0.1:90 weight=1 max_fails=3 fail_timeout=30;
        server 127.0.0.1:91 weight=5 max_fails=3 fail_timeout=30;
    }还是把配置打向后端的90和91端口,然后后面再模拟故障的发生。

server {
            listen 9090;
            location / {
                    proxy_pass http://backend;
            }
    }前端还是使用9090来监听,把请求转发到90和91端口。

2: 后端我还是是用nginx进行测试,看下nginx的配置如下。可在/var/www/html/建个index.html进行测试

server {
            listen       90;
            listen       91;
            location /{
                    root /var/www/html;
            }
    }抓包同样会发生90和91的包都有过来。

3: 抓包查看nginx反向代理负载均衡的健康检测机制

抓包你会发现nginx在没有请求的时候,90和91端口上没有任务的请求。也就是在没有请求的时候,是不会对后端的代理服务器进行检测的。

4: 模拟线上故障,nginx挂掉91端口

把listen 91这个nginx的配置去除,然后reload一下,发现前端的访问没有任务影响。抓包如下,请求有打包91,但由于91没请求到数据。nginx的均衡还会再次去90上取数据。也就是说,nginx如果后端挂掉91端口的话,对前端的请求没有任务影响,只要并发支撑得住的话。

屏幕截图 2023-11-06 093030.png

综合一下:

haproxy对于后端的服务器就算请求没过来也有一直在健康检测,发现有故障的时候在请求没到来的时候会切掉,但如果在检测期间请求到达的话,会有异常。haproxy只会把请求转到后端的一台服务器。

nginx对于后端的服务器没有一直在健康检测,请求过来的时候,分发还是进行分发,只是请求不到数据的时候,会再向好的机器进行请求,直到请求正常为止。nginx请求转到后端一台不成功的话,还会转向另外一台服务器。同时我也测试了下squid,发现squid跟nginx的反向代理负载均衡很相似。

所以如果有用haproxy做为前端负载均衡的话 ,如果后端服务器要维护,在高并发的情况,肯定是会影响用户的。但如果是nginx做为前端负载均衡的话,只要并发撑得住,后端切掉几台不会影响到用户。至于两者的性能,得再继续研究。


相关文章

一条线 理解SSH登录前因后果

一条线 理解SSH登录前因后果

SSH流程图根据流程图我们可以相应的看出我们的程序从最初的浏览器到最后的页面回显的过程。Hibernate层主要负责映射文件和Action和Service的注入,负责后台服务3层之间调用**JSP相当...

Git bisect 命令帮助定位首次引入错误的提交

Git bisect 命令帮助定位首次引入错误的提交

你是不是有过这样的经历:发现代码中有 错误bug,但不知道这个错误是什么时候引入的。这有可能是因为,某个人提交了一份有错误的代码,但没有在他的 Git 提交commit 消息中声明它。这个错误可能已经...

Shell 输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:command1 < file1这样,本来需要从键盘获取输入的命令会转移到文件读取内容。注意:输出重定...

gdb 调试利器

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c++程序员,gdb是必不可少的工具;启动gdb对C/C++程序...

TCP的粘包拆包技术

TCP的粘包拆包技术

平时大家在网络编程过程中可能会遇到这样一种现象:客户端发送了一长串消息,服务端接受的消息揉在一起或者被拆分了,这样就会造成消息难以被正确理解。比如说有一天你特别想喝奶茶,看了一下外卖,「一点点」的奶茶...

Linux下如何实现与Internet时间同步

一、安装ntp[root@server-2 ~]# yum install -y ntpdate二、同步时间// 方式一、使用域名连接,要经...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。