nginx-17 动态负载均衡

负载均衡请参考nginx-16 负载均衡

前言

通常如果要增加、删除一台上游服务器的步骤是,编辑nginx.conf,再执行nginx -s reload重载配置。

这样的做法,一个是相对麻烦,第二个问题是nginx -s reload对于nginx是有压力的,它会去重启进程去加载配置,消耗系统的cpu资源。

upstream backend {
	server 49.233.70.27:9502;
    server 49.233.70.27:9503;
    server 49.233.70.27:9504;
}

动态扩容与缩容

使用nginx的第三方模块nginx-upsync-module结合consul实现。

nginx-upsync-module提供了动态的负载均衡,动态更新上游的服务器不需要reload nginx,它的功能是拉取 consul 的后端 server 的列表,并更新 Nginx 的路由信息。此模块不依赖于任何第三方模块。 consul 作为 Nginx 的 数据库db,利用 consul 的 KV (key/value storge存储)服务,每个 Nginx work 进程独立的去拉取各个 upstream 的配置,并更新各自的路由。

示意图
在这里插入图片描述
接下来的准备工作是1,平滑升级nginx,增加nginx-upsync-module模块。2,安装consul。

平滑升级 nginx

参考nginx-15 第三方组件和nginx平滑升级

随意目录,下载第三方模块,或者直接下载到nginx编译安装的目录,nginx编译安装的目录一般在nginx的src目录,有绿色的configure可执行文件目录:

[root@VM_0_13_centos src]# pwd
/www/server/nginx/src
[root@VM_0_13_centos src]# ls
auto        configure  lua_nginx_module   nginx-sticky-module  openssl           src
CHANGES     contrib    Makefile           ngx_cache_purge      pcre-8.43
CHANGES.ru  html       man                ngx_devel_kit        pcre-8.43.tar.gz
conf        LICENSE    nginx-http-concat  objs                 README

1,下载nginx-upsync-module模块

wget  https://github.com/weibocom/nginx-upsync-module/archive/v2.1.0.tar.gz

下载完成后并解压tar zxvf v2.1.0.tar.gz
在这里插入图片描述
2,添加模块重新编译nginx

查看nginx编译信息nginx -V
在这里插入图片描述
将原编译参数复制,--add-module=将刚才解压的nginx-upsync-module-2.1.0文件夹路径。--add-module=/www/server/nginx/src/nginx-upsync-module-2.1.0
在这里插入图片描述
重新编译

./configure 新参数

make 但千万不要make install 编译而不安装,等待几分钟,这时候会在objs生成新的nginx文件
在这里插入图片描述
3,进入到老的nginx文件目录,重命名为nginx.old(期间 nginx 并不会停止服务)
在这里插入图片描述
4,将新的nginx文件拷贝入老的nginx文件目录

cp /www/server/nginx/src/objs/nginx /www/server/nginx/sbin/nginx

在这里插入图片描述
5,回到编译目录(configure所在目录),执行升级命令make upgrade
在这里插入图片描述
完成

安装consul

这里用docker容器来运行consul,docker的安装参考CentOS docker简易安装
安装docker后,直接pull (拉取) 一个consul(镜像)即可。

docker pull consul
[root@VM_0_13_centos src]# docker pull consul
Using default tag: latest
latest: Pulling from library/consul
9123ac7c32f7: Pull complete
dc9a65925859: Pull complete
a9fef79731af: Pull complete
8d7a443e3888: Pull complete
4557d0c5f939: Pull complete
4b88d78010e4: Pull complete
Digest: sha256:dd1b6f684c05d8fb1199a27fdf51cf084a72f1eb387300665b24244c4c5b85b7
Status: Downloaded newer image for consul:latest

查看consul镜像

docker images
[root@VM_0_13_centos src]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
consul              latest              405912db092c        43 hours ago        126MB

运行consul容器

根据consul镜像运行一个容器(相当于开启一个虚拟机,并且运行了consul服务),docker运行容器参考docker- 容器

[root@VM_0_13_centos ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
consul              latest              405912db092c        2 days ago          126MB
[root@VM_0_13_centos ~]# docker run -itd --name dynamicupstream -p 8700:8500 consul
71d59a8034e1287d2022a0ea3dd0f9485bbac31802789cf29e7542500226e94d
[root@VM_0_13_centos ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS
                              NAMES
71d59a8034e1        consul              "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        8300-8302/tcp, 8301-8302/udp, 8600/tcp, 8600 /udp, 0.0.0.0:8700->8500/tcp   dynamicupstream

实现动态扩容、缩容

先建立一个空的servers_test.conf(名称随意),用于存储从consul拉取的上游服务器列表,然后编辑nginx.conf,配置上游服务器,暂不要热重启nginx

http{
      	...
        #负载均衡
        upstream backend {
            server 127.0.0.1:9502;
            upsync  127.0.0.1:8700/v1/kv/upstreams/backend upsync_timeout=6m upsync_interval=5ms  upsync_type=consul strong_dependency=off;
            upsync_dump_path /www/server/nginx/conf/vhost/servers_test.conf;
            include /www/server/nginx/conf/vhost/servers_test.conf;
        }
		server {
      			listen 80;
    			server_name xx.xxx.xx.xx;
   				 index index.php index.html index.htm default.php default.htm default.html;
   			 	root /www/wwwroot/default;

   			 	location /up {
        			proxy_pass http://backend;
    			}
    	}
	include /www/server/panel/vhost/nginx/*.conf;
}

名词解释

upsync模块会去consul拉取最新的upstream信息并存到本地的文件中
upsync_timeout 配置从consul拉取上游服务器的超时时间
upsync_interval 配置从consul拉取上游服务器的间隔时间
upsync_type 指定使用配置服务器的类型,当前是consul
strong_dependency 启动时是否强制依赖配置服务器,如果配置为on,则拉取失败,nginx同样会启用失败
upsync_dump_path 指定从consul拉取的上游服务器后持久化到的位置,这样即使Consul服务器出问题了,本地同样会有备份
127.0.0.1:8700/v1/kv固定,127.0.0.1:8700是consul服务(刚刚已运行consul容器并且端口是8700),kv代表consul的key/value存储。
自定义的upstreams/backend相当于k(键值),upstream相当于文件夹,backend相当于文件(就像composer组件地址如laravel/laravel)

向consul中添加两个上游服务器127.0.0.1:9503和127.0.0.1:9504

curl -X PUT -d '{"weight":1,"max_fails":2,"fail_timeout":10}' http://127.0.0.1:8700/v1/kv/upstreams/backend/127.0.0.1:9503
curl -X PUT -d '{"weight":1,"max_fails":2,"fail_timeout":10}' http://127.0.0.1:8700/v1/kv/upstreams/backend/127.0.0.1:9504

curl命令解释

curl默认是GET,-X代表其他请求,-d是data数据也就是上游服务器配置参数,http://127.0.0.1:8700/v1/kv/upstreams/backend是刚才配置的存储的key值地址,127.0.0.1:9503是上游服务器地址。

添加

[root@VM_0_13_centos ~]# curl -X PUT -d '{"weight":1,"max_fails":2,"fail_timeout":10}' http://127.0.0 .1:8700/v1/kv/upstreams/backend/127.0.0.1:9503
true
[root@VM_0_13_centos ~]# curl -X PUT -d '{"weight":1,"max_fails":2,"fail_timeout":10}' http://127.0.0 .1:8700/v1/kv/upstreams/backend/127.0.0.1:9504
true

查询已添加的上游服务器

[root@VM_0_13_centos ~]# curl  http://127.0.0.1:8700/v1/kv/?recurse                                   
[                                                                                                     
    {                                                                                                 
        "LockIndex": 0,                                                                               
        "Key": "upstreams/backend/127.0.0.1:9503",                                                    
        "Flags": 0,                                                                                   
        "Value": "eyJ3ZWlnaHQiOjEsIm1heF9mYWlscyI6MiwiZmFpbF90aW1lb3V0IjoxMH0=",                      
        "CreateIndex": 162,                                                                           
        "ModifyIndex": 162                                                                            
    },                                                                                                
    {                                                                                                 
        "LockIndex": 0,                                                                               
        "Key": "upstreams/backend/127.0.0.1:9504",                                                    
        "Flags": 0,                                                                                   
        "Value": "eyJ3ZWlnaHQiOjEsIm1heF9mYWlscyI6MiwiZmFpbF90aW1lb3V0IjoxMH0=",                      
        "CreateIndex": 163,                                                                           
        "ModifyIndex": 163                                                                            
    }                                                                                                 
]                                                                                                     

附:consul存储的查询与删除命令

curl  http://127.0.0.1:8700/v1/kv/?recurse
curl  -X  DELETE  http://127.0.0.1:8700/v1/kv/upstreams/backend/127.0.0.1:9502

重启nginx
nginx -s reload后查看servers_test.conf,说明nginx的upsync模块已经从consul中拉取到了添加的上游服务器列表

server 127.0.0.1:9504 weight=1 max_fails=2 fail_timeout=10s;
server 127.0.0.1:9503 weight=1 max_fails=2 fail_timeout=10s;

访问http://xx.xx.xx.xx/up,添加的上游服务器已经可用
在这里插入图片描述
我们可以通过PUT、DELETE动态的对上游服务器扩容缩容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值