nginx-upsync-module 提供了动态的负载均衡,动态更新上游的服务器不需要 reload nginx ,它的功能是拉取 consul 的后端 server 的列表,并更新Nginx 的路由信息。此模块不依赖于任何第三方模块。 consul 作为 Nginx 的 db,利用 consul 的 KV 服务,每个 Nginx work 进程独立的去拉取各个upstream 的配置,并更新各自的路由。挂了第三方模块无法结束进程或者是当前进程尚未结束。
1. 负载均衡补充
1.1 自定义hash
需要:在项目中可能会存在于根据某一些具体的业务述职做限制;比如根据用户的id做计算然后划分到不同的服务器上;
实现方式:1. 可以通过if判断 2. 通过location转发
http {
sendfile on;
keepalive_timeout 65;
upstream swoole_server {
# ip_hash;
hash $key; # 用户id
server 192.168.169.140:9001;
server 192.168.169.140:9002;
server 192.168.169.140:9003;
server 192.168.169.140:9004;
}
server {
# ...
if ( $request_uri ~* ^\/.*uid=(\d+).* ) {
set $key $1;
}
location /swoole {
return 200 $key;
}
}
}
3 动态负载均衡
3.1 背景
因为我们正常的情况就是,如果需要额外增加一台则会出现一个情况,就是它需要我们进行重启才能生效;
如果在高峰期的时候去增加以及修改机器的话,默认就是修改配置文件重新加载;如果重新加载配置文件会重启worker进程 1. worker进程重启的过程会等待现有的
请求处理完毕(需要一定的时间) 2. 重启的过程中无法处理请求-可能会造成一定的性能消耗(可能会堆积一些用户的请求无法处理)
3.2 运用consul处理流程
client【0】 -》 nginx(upstream xx { 【1】 }) -》consul (【2】)《- 服务(【3】)
【0】:客户端请求nginx
【1】:nginx中通过脚本定期去访问consul获取服务器的信息如ip:port
【2】:如同一个数据库记录服务器的信息
【3】:服务在启动的时候通过put向consul注册自己的信息
3.3 consul介绍
Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件
consul提供的一些关键特性:
* service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务
* health checking:健康检测使consul可以快速的警告在集群中的操作。和服务发现的集成,可以防止请求转发到故障的服务上面
* key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作
3.4 安装Consul
date -s "2020-06-18 14:28:23"
(1)Consul 下载地址:https://www.consul.io/downloads.html,下载后解压就是一个可执行的二进制文件consul,配置好环境变量,检查 consul 是否可用
这是github地址:https://github.com/hashicorp/consul/releases
这是码云地址:https://gitee.com/mirrors/consul
(2)下载完后,解压,得到一个可执行文件consul
(3)将这个文件移动到全局变量环境中
sudo mv consul /usr/local/bin/
(4)验证是否安装成功
consul
3.5 启动consul
agent
-server表示启动的是一个服务
-bootstrap-expect 1 表示等待多少个节点再启动,这里1个,就是自己一个就启动了
-node=texun_1 就是给consul服务起个别名为ali_1
-bind=172.17.114.76 绑定内网ip
-data-dir /opt/data1 数据存储目录为/opt/data1
-ui 启动默认ui界面
-client consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1,可指定允许客户端使用什么ip去访问
添加的时候要注意名称模块的匹配:
如下consul是命令参考
curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
curl -X PUT -d '{"weight":1,"max_fails":2,"fail_timeout":10} http://127.0.0.1:8500/v1/kv/upstreams/swoole_test/127.0.0.1:9502
docker run -itd --name -p consul consul
查看所有已经存储的k/v curl http://127.0.0.1:8500/v1/kv/?recurse
删除 curl -X DELETE http://127.0.0.1:8500/
实践
需要注意consul要运行
[root@localhost redis_2004]# curl -X PUT -d '{"weight":1,"max_fails":2,"fail_timeout":10}'
http://127.0.0.1:8500/v1/kv/upstreams/swoole_test/127.0.0.1:9502
true
[root@localhost redis_2004]# curl http://127.0.0.1:8500/v1/kv/?recurse
[{"LockIndex":0,"Key":"upstreams/swoole_test/127.0.0.1:9502","Flags":0,"Value":"eyJ3ZWlnaHQiOjEsIm1heF9mYWlscyI6MiwiZmFpbF90aW1lb3V0Ijox
MH0=","CreateIndex":88,"ModifyIndex":88}]
[root@localhost redis_2004]#
需要注意,因为我们在 /redis_2004/17/conf 中是不存在 servers_test.conf 配置文件的因此重启nginx肯定报错,因此我们需要的是就是创建一个空文件
然后重启nginx
[root@localhost conf]# nginx -c /redis_2004/17/nginx.conf
[root@localhost conf]# ll
总用量 4
-rw-r--rw-. 1 root root 61 6月 18 15:40 servers_test.conf
[root@localhost conf]# cat servers_test.conf
server 127.0.0.1:9502 weight=1 max_fails=2 fail_timeout=10s;
[root@localhost conf]# curl -X PUT -d '{"max_fails":2,"fail_timeout":10}'
http://127.0.0.1:8500/v1/kv/upstreams/swoole_test/192.168.169.140:9502
[root@localhost conf]# curl -X PUT -d '{"max_fails":2,"fail_timeout":10}'
http://127.0.0.1:8500/v1/kv/upstreams/swoole_test/192.168.169.140:9503
true
[root@localhost conf]# cat servers_test.conf
server 127.0.0.1:9503 weight=1 max_fails=2 fail_timeout=10s;
server 127.0.0.1:9502 weight=1 max_fails=2 fail_timeout=10s;
【推荐】