专栏名称: 亿级流量网站架构
开涛技术点滴
目录
相关文章推荐
OSC开源社区  ·  这款“锈化”的开源JS打包工具发布1.0 ... ·  20 小时前  
OSC开源社区  ·  在读计算机女博士退学转战OnlyFans—— ... ·  昨天  
程序猿  ·  突发!GitLab将停止对中国区用户提供Gi ... ·  3 天前  
OSC开源社区  ·  中国基础软件和世界优秀软件的差距在哪? ·  4 天前  
51好读  ›  专栏  ›  亿级流量网站架构

Nginx四层负载均衡—《亿级流量网站架构核心技术》

亿级流量网站架构  · 公众号  · 程序员  · 2017-03-31 08:07

正文

本篇摘自《亿级流量网站架构核心技术》第二章 Nginx负载均衡与反向代理 部分内容。


相关章节:

Nginx负载均衡与反向代理—《亿级流量网站架构核心技术》

使用Nginx实现HTTP动态负载均衡—《亿级流量网站架构核心技术》


Nginx 1.9.0版本起支持四层负载均衡,从而使得Nginx变得更加强大。目前,四层软件负载均衡器用得比较多的是HaProxy;而Nginx也支持四层负载均衡,一般场景我们使用Nginx一站式解决方案就够了。本部分将以TCP四层负载均衡进行示例讲解。


静态负载均衡

在默认情况下,ngx_stream_core_module 是没有启用的,需要在安装Nginx时,添加--with-stream配置参数启用。

./configure --prefix=/usr/servers --with-stream


stream指令

我们配置HTTP负载均衡时,都是配置在http指令下,而四层负载均衡是配置在stream指令下。

stream {

    upstream mysql_backend {

        ……

    }

    server {

        ……

    }

}


upstream配置

类似于http upstream配置,配置如下。

upstream mysql_backend {

       server 192.168.0.10:3306 max_fails=2 fail_timeout=10s weight=1;

       server 192.168.0.11:3306 max_fails=2 fail_timeout=10s weight=1;

       least_conn;

}

进行失败重试、惰性健康检查、负载均衡算法相关配置,与HTTP负载均衡配置类似,不再重复解释。此处我们配置实现了两个数据库服务器的TCP负载均衡。


server配置

server {

    #监听端口

    listen 3308;

    #失败重试

   proxy_next_upstream on;

   proxy_next_upstream_timeout 0;

   proxy_next_upstream_tries 0;

    #超时配置

   proxy_connect_timeout 1s;

   proxy_timeout 1m;

    #限速配置

   proxy_upload_rate 0;

   proxy_download_rate 0;

    #上游服务器

   proxy_pass mysql_backend;

}

listen指令指定监听的端口,默认TCP协议,如果需要UDP ,则可以配置“listen 3308 udp;”。


proxy_next_upstream*与之前讲过的HTTP负载均衡类似,不再重复解释。proxy_connect_timeout配置与上游服务器连接超时时间,默认60s。proxy_timeout配置与客户端或上游服务器连接的两次成功读/写操作的超时时间,如果超时,将自动断开连接,即连接存活时间,通过它可以释放那些不活跃的连接,默认10分钟。proxy_upload_rate 和proxy_download_rate分别配置从客户端读数据和从上游服务器读数据的速率,单位为每秒字节数,默认为0,不限速。


接下来就可以连接Nginx的3308端口,访问我们的数据库服务器了。


目前的配置都是静态配置,像数据库连接一般都是使用长连接,如果重启Nginx服务器,则会看到如下Worker进程一直不退出。

Nobody 10268 ……nginx: worker process is shutting down

这是因为Worker维持的长连接一直在使用,所以无法退出,解决办法只能是杀掉该进程。


当然,一般情况下是因为需要动态添加/删除上游服务器,才需要重启Nginx,像HTTP动态负载均衡那样。如果能做到动态负载均衡,则一大部分问题就解决了。


一个选择是购买Nginx企业版,另一个选择是使用nginx-stream-upsync-module,目前,OpenResty提供的stream-lua-nginx-module尚未实现balancer_by_lua特性,因此暂时无法使用。当前开源选择可以使用nginx-stream-upsync-module


动态负载均衡

nginx-stream-upsync-module有一个兄弟nginx-upsync-module,其提供了HTTP七层动态负载均衡,动态更新上游服务器不需要reload nginx。当前最新版本是基于Nginx 1.9.10开发的,因此兼容1.9.10+版本。其提供了基于consul 和etcd进行动态更新上游服务器实现。本部分基于Nginx 1.9.10版本和consul配置中心进行演示。


首先,需要下载并添加nginx-stream-upsync-module模块最新版本。

./configure --prefix=/usr/servers --with-stream--add-module=./nginx- stream-upsync-module


upstream配置

upstream mysql_backend {

    server 127.0.0.1:1111;#占位server

    upsync  127.0.0.1:8500/v1/kv/upstreams/mysql_backend  upsync_timeout =6m upsync_interval=500msupsync_type=consul strong_dependency=off;

   upsync_dump_path /usr/servers/nginx/conf/mysql_backend.conf;

    }

upsync指令指定从consul哪个路径拉取上游服务器配置;upsync_timeout配置从consul拉取上游服务器配置的超时时间;upsync_interval配置从consul拉取上游服务器配置的间隔时间;upsync_type指定使用consul配置服务器;strong_dependency配置nginx在启动时是否强制依赖配置服务器,如果配置为on,则拉取配置失败时nginx启动同样失败。


upsync_dump_path指定从consul拉取的上游服务器后持久化到的位置,这样即使consul服务器出问题了,本地还有一个备份。


从Consul添加上游服务器

curl  -X  PUT  -d"{\"weight\":1,  \"max_fails\":2, \"fail_timeout\":10}" http://127.0.0.1:8500/v1/kv/upstreams /mysql _backend/ 10.0.0.24:3306

curl  -X  PUT -d  "{\"weight\":1, \"max_fails\":2,  \"fail_timeout\":10}" http://127.0.0.1:8500/v1/ kv/upstreams/mysql_backend/192.168.0.11:3306


从Consul删除上游服务器

curl -X DELETE http://127.0.0.1:8500/v1/kv/upstreams/mysql_backend/192.168.0.11:3306

 

upstream_show

server {

    listen 1234;

   upstream_show;

}

配置upstream_show指令后,可以通过curl http://127.0.0.1:1234/upstream_show来查看当前动态负载均衡上游服务器列表。


到此动态负载均衡就配置完成了,我们已讲解完动态添加/删除上游服务器。在实际使用时,请进行压测来评测其稳定性。在实际应用中,更多的是用HaProxy进行四层负载均衡,因此,还是要根据自己的场景来选择方案。


完。 


新书预售地址,请长按二维码预定。