记一次nginx负载均衡遇到的问题

电玩女神 2024-04-18 22:20 124阅读 0赞

记一次nginx负载均衡遇到的问题

每天多学一点点~
话不多说,这就开始吧…进击的爆裂无球

文章目录

    • 记一次nginx负载均衡遇到的问题
    • 1.前文
    • 2.准备工作
    • 3.nginx负载配置
    • 4.nginx模块解析
    • 5.总结
    • 7.结语

1.前文

昨天因需求搭建了rabbitmq集群。因国网内部原因,只是在两台windows上机器搭建了一个镜像集群(有时间写一下windows以及docker搭建的过程),然后用nginx或者haproxy进行负载(之前写过 Haproxy安装及配置文件详解及mysql负载均衡 的博客)博主自认为nginx应该是很熟的,结果踩了半天坑也没负载起来,这里和大家分享一下,也顺便记录自己平时工作中遇到的一些问题。

2.准备工作

rabbitmq集群,搭建过程有时间再写博客。其实没有mq集群也没关系,用docker分别装两个,或者直接用mysql也可以。这里博主就用mysql试验一下,因为mysql更直观。
虚拟机mysql + 本地mysql

3.nginx负载配置

nginx官方文档 俗话说的好,不懂直接上官网看,博客毕竟好的太少,也不一定是正确的。

博主之前只用过 ngx_http_upstream_module 模块的负载均衡,并没有特别理解其意思,于是傻乎乎的用这个模块来配置呢。
官方文档截图

自己的配置

  1. http {
  2. include mime.types;
  3. default_type application/octet-stream;
  4. # 负载均衡配置 配置在http模块
  5. upstream mysql {
  6. #最大失败2次 超时3秒 weight 权重大小 越大越优先 轮询
  7. server 127.0.0.1:3306 max_fails=2 fail_timeout=3s weight=1; # 本机mysql
  8. server 192.168.73.130:3306 max_fails=2 fail_timeout=3s weight=1; # 虚拟机mysql
  9. }
  10. server {
  11. listen 5678 default;
  12. server_name 192.168.73.130;
  13. location / {
  14. proxy_connect_timeout 1s;
  15. proxy_pass http://mysql;
  16. }
  17. }
  18. }

这段配置,咋一看是堆的,可是怎么也连不上。检查一下springboot代码
在这里插入图片描述
似乎也没错。。。百思不得其解。。。
于是去官网看了一下,换了配置,启用 ngx_stream_core_module 模块的负载配置
官网截图
自己的配置

  1. #user root;
  2. worker_processes 1;
  3. events {
  4. worker_connections 1024;
  5. }
  6. stream {
  7. upstream mysql {
  8. #最大失败2次 超时3秒 weight 权重大小 越大越优先 轮询
  9. server 127.0.0.1:3306 max_fails=2 fail_timeout=3s weight=1;
  10. server 192.168.73.130:3306 max_fails=2 fail_timeout=3s weight=1;
  11. }
  12. server {
  13. listen 9000;
  14. proxy_connect_timeout 1s;
  15. proxy_timeout 3s;
  16. proxy_pass mysql;
  17. }
  18. }

用jmeter模拟10个线程测试一下,看看是否轮询写入了数据库。
jmeter

虚拟机mysql

在这里插入图片描述

4.nginx模块解析

那么上文说到,为何用 ngx_http_upstream_module 配置负载均衡不行,况且里面还有很多配置策略,如轮询,iphash等等,非常好,却只能用 ngx_stream_core_module 模块来配置呢?
博主上了官网,查找了资料,总结出以下几点,如有不对之处请指正,一起学习~

  1. ngx_http_upstream_module 模块是七层负载均衡,而ngx_stream_core_module是四层负载。
  2. ngx_http_upstream_module 针对的是http协议,而ngx_stream_core_module针对的是tcp协议。
  3. tomcat属于http,而mysql,rabbitmq等是用tcp进行传输的,所以网上一般博客会用ngx_http_upstream_module 来负载tomcat,用ngx_stream_core_module负载mysql或者rabbitmq,却没有说清楚为何。
  4. 老版本的nginx只支持http,从1.9.0开始新增stream模块,支持tcp

具体的各位也可以直接去官网看介绍,更加清楚详细~
nginx这是要抢haproxy的饭碗哦~

5.总结

之前只知道用,没想过那么多,这次因为工作需要用到了才知道自己是多么的肤浅。在这里记录下这个问题,愿看到的朋友们可以少走一些坑,一起学习,一起努力~

7.结语

世上无难事,只怕有心人,每天积累一点点,fighting!!!

发表评论

表情:
评论列表 (有 0 条评论,124人围观)

还没有评论,来说两句吧...

相关阅读

    相关 nginx负载均衡

    \ 负载均衡 1. 什么是负载均衡  负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提