共计 3437 个字符,预计需要花费 9 分钟才能阅读完成。
方案
传统的负载均衡,如果 Upstream 参数发生变化,每次都需要重新加载 nginx.conf 文件, 因此扩展性不是很高,所以我们可以采用动态负载均衡,实现 Upstream 可配置化、动态化,无需人工重新加载 nginx.conf,类似分布式的配置中心
- Consul+Consul-template 每次发现配置更改需要 raload nginx,重启 Nginx。
- Consul+OpenResty 实现无需 raload 动态负载均衡
- Consul+upsync+Nginx 实现无需 raload 动态负载均衡
Consul+upsync+Nginx
Consul 环境搭建
https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip
yum -y install unzip
unzip consul_0.7.5_linux_amd64.zip
- ./consul 出现下面提示说明成功
[root@localhost local]# ./consul
usage: consul [--version] [--help] <command> [<args>]
Available commands are:
agent Runs a Consul agent
configtest Validate config file
event Fire a new event
exec Executes a command on Consul nodes
force-leave Forces a member of the cluster to enter the "left" state
info Provides debugging information for operators
join Tell Consul agent to join cluster
keygen Generates a new encryption key
keyring Manages gossip layer encryption keys
kv Interact with the key-value store
leave Gracefully leaves the Consul cluster and shuts down
lock Execute a command holding a lock
maint Controls node or service maintenance mode
members Lists the members of a Consul cluster
monitor Stream logs from a Consul agent
operator Provides cluster-level tools for Consul operators
reload Triggers the agent to reload configuration files
rtt Estimates network round trip time between nodes
snapshot Saves, restores and inspects snapshots of Consul server state
version Prints the Consul version
watch Watch for changes in Consul
nginx-upsync-module
Upsync 是新浪微博开源的基于 Nginx 实现动态配置的三方模块。Nginx-Upsync-Module 的功能是拉取 Consul 的后端 server 的列表,并动态更新 Nginx 的路由信息。此模块不依赖于任何第三方模块。Consul 作为 Nginx 的 DB,利用 Consul 的 KV 服务,每个 Nginx Work 进程独立的去拉取各个 upstream 的配置,并更新各自的路由。
nginx-upsync-module:
- cd /usr/local
wget https://github.com/weibocom/nginx-upsync-module/archive/master.zip
- unzip master.zip
- unzip consul_0.7.1_linux_amd64.zip
配置 Nginx
- tar -zxvf nginx-1.9.9.tar.gz
- groupadd nginx
- useradd -g nginx -s /sbin/nologin nginx
- mkdir -p /var/tmp/nginx/client/
- mkdir -p /usr/local/nginx
- cd nginx-1.9.9/
- ./configure –prefix=/usr/local/nginx –user=nginx –group=root –with-http_ssl_module –with-http_flv_module –with-http_stub_status_module –with-http_gzip_static_module –with-http_realip_module –http-client-body-temp-path=/var/tmp/nginx/client/ –http-proxy-temp-path=/var/tmp/nginx/proxy/ –http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi –http-scgi-temp-path=/var/tmp/nginx/scgi –with-pcre –add-module=../nginx-upsync-module-master
- make && make install
动态负载均衡
- 创建 upsync_dump_pathmkdir /usr/local/nginx/conf/servers/
upsync_dump_path 指定从 consul 拉取的上游服务器后持久化到的位置,这样即使 consul 服务器出问题了,本地还有一个备份。
- 添加 nginx Upstream 服务
- 使用 linux 命令方式发送 put 请求
curl -X PUT http://192.168.102.129:8500/v1/kv/upstreams/tmp/192.168.102.128:8081
curl -X PUT http://192.168.102.129:8500/v1/kv/upstreams/tmp/192.168.102.128:8081 - 使用 postmen 发送 put 请求
http://192.168.102.129:8500/v1/kv/upstreams/tmp/192.168.102.128:8081
http://192.168.102.129:8500/v1/kv/upstreams/tmp/192.168.102.128:8081
负载均衡信息参数
{“weight”:1, “max_fails”:2, “fail_timeout”:10, “down”:0}
Upstream 动态配置
## 动态去 consul 获取注册的真实反向代理地址
upstream tmpup{
server 127.0.0.1:11111;
upsync 192.168.212.134:8500/v1/kv/upstreams/tmp upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tmpup;
index index.html index.htm;
}
}
upsync 指令指定从 consul 哪个路径拉取上游服务器配置;upsync_timeout 配置从 consul 拉取上游服务器配置的超时时间;upsync_interval 配置从 consul 拉取上游服务器配置的间隔时间;upsync_type 指定使用 consul 配置服务器;strong_dependency 配置 nginx 在启动时是否强制依赖配置服务器,如果配置为 on,则拉取配置失败时 nginx 启动同样失败。upsync_dump_path 指定从 consul 拉取的上游服务器后持久化到的位置,这样即使 consul 服务器出问题了,本地还有一个备份。