概述
介绍
consul是一个服务发现和配置共享的服务软件,结合nginx的主动健康检查模块nginx_upstream_check_module和服务发现模块nginx-upsync-module,实现一套服务动态发现机制。nginx的upstream不再通过手动配置,而是定时向consul发送请求,获取consul数据中心的配置文件,动态更新upstream地址池。
术语
consul:是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件
nginx_upstream_check_module:nginx主动健康检查模块
nginx-upsync-module:nginx服务发现模块
安装
nginx
nginx需要编译两个模块:
nginx_upstream_check_module:nginx主动健康检查模块
1 | https://github.com/xiaokai-wang/nginx_upstream_check_module |
nginx-upsync-module:nginx服务发现模块
1 | https://github.com/weibocom/nginx-upsync-module |
1 | ./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 --add-module=/root/nginx-module-vts |
consul
下载consul,linux 64位
下载解压即可,产生一个consul可执行文件。
./consul 列出一些常用指令。
consul启动
1 | ./consul agent -server –bootstrap-expect 1 –data-dir /tmp/consul –bind=172.16.2.30 –ui –client 0.0.0.0 & |
访问ip:8500/
consul其它命令
关闭
1 | ./consul leave |
查看成员
1 | ./consul members |
启动consul集群
以上介绍的都是以单机模式启动,实战中consul多以集群模式存在,建议server节点数为3~5个。以下以3台为例,分别为ip1、ip2、ip3:
1 | ./consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=consul1 -bind=ip1 -ui -client=0.0.0.0 & |
加入后端服务器(或可以在界面KEY/VALUE操作)
1 | 在任一节点上执行如下命令,即可添加2个key-value信息: |
删除后端服务器(或可以在界面KEY/VALUE操作)
1 | curl -X DELETE http://172.16.2.30:8500/v1/kv/upstreams/test/172.16.2.31:80 |
调整后端服务的参数(或可以在界面KEY/VALUE操作)
1 | curl -X PUT -d '{"weight":10, "max_fails":2, "fail_timeout":10, "down":0}' http://172.16.2.30:8500/v1/kv/upstreams/test/172.16.2.31:80 |
使用
nginx&upstream配置
consul是针对nginx的upstream所做的一项改善,地址池不再需要手动配置,而是从consul的数据中心抓取。新的upstream配置如下:
1 | upstream tomcat_http_server { |
server 127.0.0.1:11111是占位机器,这个配置必须要有不然校验配置文件不通过。
upsync配置语法:
upsync $consul/etcd.api.com:$port/v1/kv/upstreams/$upstream_name/ [upsync_type=consul/etcd] [upsync_interval=second/minutes] [upsync_timeout=second/minutes] [strong_dependency=off/on]
默认upsync_interval=5s upsync_timeout=6m strong_dependency=off
172.16.2.30:8500/v1/kv/upstreams/tomcat_http_server为同步地址;upsync_timeout同步超时时间;upsync_interval同步间隔;upsync_type同步类型,默认为consul;strong_dependency,配置为on时,每次启动或重启nginx,都会强制去consul拉一次upstream servers。
upsync_dump_path将拉取到的upstreams地址池写入一个文件;
此处想要多说两句,即使consul中途挂掉,nginx仍然可以从upsync_dump_path配置的文件中取到数据,继续分发流量,只是此时upstream池变为静态了,跟之前的情形一样,启停重启nginx等操作并没有问题。所以consul单节点配置中心的可用性也是很高的。
check代表健康检查;interval检查间隔,单位为毫秒;rise成功该次数后,标记为up;fall失败该次数后,标记为down;timeout;type包括tcp、ssl_hello、http、mysql、ajp、fastcgi;default_down设置后端server的初始状态;
默认配置interval=30000 fall=5 rise=2 timeout=1000 default_down=true type=tcp
check_http_send 健康检查发送的请求包;
check_http_expect_alive 这些状态代表后端server是活着的;
查询健康检查状态
健康检查模块提供了一个接口check_status,用于检查consul数据中心配置的所有server的健康检查状态。需要在nginx稍作配置:
在80端口下,配置nstatus的接口:
1 | location /nstatus { |