consul 是一个支持多数据中心分布式高可用,用于服务发现和配置共享的工具。 consul与其它工具的不同,官方介绍如下:
https://www.consul.io/intro/vs/index.html
http://thesecretlivesofdata.com/raft/ consul的分布式一致性原理,动画
HTTP API接口 https://www.consul.io/api/index.html
consul服务架构和核心概念
官方给出了一个很直观的图片:
图中的SERVER是consul服务端高可用集群,CLIENT是consul客户端。
这里存在两个数据中心:DATACENTER1、DATACENTER2。每个数据中心有着 3 到 5 台 server(该数量使得在故障转移和性能之间达到平衡)。
Consul利用两个不同的gossip pool。我们分别把他们称为局域网池(LAN Gossip Pool)或广域网池(WAN Gossip Pool)。每个Consul数据中心(Datacenter)都有一个包含所有成员(Server和Client)的LAN gossip pool。
LAN Pool有如下目的:
-
成员关系允许Client自动发现Server节点,减少所需的配置量
-
分布式故障检测允许的故障检测的工作在某几个Server几点执行,而不是集中整个集群所有节点上
-
gossip允许可靠和快速的事件广播,比如Leader选举
WAN Pool是全局唯一的,无论属于哪一个数据中心,所有Server应该加入到WAN Pool。由WAN Pool提供会员信息让Server节点可以执行跨数据中心的请求。也就是说这个Pool不同于LAN Pool,它的目的是为了允许数据中心能够以low-touch的方式发现彼此。当数据中心的server收到来自不同数据中心的请求时,它可转发请求到数据中心的leader。
一般来说,数据不会在不同的领事数据中心之间复制。当对另一数据中心的资源进行请求时,本地 consul 服务器将
RPC 请求转发给该资源的远程 consul 服务器并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会影响本地数据中心。有一些特殊情况可以复制有限的数据子集,例如使用 consul 内置的 ACL replication 功能,或外部工具如 consul-replicate。
consul 关键特性
- 服务发现:支持服务发现。你可以通过 DNS 或 HTTP 的方式获取服务信息。
- 健康检查:支持健康检查。可以提供与给定服务相关联的任何数量的健康检查(如 web 状态码或 cpu 使用率)。
- K/V 存储:键/值对存储。你可用通过 consul 存储如动态配置之类的相关信息。
- 多数据中心:支持多数据中心,开箱即用。
- WEB UI:支持 WEB UI。快速了解你的服务现在的运行情况,一目了然。
consul 术语
node
:节点,需要 consul 注册发现或配置管理的服务器。agent
:consul 中的核心程序,它将以守护进程的方式在各个节点运行,有 client 和 server 启动模式。每个 agent 维护一套服务和注册发现以及健康信息。client
:agent 以 client 模式启动的节点。在该模式下,该节点会采集相关信息,通过 RPC 的方式向 server 发送。server
:agent 以 server 模式启动的节点。一个数据中心中至少包含 1 个 server 节点。不过官方建议使用 3 或 5 个 server 节点组建成集群,以保证高可用且不失效率。server 节点参与 Raft、维护会员信息、注册服务、健康检查等功能。datacenter
:数据中心,私有的,低延迟的和高带宽的网络环境。一般的多个数据中心之间的数据是不会被复制的,但可用过 ACL replication 或使用外部工具 onsul-replicate。Consensus
,共识协议,使用它来协商选出 leader。Gossip
:consul 是建立在 Serf,它提供完整的 gossip protocol,维基百科。LAN Gossip
,Lan gossip 池,包含位于同一局域网或数据中心上的节点。WAN Gossip
,只包含 server 的 WAN Gossip 池,这些服务器主要位于不同的数据中心,通常通过互联网或广域网进行通信。members
:成员,对 consul 成员的称呼。提供会员资格,故障检测和事件广播。有兴趣的朋友可以深入研究下。
consul 端口说明
- TCP/8300 端口用于服务器节点。客户端通过该端口 RPC 协议调用服务端节点。
- TCP/UDP/8301 端口用于单个数据中心所有节点之间的互相通信,即对 LAN 池信息的同步。它使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,事件广播(如领导选举事件)。
- TCP/UDP/8302 端口用于单个或多个数据中心之间的服务器节点的信息同步,即对 WAN 池信息的同步。它针对互联网的高延迟进行了优化,能够实现跨数据中心请求。
- 8500 端口基于 HTTP 协议,用于 API 接口或 WEB UI 访问。
- 8600 端口作为 DNS 服务器,它使得我们可以通过节点名查询节点信息。
部署
下载地址:https://www.consul.io/downloads.html
1、单台Server启动命令
/usr/local/consul/consul agent -server -bootstrap-expect 1 -ui -data-dir /usr/local/consul/data -node=w1 -bind=0.0.0.0 -rejoin -config-dir=/usr/local/consul/etc -client 0.0.0.0
-
server : 定义agent运行在server模式,如果是client模式则不需要添加这个参数
-
bootstrap-expect :datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导(启动)整个集群,为了测试演示,我们这里使用1
-
bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-
node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-
rejoin:使consul忽略先前的离开,在agent再次启动后仍旧尝试加入集群中。也就是说如果不加入这个参数,当前节点一旦退出,下次重启后是不会自动加入到集群中去的,除非是手动触发
consul join xxxx
,所以为了降低重启后对本身服务的影响,这里统一使用 -rejoin参数。 -
config-dir:配置文件目录,里面文件统一规定是以.json结尾才会被自动加载并读取服务注册信息的
-
client:consul服务侦听地址,处于client mode的Consul agent节点比较简单,无状态,仅仅负责将请求转发给Server agent节点
2、配置文件启动方式
/usr/local/consul/consul agent -config-file /usr/local/consul/etc/consul.json > /usr/local/consul/logs/consul.log 2>&1 &
配置文件内容
{ "datacenter": "devops", "data_dir": "/usr/local/consul/data", "log_level": "INFO", "node_name": "w01", "server": true, "ui": true, "bootstrap_expect": 1, "bind_addr": "192.168.1.93", "client_addr": "0.0.0.0", "retry_interval": "30s", "raft_protocol": 3, "enable_debug": false, "rejoin_after_leave": true, "enable_syslog": false, "acl_datacenter": "DEVOPS", "acl_master_token": "qwerasdf", "acl_default_policy": "deny" }
3、页面访问 http://192.168.1.93:8500/ui
4、ACL配置
5、查看集群状态
consul operator raft list-peers
配置介绍
- 命令行参数
-advertise:通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址 -bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。 -bootstrap-expect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用。 -bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0。 -client:consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1。 -config-file:明确的指定要加载哪个配置文件 -config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载 -data-dir:提供一个目录用来存放agent的状态,所有的agent都需要该目录,该目录必须是稳定的,系统重启后都继续存在。 -dc:该标记控制agent的datacenter的名称,默认是dc1。 -encrypt:指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key。 -join:加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败。默认agent启动时不会加入任何节点。 -retry-join:和join类似,但是允许你在第一次失败后进行尝试。 -retry-interval:两次join之间的时间间隔,默认是30s。 -retry-max:尝试重复join的次数,默认是0,也就是无限次尝试。 -log-level:consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err。 -node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。 -protocol:consul使用的协议版本。 -rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。 -server:定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个。 -syslog:开启系统日志功能,只在linux/osx上生效。 -ui-dir:提供存放web ui资源的路径,该目录必须是可读的。 -pid-file:提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent。
- 配置文件
acl_datacenter:只用于server,指定的datacenter的权威ACL信息,所有的servers和datacenter必须同意ACL datacenter acl_default_policy:默认是allow。 acl_token:agent会使用这个token和consul server进行请求。 acl_ttl:控制TTL的cache,默认是30s。 addresses:一个嵌套对象,可以设置以下key:dns、http、rpc。 advertise_addr:等同于-advertise。 bootstrap:等同于-bootstrap。 bootstrap_expect:等同于-bootstrap-expect。 bind_addr:等同于-bind。 ca_file:提供CA文件路径,用来检查客户端或者服务端的链接。 cert_file:必须和key_file一起。 client_addr:等同于-client。 datacenter:等同于-dc。 data_dir:等同于-data-dir。 disable_anonymous_signature:在进行更新检查时禁止匿名签名。 disable_remote_exec:禁止支持远程执行,设置为true,agent会忽视所有进入的远程执行请求。 disable_update_check:禁止自动检查安全公告和新版本信息。 dns_config:是一个嵌套对象,可以设置以下参数:allow_stale、max_stale、node_ttl 、service_ttl、enable_truncate。 domain:默认情况下consul在进行DNS查询时查询的是consul域,可以通过该参数进行修改。 enable_debug:开启debug模式。 enable_syslog:等同于-syslog。 encrypt:等同于-encrypt。 key_file:提供私钥的路径。 leave_on_terminate:默认是false,如果为true,当agent收到一个TERM信号的时候,它会发送leave信息到集群中的其他节点上。 log_level:等同于-log-level。 node_name:等同于-node。 ports:这是一个嵌套对象,可以设置以下key:dns(dns地址:8600)、http(http api地址:8500)、rpc(rpc:8400)、serf_lan(lan port:8301)、serf_wan(wan port:8302)、server(server rpc:8300)。 protocol:等同于-protocol。 rejoin_after_leave:等同于-rejoin。 retry_join:等同于-retry-join。 retry_interval:等同于-retry-interval。 server:等同于-server。 server_name:会覆盖TLS CA的node_name,可以用来确认CA name和hostname相匹配。 skip_leave_on_interrupt:和leave_on_terminate比较类似,不过只影响当前句柄。 start_join:一个字符数组提供的节点地址会在启动时被加入。 syslog_facility:当enable_syslog被提供后,该参数控制哪个级别的信息被发送,默认Local0。 ui_dir:等同于-ui-dir。 verify_incoming:默认false,如果为true,则所有进入链接都需要使用TLS,需要客户端使用ca_file提供ca文件。只用于consul server端,因为client从来没有进入的链接。 verify_outgoing:默认false,如果为true,则所有出去链接都需要使用TLS,需要服务端使用ca_file提供ca文件,consul server和client都需要使用,因为两者都有出去的链接。 watches:watch一个详细名单。
Consul在Go微服务中的应用
参考博客
http://lihaoquan.me/2018/5/31/consul-in-action.html
https://www.jianshu.com/p/3d074ed76a68
http://www.liangxiansen.cn/2017/04/06/consul/
http://techblog.zeomega.com/devops/golang/2015/06/09/consul-kv-api-in-golang.html