11. Nginx实现负载均衡

6.2 实现Nginx TCP负载均衡

Nginx在1.9.0版本开始支持tcp模式的负载均衡, 在1.9.13版本开始支持udp协议的负载均衡, udp主要用于DNS的域名解析, 其配置方式和指令和http代理类似, 其基于ngx_stream_proxy_module模块实现tcp负载, 另外基于模块ngx_http_upstream_module实现后端服务器分组转发, 权重分配, 状态监测, 调度算法等高级功能

如果是编译安装, 需要指定--with-stream选项才能支持ngx_stream_proxy_module模块

6.2.1 tcp 负载均衡配置参数

stream { # 定义stream相关的服务, 定义在main语句块和http平级
    upstream backend { # 定义后端服务器
        hash $remote_addr consistent; # 定义调度算法
        server backend1.example.com:12345 weight=5; # 定义具体server
        server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
        server unix:/tmp/backend3;
    }

    upstream dns { # 定义后端服务器
        server 10.0.0.1:53535; # 定义具体server
        server dns.example.com:53;
    }

    server { # 定义server, 定义nginx如何接收和转发远程用户的请求
        listen 12345; # 监听ip:port
        proxy_connect_timeout 1s; # 连接超时时间
        proxy_timeout 3s; # 转发超时时间
        proxy_pass backend; # 转发到具体服务器组
    }
    
    server {
        listen 127.0.0.1:53 udp reuseport;
        proxy_timeout 20s;
        proxy_pass dns;
    }

    server {
        listen [::1]:12345;
        proxy_pass unix:/tmp/stream.socket;   
    }
} 

6.2.2 负载均衡案例: Redis

6.2.2.1 准备环境

准备两台后端服务器, 安装redis
可以基于每台服务器的run_id测试调度结果
yum -y install redis
vim /etc/redis.conf
bind 0.0.0.0 
systemctl enable --now redis

6.2.2.2 nginx配置负载均衡

# 先在nginx主配置文件定义tcp负载均衡的子配置文件路径
[13:50:26 root@nginx ~]#vim /apps/nginx/conf/nginx.conf
include /apps/nginx/conf/tcp/tcp.conf; # 注意: tcp负载均衡的子配置文件路径指令要和http语句块平级, 一般写在主配置文件最后即可, 由于stream是一级语句块, 整个nginx只能有一个, 因此, 所有的tcp/udp负载均衡配置, 都写在同一个文件里
[00:30:17 root@nginx /apps/nginx/conf/tcp]#vim redis.conf

stream {                                                                                                                                                                            

    upstream redis-server {
        server 10.0.0.85:6379 weight=2;
        server 10.0.0.84:6379 weight=1;

    }
    server{
        # 配置负载均衡时, server语句块不支持server_name, 客户端直接访问nginx的ip地址和端口
        listen 6379;
        proxy_pass redis-server;
    }

}

[00:35:51 root@nginx /apps/nginx/conf/tcp]#nginx -s reload
[13:51:16 root@nginx ~]#ss -ntl
State                   Recv-Q                  Send-Q                                    Local Address:Port                                     Peer Address:Port                  
LISTEN                  0                       128                                             0.0.0.0:6379     # 验证监听6379端口                                      0.0.0.0:*                     
LISTEN                  0                       128                                             0.0.0.0:80                                            0.0.0.0:*                     
LISTEN                  0                       128                                             0.0.0.0:22                                            0.0.0.0:*                     
LISTEN                  0                       128                                                [::]:22                                               [::]:*  

6.2.2.3 客户端连接nginx测试

# 可以看到1:2调度
[00:38:02 root@client ~]#redis-cli -h 10.0.0.86 info server | grep run_id
run_id:6c86d33bf1002c7839f43a6ac9055f0406d61b7a
[00:38:25 root@client ~]#redis-cli -h 10.0.0.86 info server | grep run_id
run_id:580343970ae2d5078ff064260e170a8932a48338
[00:38:27 root@client ~]#redis-cli -h 10.0.0.86 info server | grep run_id
run_id:6c86d33bf1002c7839f43a6ac9055f0406d61b7a
[00:38:28 root@client ~]#redis-cli -h 10.0.0.86 info server | grep run_id
run_id:6c86d33bf1002c7839f43a6ac9055f0406d61b7a

6.2.3 负载均衡案例: MySQL

图片.png

6.2.3.1 准备环境

为了测试效果, 后端分别使用mariadb和mysql
数据库上创建用户, 需要对nginx的ip地址进行授权
nginx基于四层的调度是伪四层, 因此nginx会拆分请求和响应报文, 重新封装
# 10.0.0.85 - MySQL
[23:34:16 root@mysql ~]#yum -y install mysql-server
[23:35:30 root@mysql ~]#systemctl enable --now mysqld
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
[23:42:31 root@mysql ~]#mysql -e 'create user admin@"10.0.0.%" identified by "000000"'
# 10.0.0.84 - MariaDB
[23:34:41 root@mariadb ~]#yum -y install mariadb-server
[23:35:13 root@mariadb ~]#systemctl enable --now mariadb
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
[23:44:03 root@mariadb ~]#mysql -e 'create user admin@"10.0.0.%" identified by "000000"'

6.2.3.2 nginx配置负载均衡

# 单独指定存放tcp负载均衡的配置文件, 关于tcp的负载均衡配置, 都可以写到tcp目录下某个.conf文件里, 因为stream是一级语句块, 一个服务器只能有一个, 因此只能存在一个.conf配置文件, 专门来配置tcp负载均衡, 如果多个文件都有stream模块, 那么重启nginx会报错
include /apps/nginx/conf/tcp/*.conf;                                                                                                                                                                                                                                                                            
[23:47:05 root@nginx /apps/nginx/conf]#mkdir  /apps/nginx/conf/tcp
[23:47:44 root@nginx /apps/nginx/conf]#cd  /apps/nginx/conf/tcp
[23:47:45 root@nginx /apps/nginx/conf/tcp]#
[23:47:46 root@nginx /apps/nginx/conf/tcp]#
[23:47:46 root@nginx /apps/nginx/conf/tcp]#vim mysql.conf
[23:47:46 root@nginx /apps/nginx/conf/tcp]#vim mysql.conf

stream {

     upstream mysql-server { # upstream定义后端服务器组
        server 10.0.0.85:3306 max_fails=3 fail_timeout=30s;
        server 10.0.0.84:3306; # 后端服务器监听的端口
     }

     server { # server定义nginx如何接收和处理客户端请求, 包括监听的端口, 和转发到的后端群组
        listen 3306; # 面对客户端的端口
        proxy_pass mysql-server;
     }
                                                                                                                                                                                    
}

[23:59:02 root@nginx /apps/nginx/conf/tcp]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[23:59:05 root@nginx /apps/nginx/conf/tcp]#nginx -s reload
[23:59:10 root@nginx /apps/nginx/conf/tcp]#ss -ntl
State                   Recv-Q                  Send-Q                                    Local Address:Port                                     Peer Address:Port                  
LISTEN                  0                       128                                             0.0.0.0:3306                                          0.0.0.0:*                     
LISTEN                  0                       128                                             0.0.0.0:80                                            0.0.0.0:*                     
LISTEN                  0                       128                                             0.0.0.0:22                                            0.0.0.0:*                     
LISTEN                  0                       128                                                [::]:22                                               [::]:*

6.2.3.3 客户端连接nginx测试

# 10.0.0.187安装mysql客户端

[00:00:27 root@client ~]#yum -y install mysql
# 连接nginx

[00:00:44 root@client ~]#mysql -h 10.0.0.86 -uadmin -p000000
MySQL [(none)]> 
# 验证版本
图片.png

此时后端服务器会认为是nginx在访问, 因此数据库授权也是针对nginx进行授权

图片.png

通过nginx的tcp负载均衡, 可以实现对后端的PXC集群进行调度

图片.png

补充: lvs和nginx四层负载均衡的区别

nginx对于tcp的负载均衡实际是伪四层, 因为nginx会代替客户端向后端服务器发起请求, 而不是单独的转发, 后端服务器看到的是nginx服务器的ip地址
lvs对于tcp的负载均衡是只转发, 后端服务器看到的是客户端的源ip地址
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容