传统的负载均衡,若是Upstream参数发生变化,每次都须要从新加载nginx.conf文件,所以扩展性不是很高,因此咱们能够采用动态负载均衡,实现Upstream可配置化、动态化,无需人工从新加载nginx.conf。
这相似分布式的配置中心
1.Consul+Consul-template 每次发现配置更改须要raload nginx,重启Nginx。(不推荐) 2.Consul+OpenResty 实现无需raload动态负载均衡。(推荐) 3.Consul+upsync+Nginx 实现无需raload动态负载均衡 (推荐)
常见服务发现框架 Consul、Eureka、 ZooKeeper以及Etcd ZooKeeper是这种类型的项目中历史最悠久的之一,它起源于Hadoop。它很是成熟、可靠,被许多大公司(YouTube、eBay、雅虎等)使用。
etcd是一个采用HTTP协议的健/值对存储系统,它是一个分布式和功能层次配置系统,可用于构建服务发现系统。其很容易部署、安装和使用,提供了可靠的数据持久化特性。它是安全的而且文档也十分齐全。
Consul是一款开源的分布式服务注册与发现系统,经过HTTP API可使得服务注册、发现实现起来很是简单,它支持以下特性。 服务注册:服务实现者能够经过HTTP API或DNS方式,将服务注册到Consul。 服务发现:服务消费者能够经过HTTP API或DNS方式,从Consul获取服务的IP和PORT。 故障检测:支持如TCP、HTTP等方式的健康检查机制,从而当服务有故障时自动摘除。 K/V存储:使用K/V存储实现动态配置中心,其使用HTTP长轮询实现变动触发和配置更改。 多数据中心:支持多数据中心,能够按照数据中心注册和发现服务,即支持只消费本地机房服务,使用多数据中心集群还能够避免单数据中心的单点故障。 Raft算法:Consul使用Raft算法实现集群数据一致性。 经过Consul能够管理服务注册与发现,接下来须要有一个与Nginx部署在同一台机器的Agent来实现Nginx配置更改和Nginx重启功能。咱们有Confd或者Consul-template两个选择,
而Consul-template是Consul官方提供的,咱们就选择它了。其使用HTTP长轮询实现变动触发和配置更改(使用Consul的watch命令实现)。
也就是说,咱们使用Consul-template实现配置模板,而后拉取Consul配置渲染模板来生成Nginx实际配置。
1.下载consul_1.5.0_linux_amd64.ziphtml
wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip
2.解压consul_1.5.0_linux_amd64.zip java
unzip consul_1.5.0_linux_amd64.zip
3. 执行如下 ./consul 出现如下信息就说明安装成功node
root@brian-System-Product-Name:/usr/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
4.启动consul linux
个人linux Ip地址192.168.0.102nginx
./consul agent -dev -ui -node=consul-dev -client=192.168.0.102
5.浏览器访问192.168.0.102:8500 (注意检查关闭防火墙)git
6.使用postman发送PUT请求 注册Http服务github
我这里就注册两个服务 http://192.168.0.102:8500/v1/catalog/register 参数说明:Datacenter指定数据中心, Address指定服务IP, Service.Id指定服务惟一标识, Service.Service指定服务分组, Service.tags指定服务标签(如测试环境、预发环境等), Service.Port指定服务端口。 参数 requestbody 1-------- { "Datacenter":"dc1", "Node":"tomcat", "Address":"192.168.0.102", "Service":{ "Id":"192.168.0.102:8080", "Service":"xuduocloud", "tags":[ "dev" ], "Port":8088} } 参数 requestbody 2-------- { "Datacenter":"dc1", "Node":"tomcat", "Address":"192.168.0.102", "Service":{ "Id":"192.168.0.102:8082", "Service":"xuduocloud", "tags":[ "dev" ], "Port":8088} }
7.发现Http服务 http://192.168.0.102:8500/v1/catalog/service/xuduocloud算法
Upsync是新浪微博开源的基于Nginx实现动态配置的三方模块。Nginx-Upsync-Module的功能是拉取Consul的后端server的列表,并动态更新Nginx的路由信息。此模块不依赖于任何第三方模块。
Consul做为Nginx的DB,利用Consul的KV服务,每一个Nginx Work进程独立的去拉取各个upstream的配置,并更新各自的路由。
下载Nginx wget http://nginx.org/download/nginx-1.15.12.tar.gz 做用:实现反向代理、负载负载库 下载consul wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip 做用:对动态负载均衡均配置实现注册 下载nginx-upsync-module wget https://github.com/weibocom/nginx-upsync-module/archive/master.zip 做用:nginx动态获取最新upstream信息
3.2.1 解压安装 nginx-upsync-module和consul后端
unzip master.zip
unzip consul_1.5.0_linux_amd64.zip
3.2.2 安装Nginx浏览器
解压Nginx
tar -zxvf nginx-1.15.0.tar.gz
配置Nginx
groupadd nginx useradd -g nginx -s /sbin/nologin nginx mkdir -p /var/tmp/nginx/client/ mkdir -p /usr/local/nginx
编译Nginx
cd nginx-1.15.12 ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --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
备注: --add-module=../nginx-upsync-module-master 对应master.zip解压的路径
这里编译可能会报错,缺乏依赖的插件
./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using --without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using --with-pcre=<path> option.
解决办法
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install ruby
sudo apt-get install zlib1g-dev
Upstream 动态配置
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { ##动态去consul 获取注册的真实反向代理地址 upstream kawa{ server 127.0.0.1:11111; upsync 192.168.0.102:8500/v1/kv/upstreams/xuduocloud 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; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://kawa; proxy_connect_timeout 2; #nginx跟后端服务器链接超时时间(代理链接超时) proxy_send_timeout 2; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 2; #链接成功后,后端服务器响应时间(代理接收超时) index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
upsync指令指定从consul哪一个路径拉取上游服务器配置;
upsync_timeout配置从consul拉取上游服务器配置的超时时间;
upsync_interval配置从consul拉取上游服务器配置的间隔时间;
upsync_type指定使用consul配置服务器;
strong_dependency配置nginx在启动时是否强制依赖配置服务器,若是配置为on,则拉取配置失败时nginx启动一样失败。
upsync_dump_path指定从consul拉取的上游服务器后持久化到的位置,这样即便consul服务器出问题了,本地还有一个备份。
mkdir /usr/local/nginx/conf/servers/
#ip地址对应的虚拟机IP地址 ./consul agent -dev -ui -node=consul-dev -client=192.168.0.102 #这边上面已经启动了consul,这里只须要重启下,先杀死进程在启动 kill -9 31200 ./consul agent -dev -ui -node=consul-dev -client=192.168.0.102
3.5.1 使用linux命令方式发送put请求
curl -X PUT http://192.168.0.102:8500/v1/kv/upstreams/xuduocloud/192.168.0.102:8080 curl -X PUT http://192.168.0.102:8500/v1/kv/upstreams/xuduocloud/192.168.0.102:8082 curl -X PUT http://192.168.0.102:8500/v1/kv/upstreams/xuduocloud/192.168.0.102:8083
3.5.2 使用postmen 发送put请求 负载均衡信息参数 {"weight":1, "max_fails":2, "fail_timeout":10, "down":0},我这边演示下postman动态添加upstream服务
4.1 启动三个测试服务,并用浏览器访问是否可用
#端口8080
java -jar responsibilitychain-0.0.1-SNAPSHOT.jar & #端口8082
java -jar strategy-0.0.1-SNAPSHOT.jar & #端口8083
java -jar template-0.0.1-SNAPSHOT.jar &
4.2 使用postman 添加upstream服务
4.3 使用浏览器查看下注册结果
备注:若是要加权重 添加 {"weight":2, "max_fails":2, "fail_timeout":10, "down":0} 点击save,既能够动态的修改upstarm负载的策略
4.4 测试负载均衡,本地浏览器访问localhost,此处就截一张图了