Consul简介
consul介绍
consul
是Google开源的,使用go语言开发的一个服务发现、配置管理服务的一个工具。内置了 服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper
等)。服务部署简单,只有一个可运行的二进制的包。
几个关键的功能介绍(作用):
- 服务发现:
Consul
的某些客户端可以提供一个服务,例如api
或者mysql
,其它客户端可以使用Consul去发现这个服务的提供者。使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务。 - 健康检查: Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机。
- 健值(Key/Value)存储: 应用可以使用Consul提供的分层键值存储用于一些目的,包括 动态配置 、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。
- 多数据中心: Consul对多数据中心有非常好的支持,这意味着Consul用户不必担心由于创建更多抽象层而产生的多个区域。
基础架构
每个节点都需要运行agent
,他有两种运行模式server
和client
。每个数据中心官方建议需要3或5个server
节点以保证数据安全,同时保证server-leader
的选举能够正确的进行。
@client
CLIENT表示consul的client模式
,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER
,本身是不持久化这些信息。
@server
SERVER表示consul的server模式,表明这个consul是个server
,这种模式下,功能和CLIENT
都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的
@server-leader
中间那个SERVER
下面有LEADER
的字眼,表明这个SERVER
是它们的老大,它和其它SERVER
不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
@raft
server节点之间的数据一致性保证,一致性协议使用的是raft
协议。
安装
1.通过choco
工具安装
1 | choco install -y consul |
2. 官方安装
从官方下载 对应系统的zip
包,解压到安装目录,并将安装目录的路径添加到环境变量PATH
中。
启动
完成consul
安装之后必须运行agent
,agent
可以运行server
或client
模式。每个数据中心至少必须拥有一台server
, 建议在一个集群中有3或者5个server
.部署单一的server
,在出现失败时会不可避免的造成数据丢失。
运行Consul Server
1 | consul agent -server -bootstrap-expect 3 -data-dir /tmp/consul -node=s1 -bind 192.168.31.115 -ui-dir ./consul_ui/ -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0 |
-server1
: 定义agent运行在server模式-bootstrap-expect
:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用-bind
:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0-node
:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名-ui-dir
: 提供存放web ui资源的路径,该目录必须是可读的-rejoin
:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。-config-dir
::配置文件目录,里面所有以.json结尾的文件都会被加载-client
:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0-ui
: 使用默认的ui管理界面
运行Consul Client
1 | consul agent -data-dir /tmp/consul -node=c1 -bind=192.168.31.23 -config-dir=/etc/consul.d/ -join 192.168.31.115 |
查看集群成员
1 | consul members |
加入集群
1 | consul join 192.168.31.115 |
停止agent
你可以使用Ctrl-C
优雅的关闭Agent
. 中断Agent
之后你可以看到他离开了集群并关闭.
开发模式
开发过程中只需要简单的运行一个consul Agent
即可,可通过如下命令实现:1
consul agent --dev
服务注册与发现
服务注册
consul支持两种方式实现服务注册,一种是通过consul
的服务注册http API,由服务自己调用API实现注册,另一种方式是通过json个是的配置文件实现注册,将需要注册的服务以json格式的配置文件给出。consul
官方建议使用第二种方式。
通过Http API注册
1 | /v1/agent/service/register -PUT |
通过配置文件注册文件
将注册的服务写到
consul
配置目录下1
echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' >/etc/consul.d/web.json
启动consul服务时,指定配置目录
1
-config-dir=/etc/consul.d/
服务发现
consul支持两种方式实现服务发现,一种是通过http API
来查询有哪些服务,另外一种是通过consul agent
自带的DNS
(8600端口),域名是以NAME.service.consul
的形式给出,NAME
即在定义的服务配置文件中服务的名称。DNS方式
可以通过check
的方式检查服务。
例如: 已经向consul集群中注册了一个服务名为Web
的服务,那么他的域名是web.service.consul
:
1 | dig @127.0.0.1 -p 8600 web.service.consul |
Http API
查询制定服务
1
curl 127.0.0.1:8500/v1/catalog/service/web
通过目录API给出所有节点提供的服务
1
curl 127.0.0.1:8500/v1/catalog/service/web?passing
DNS API
DNS API中,服务的DNS名字是 NAME.service.consul
. 虽然是可配置的,但默认的所有DNS名字会都在consul命名空间下.这个子域告诉Consul,我们在查询服务,NAME
则是服务的名称。
健康检查
健康检查是服务发现的关键组件.预防使用到不健康的服务
自定义检查
使用和检查定义来注册检查,和服务类似,因为这是建立检查最常用的方式
通过配置服务下的check
节点自定义检查:1
2
3
4
5
6
7
8
9
10
11
12{"service": {
"name": "Faceid",
"tags": ["extract", "verify", "compare", "idcard"],
"address": "10.201.102.198",
"port": 9000,
"check": {
"name": "ping",
"script": "curl -s localhost:9000",
"interval": "3s"
}
}
}
K/V
Consul提供了一个易用的键/值存储,这可以用来 保持动态配置 ,协助服务协调,领袖选举,做开发者可以想到的任何事情
可以通过Http API v1/kv/?{key}
来获取设置获取KEY/VALUE的存储与设置
常用命令
概述
consul只有一个命令行应用,就是consul
命令,consul命令可以包含agent
、members
等参数进行使用,consul -h
即可看到consul cli所支持的参数,而每个参数里面又支持其他参数。
1 | [root@consul ~]# consul |
Agent
agent
指令是consul的核心,它运行agent
来维护成员的重要信息、运行检查、服务宣布、查询处理等等
event
event
命令提供了一种机制,用来fire
自定义的用户事件,这些事件对consul来说是不透明的,但它们可以用来构建自动部署、重启服务或者其他行动的脚本。
1 | -http-addr:http服务的地址,agent可以链接上来发送命令,如果没有设置,则默认是127.0.0.1:8500。 |
exec
exec
指令提供了一种远程执行机制,比如你要在所有的机器上执行uptime
命令,远程执行的工作通过job
来指定,存储在KV中,agent
使用event
系统可以快速的知道有新的job产生,消息是通过gossip协议来传递的,因此消息传递是最佳的,但是并不保证命令的执行。事件通过gossip来驱动,远程执行依赖KV存储系统(就像消息代理一样)。
1 | -http-addr:http服务的地址,agent可以链接上来发送命令,如果没有设置,则默认是127.0.0.1:8500。 |
join
join
指令告诉consul agent
加入一个已经存在的集群中,一个新的consul agent
必须加入一个已经有至少一个成员的集群中,这样它才能加入已经存在的集群中,如果你不加入一个已经存在的集群,则agent是它自身集群的一部分,其他agent
则可以加入进来。agents
可以加入其他agent
多次。consul join [options] address
。如果你想加入多个集群,则可以写多个地址,consul会加入所有的地址。
leave
leave
指令触发一个优雅的离开动作并关闭agent
,节点离开后不会尝试重新加入集群中。运行在server
状态的节点,节点会被优雅的删除,这是很严重的,在某些情况下一个不优雅的离开会影响到集群的可用性。
members
members
指令输出consul agent
目前所知道的所有的成员以及它们的状态,节点的状态只有alive
、left
、failed
三种状态。
monitor
monitor
指令用来链接运行的agent
,并显示日志。monitor
会显示最近的日志,并持续的显示日志流,不会自动退出,除非你手动或者远程agent
自己退出。
reload
reload
指令可以重新加载agent
的配置文件。SIGHUP指令在重新加载配置文件时使用,任何重新加载的错误都会写在agent
的log
文件中,并不会打印到屏幕。
watch
watch
指令提供了一个机制,用来监视实际数据视图的改变(节点列表、成员服务、KV),如果没有指定进程,当前值会被dump出来
Consul 配置
agent
有各种各样的配置项可以在命令行或者配置文件进行定义,所有的配置项都是可选择的,当加载配置文件的时候,consul从配置文件或者配置目录加载配置。后面定义的配置会合并前面定义的配置,但是大多数情况下,合并的意思是后面定义的配置会覆盖前面定义的配置。
详细的配置文件参数
1 | acl_datacenter:只用于server,指定的datacenter的权威ACL信息,所有的servers和datacenter必须同意ACL datacenter |
常用API
consul的主要接口是RESTful HTTP API,该API可以用来增删查改nodes、services、checks、configguration。所有的endpoints主要分为以下类别:1
2
3
4
5
6
7
8kv - Key/Value存储
agent - Agent控制
catalog - 管理nodes和services
health - 管理健康监测
session - Session操作
acl - ACL创建和管理
event - 用户Events
status - Consul系统状态
agent
agent endpoints用来和本地agent进行交互,一般用来服务注册和检查注册,支持以下接口
1 | /v1/agent/checks : 返回本地agent注册的所有检查(包括配置文件和HTTP接口) |
catalog
catalog endpoints用来注册/注销nodes、services、checks
1 | /v1/catalog/register : Registers a new node, service, or check |
health
health endpoints用来查询健康状况相关信息,该功能从catalog中单独分离出来1
2
3
4/v1/healt/node/<node>: 返回node所定义的检查,可用参数?dc=
/v1/health/checks/<service>: 返回和服务相关联的检查,可用参数?dc=
/v1/health/service/<service>: 返回给定datacenter中给定node中service
/v1/health/state/<state>: 返回给定datacenter中指定状态的服务,state可以是"any", "unknown", "passing", "warning", or "critical",可用参数?dc=
session
session endpoints用来create、update、destory、query sessions1
2
3
4
5/v1/session/create: Creates a new session
/v1/session/destroy/<session>: Destroys a given session
/v1/session/info/<session>: Queries a given session
/v1/session/node/<node>: Lists sessions belonging to a node
/v1/session/list: Lists all the active sessions
acl
acl endpoints用来create、update、destory、query acl1
2
3
4
5
6/v1/acl/create: Creates a new token with policy
/v1/acl/update: Update the policy of a token
/v1/acl/destroy/<id>: Destroys a given token
/v1/acl/info/<id>: Queries the policy of a given token
/v1/acl/clone/<id>: Creates a new token by cloning an existing token
/v1/acl/list: Lists all the active tokens
event
event endpoints用来fire新的events、查询已有的events1
2/v1/event/fire/<name>: 触发一个新的event,用户event需要name和其他可选的参数,使用PUT方法
/v1/event/list: 返回agent知道的events
status
status endpoints用来或者consul 集群的信息1
2/v1/status/leader : 返回当前集群的Raft leader
/v1/status/peers : 返回当前集群中同事
高可用
Consul Cluster集群架构图如下:
为保证consul集群服务的可靠性,一般需要配置3~5个server
, client
集群可以配置n个(n>=0),当server-leader
问题,其他server
会重新选举server-leader
,从而保证集群的可靠性。