consul集群搭建,配合nginx完成服务动态发现和健康检查
1、概述
1.1 介绍
consul是一个服务发现和配置共享的服务软件,结合nginx的主动健康检查模块nginx_upstream_check_module和服务发现模块nginx-upsync-module,实现一套服务动态发现机制。nginx的upstream不再通过手动配置,而是定时向consul发送请求,获取consul数据中心的配置文件,动态更新upstream地址池。
1.2 术语
consul:是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件
nginx_upstream_check_module:nginx主动健康检查模块
nginx-upsync-module:nginx服务发现模块
2、安装
2.1 nginx
nginx需要编译两个模块:
nginx_upstream_check_module:nginx主动健康检查模块
https://github.com/xiaokai-wang/nginx_upstream_check_module
nginx-upsync-module:nginx服务发现模块
https://github.com/weibocom/nginx-upsync-module
2.2 consul
官网 https://www.consul.io
下载consul,linux 64位
下载解压即可,产生一个consul可执行文件。
./consul 列出一些常用指令。
2.3 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,出现如下页面,则启动成功
2.4 consul其它命令
关闭
./consul leave
查看成员
./consul members
2.5 启动consul集群
以上介绍的都是以单机模式启动,实战中consul多以集群模式存在,建议server节点数为3~5个。以下以3台为例,分别为ip1、ip2、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 加入一个集群
3、使用
3.1 nginx&upstream配置
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
3.2 查询健康检查状态
健康检查模块提供了一个接口check_status,用于检查consul数据中心配置的所有server的健康检查状态。需要在nginx稍作配置:
在80端口下,配置nstatus的接口:
location /nstatus { check_status; access_log off; }
访问consul节点的ip/nstatus
3.3 consul配置
输入【http://ip:8500/ui】进入consulweb控制台
进入consu首页,点击进入【KEY/VALUE】,此处即为配置upstream的位置。
Key以“/”结尾,则创建了一个文件夹,否则创建了一个key。
此处的文件夹路径即为upsync指令请求的路径。
value默认值为{"weight":1, "max_fails":2, "fail_timeout":10},所以不配置value也是可以的
写入本地文件是这样的:
原文地址:https://www.cnblogs.com/ExMan/p/11944684.html
- javascript 基本概念
- vue内置指令详解——小白速会
- javascript 函数详解
- 深海中的STL—nth_element
- javascript Object与Array用法
- vue class与style 绑定详解——小白速会
- java8-Stream之数值流
- POJ 3694 Network(Tarjan求割边+LCA)
- java之Cookie详解
- Ajax详解
- 1611: [Usaco2008 Feb]Meteor Shower流星雨
- 3893: [Usaco2014 Dec]Cow Jog
- 3892: [Usaco2014 Dec]Marathon
- BZOJ 2793: [Poi2012]Vouchers(调和级数)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MyBatis源码解析之基础模块—Log
- 启用OPCache提高PHP程序性能的方法
- 浅谈OpenCV中的新函数connectedComponentsWithStats用法
- Python根据指定文件生成XML的方法
- python如何调用java类
- Python pytesseract验证码识别库用法解析
- python 读txt文件,按‘,’分割每行数据操作
- PHP利用递归函数实现无限级分类的方法
- 详解关于php的xdebug配置(编辑器vscode)
- PHP应用跨时区功能的实现方法
- PHP实现的数据对象映射模式详解
- PDO::beginTransaction讲解
- PHP匿名函数(闭包函数)详解
- PDO::getAttribute讲解
- PHP压缩图片功能的介绍