consul是一个服务发现和配置共享的服务软件,结合nginx的主动健康检查模块nginx_upstream_check_module和服务发现模块nginx-upsync-module,实现一套服务动态发现机制。nginx的upstream再也不经过手动配置,而是定时向consul发送请求,获取consul数据中心的配置文件,动态更新upstream地址池。node
consul:是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件mysql
nginx_upstream_check_module:nginx主动健康检查模块linux
nginx-upsync-module:nginx服务发现模块nginx
nginx须要编译两个模块:git
nginx_upstream_check_module:nginx主动健康检查模块github
https://github.com/xiaokai-wang/nginx_upstream_check_moduleweb
nginx-upsync-module:nginx服务发现模块sql
https://github.com/weibocom/nginx-upsync-modulebootstrap
官网 https://www.consul.io后端
下载consul,linux 64位
下载解压便可,产生一个consul可执行文件。
./consul 列出一些经常使用指令。
./consul agent -server –bootstrap-expect 1 –data-dir /tmp/consul –bind=10.10.49.193 –ui –client 0.0.0.0 &
i. server: 以server身份启动。
ii. bootstrap-expect:集群要求的最少server数量,当低于这个数量,集群即失效。经测试,低于这个数量也不影响访问
iii. data-dir:data存放的目录,更多信息请参阅consul数据同步机制
iv. node:节点id,在同一集群不能重复。
v. bind:监听的ip地址。
vi. client 客户端的ip地址
vii. & :在后台运行,此为linux脚本语法
viii. ui:启动webui,端口8500
访问ip:8500/ui,出现以下页面,则启动成功
关闭
./consul leave
查当作员
./consul members
以上介绍的都是以单机模式启动,实战中consul多以集群模式存在,建议server节点数为3~5个。如下以3台为例,分别为ip一、ip二、ip3:
./consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=consul1 -bind=ip1 -ui -client=0.0.0.0 &
./consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=consul2 -bind=ip2 -join=ip1 -ui -client=0.0.0.0 &
./consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=consul3 -bind=ip3 -join=ip1 -ui -client=0.0.0.0 &
-join 加入一个集群
consul是针对nginx的upstream所作的一项改善,地址池再也不须要手动配置,而是从consul的数据中心抓取。新的upstream配置以下:
1 upstream tomcat_http_server { 2 server 127.0.0.1:11111; 3 upsync 10.10.49.193:8500/v1/kv/upstreams/tomcat_http_server upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off; 4 upsync_dump_path /usr/local/nginx/conf/server/server_test.conf; 5 6 check interval=1000 rise=2 fall=2 timeout=3000 type=http default_down=false; 7 check_http_send "HEAD / HTTP/1.0\r\n\r\n"; 8 check_http_expect_alive http_2xx http_3xx; 9 }
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
10.10.49.193: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单节点配置中心的可用性也是很高的。
upsync更多指令请阅读
https://github.com/weibocom/nginx-upsync-module#upsync
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更多指令请阅读
https://github.com/xiaokai-wang/nginx_upstream_check_module
健康检查模块提供了一个接口check_status,用于检查consul数据中心配置的全部server的健康检查状态。须要在nginx稍做配置:
在80端口下,配置nstatus的接口:
location /nstatus {
check_status;
access_log off;
}
访问consul节点的ip/nstatus
输入【http://ip:8500/ui】进入consulweb控制台
进入consu首页,点击进入【KEY/VALUE】,此处即为配置upstream的位置。
Key以“/”结尾,则建立了一个文件夹,不然建立了一个key。
此处的文件夹路径即为upsync指令请求的路径。
value默认值为{"weight":1, "max_fails":2, "fail_timeout":10},因此不配置value也是能够的
写入本地文件是这样的: