负载均衡请参考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
重启nginxnginx -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动态的对上游服务器扩容缩容