Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。Consul 是分布式的、高可用的、可横向扩展的。
官网:https://www.consul.io,最新版本:1.8.3
Agent:是在 Consul 集群的每个成员上长期运行的守护进程,通过命令 consul agent 启动运行。由于所有节点都必须运行一个 Agent,因此 Agent 可以分为 client 或 Server。 所有的 Agent 都可以运行DNS或HTTP接口,并负责运行监测和保持服务同步 Client:是将所有RPC转发到 Server 的 Agent。Client 是相对无状态的,Client 唯一执行的后台活动是加入 LAN gossip 池。这只有最小的资源开销,且只消耗少量的网络带宽 Server:是一个有一组扩展功能的 Agent,这些功能包括参与 Raft 选举、维护集群状态、响应RPC查询、与其他数据中心交互 WAN gossip 和转发查询给 leader 或远程的数据中心 Datacenter:是一个私有的、低延迟和高带宽的网络环境。这不包括通过公网的通信,但就目的而言,单个 EC2 中的多个可用区域被视为数据中心的一部分 Consensus:一致性。Consul 使用 Consensus 协议(具体由 Raft 算法实现)来提供一致性(由 CAP 定义),表明 leader 选举和事务的顺序达成一致 Gossip:Consul 使用 Gossip 协议来管理成员资格并向集群广播消息。Serf 提供了完整的 Gossip 协议,可用于多种目的,而 Consul 建立在 Serf 之上。 Gossip 涉及节点到节点的随机通信,主要是通过UDP。Gossip 协议也被称为 Epidemic 协议(流行病协议) LAN Gossip:指包含所有位于同一局域网或数据中心的节点的 LAN gossip 池 WAN Gossip:指仅包含 Server 的 WAN gossip 池。这些 Server 主要分布在不同的数据中心,通常通过Internet或者广域网进行通信 RPC:远程过程调用。一种 请求/响应 机制,允许 Client 向 Server 发起请求
可以看到有两个数据中心,每个数据中心中都有 Client 和 Server。Server的数量建议是 3 或 5 台,这能平衡故障情况下的可用性和集群性能。Server 数量越多,达成一致性也会越慢,但是 Client 的数量没有限制。
其次,数据中心中的所有 Agent 都加入 gossip 协议,这意味着存在一个给定数据中心的所有 Agent 的 gossip 池。这样做有几个目的:
1. 不需要为 Client 配置 Server 地址,发现是自动完成的; 2. 检测 Agent 故障的工作不是放在 Server 上、而是分布式的,这使得故障检测更具可伸缩性; 3. 它被用作一个消息层,已通知何时发生重要事件(例如 leader 选举)
每个数据中心的 Server 都是单个 Raft 对等集的一部分,这意味着它们将共同选举出一个 leader,leader 负责处理所有查询和事务。作为 consensus 协议的一部分,事务必须复制到所有对等方。由于这一需求,当 非 leader Server 收到RPC请求时,它将转发给 leader Server。
Server 还作为 WAN gossip 池的一部分运行。WAN gossip 池与 LAN gossip 池不同,因为它针对Internet更高的延迟进行了优化,并且仅包含其他 Consul Server。WAN gossip 池的目的是允许数据中心以一种低接触的方式发现彼此,在线连接新的数据中心就像加入现有的 WAN gossip 池一样简单。由于 Server 都在 WAN gossip 池中运行,因此它还支持跨数据中心请求。Server 收到其他数据中心的请求时,会将其转发到正确的数据中心的随机 Server,然后该 Server 可以转发给本地的 leader。这就让数据中心之间的耦合非常低,由于故障检测、连接缓存和多路复用,跨数据中心的请求相对较快且可靠。
通常,不会在不同的 Consul 数据中心之间复制数据。当请求另一个数据中心的资源时,本地 Consul Server 将RPC请求转发到该资源的远程 Consul Server 并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会影响本地数据中心。在某些特殊情况下,可以复制有限的数据子集,例如使用 Consul 内置的 ACL复制 功能,或使用诸如 consul-replicate 之类的外部工具。
多数据中心: Consul 支持任意数量的数据中心,而不需要复杂的配置 服务网格/服务细分:Consul Connect通过自动TLS加密和基于身份的授权来实现安全的服务间通信。 应用程序可以在服务网格配置中使用sidecar代理来为入站和出站连接建立TLS连接,而根本不知道Connect 服务发现: Consul 使服务易于注册自己,并通过DNS或HTTP接口发现其他服务。诸如SaaS提供程序之类的外部服务也可以注册 运行状态检测: Consul 提供了健康检查的机制,与服务发现的集成可防止将流量路由到不正常的主机,并启用服务级别的断路器 Key/Value 存储: 灵活的kv存储可以实现动态配置、功能标记、leader选举等,简单的HTTP API使它可以在任何地方轻松使用
Consul最多需要6个不同的端口才能正常工作,某些端口需要使用TCP、UDP或同时使用这两种协议。
DNS:DNS server(TCP和UDP) 8600 HTTP:HTTP API(仅TCP) 8500 HTTPS:HTTPs API disabled(8501)* gRPC:gRPC API disabled(8502)* LAN Serf:Serf LAN 端口(TCP和UDP) 8301 Wan Serf:Serf WAN 端口(TCP和UDP) 8302 server:server RPC 地址(仅TCP) 8300 Sidecar Proxy Min:包含的最小端口号,用于自动分配的sidecar服务注册 21000 Sidecar Proxy Max:包含的最大端口号,用于自动分配的sidecar服务注册 21255
对于HTTPS
和gRPC
,表中指定的端口为推荐值。
系统 | ip | 角色 |
---|---|---|
CentOS 7.8 | 192.168.30.128 | Server |
CentOS 7.8 | 192.168.30.129 | Server |
CentOS 7.8 | 192.168.30.130 | Server |
CentOS 7.8 | 192.168.30.131 | Client |
systemctl stop firewalld && systemctl disable firewalldsed -i 's/=enforcing/=disabled/g' /etc/selinux/config && setenforce 0
mkdir /software && cd /softwarewget https://releases.hashicorp.com/consul/1.8.3/consul_1.8.3_linux_amd64.zip unzip consul_1.8.3_linux_amd64.zipmv consul /usr/local/bin/ consul version Consul v1.8.3 Revision a9322b9c7 Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
consul -autocomplete-install #命令补全
然后打开新的窗口即可。
acl 与 Consul 的ACL进行交互 agent 运行一个 Consul agent catalog 与 Consul 的目录进行交互 config 与 Consul 的配置进行交互 connect 与 Consul 的Connect子系统进行交互 debug 记录 Consul operators 的调试归档 event 触发一个新事件exec 在 Consul 节点上执行命令 force-leave 强制一个集群成员进入离开状态,一般用来强制删除发生故障或已关闭且没有正常离开的节点 info 对 Consul operators 提供调试的信息 intention 与通过Connect对服务的访问控制交互join 将 Consul agent 加入集群 keygen 生成新的加密密钥 keyring 检查和修改 gossip 池中使用的加密密钥 kv 与 k/v 存储进行交互 leave Consul agent 正常离开集群并关闭 lock 在 k/v 存储中的给定前缀处创建一个锁 login 使用所请求的auth方法将提供的第三方凭据交换为新创建的 Consul ACL令牌logout 销毁从 consul login 命令中创建的 Consul 令牌 maint 提供对节点或服务的维护模式的控制 members 列出 Consul 集群的所有成员 monitor 用于连接并追踪正在运行的 Consul agent 的日志 operator 为 Consul operators 提供集群级别的工具 reload 触发 agent 配置文件的重载 rtt 估计两个节点之间的网络往返时间 services 与注册的服务进行交互 snapshot 保存、还原和检查 Consul Server 状态以进行灾难恢复 tls 内置帮助创建Consul TLS的CA和证书 validate 对 Consul 的配置文件或目录执行完整性测试 version 显示 Consul 版本信息watch 监视 Consul 特定数据视图(节点列表,服务成员,k/v等)中的更改
Agent 可以运行为 Server 或 Client 模式,每个数据中心至少有一个 Server。一个集群中建议有3个或5个 Server,单个 Server 在出现故障时会不可避免的造成数据丢失。
Client是一个非常轻量级的进程,用于注册服务、健康检查和转发对 Server 的查询。Agent 必须在集群中的每个节点上运行。
consul agent -dev #开发模式
新开一个窗口,
consul members #查看集群成员Node Address Status Type Build Protocol DC Segment master 127.0.0.1:8301 alive server 1.8.3 2 dc1 <all>
可以看到当前节点名称、运行的地址、健康状态以及集群角色等信息,添加-detailed
可以看到额外的信息。
分别使用HTTP和DNS接口查看信息:
curl localhost:8500/v1/catalog/nodes #HTTP API查看[ { "ID": "f134d82f-1c59-50be-8437-8feb9c1a9351", "Node": "master", "Address": "127.0.0.1", "Datacenter": "dc1", "TaggedAddresses": { "lan": "127.0.0.1", "lan_ipv4": "127.0.0.1", "wan": "127.0.0.1", "wan_ipv4": "127.0.0.1" }, "Meta": { "consul-network-segment": "" }, "CreateIndex": 10, "ModifyIndex": 12 }]yum install -y bind-utilsdig @127.0.0.1 -p 8600 master.node.consul #DNS接口查看;; QUESTION SECTION:;master.node.consul. IN A;; ANSWER SECTION: master.node.consul. 0 IN A 127.0.0.1
consul leave -http-addr=127.0.0.1:8500 #正常退出consul force-leave -http-addr=127.0.0.1:8500 #强制退出
mkdir -p /consul/configecho '{"service": {"name": "nginx", "tags": ["web"], "port": 80}}' | sudo tee /consul/config/nginx.json consul agent -dev -config-dir=/consul/config
通过HTTP API和DNS接口查看,
curl http://localhost:8500/v1/catalog/service/nginxdig @127.0.0.1 -p 8600 nginx.service.consul
mkdir -p /consul/{config,data}consul agent -server -bootstrap-expect=3 \ -data-dir=/consul/data \ -node=agent128 -bind=192.168.30.128 \ -enable-script-checks=true -config-dir=/consul/config \ -client 0.0.0.0 -ui &> /consul/data/consul.log &
参数:
-node:节点的名称 -bind:绑定的一个地址,用于节点之间通信的地址,可以是内外网,必须是可以访问到的地址 -server:表示这个节点是个Server -bootstrap-expect:表示期望提供的Server节点数目。数目一达到,它就会被激活,然后就是leader了 -data-dir:Agent用于存储状态的数据目录,这是所有Agent所必需的 -datacenter:指明数据中心的名字,默认是"dc1"。同一数据中心中的节点应位于单个LAN上 -client:将Client接口(包括HTTP和DNS服务器)绑定到的地址 -ui:启动UI
其他两台机器也创建 consul server,与 192.168.30.128 类似。
mkdir -p /consul/{config,data}consul agent -data-dir=/consul/data \ -node=agent131 -bind=192.168.30.131 \ -enable-script-checks=true -config-dir=/consul/config \ -client 0.0.0.0 -ui &> /consul/data/consul.log &
除 192.168.30.128 外的其他机器加入集群,
consul join 192.168.30.128
consul members Node Address Status Type Build Protocol DC Segment agent128 192.168.30.128:8301 alive server 1.8.3 2 dc1 <all>agent129 192.168.30.129:8301 alive server 1.8.3 2 dc1 <all>agent130 192.168.30.130:8301 alive server 1.8.3 2 dc1 <all>agent131 192.168.30.131:8301 alive client 1.8.3 2 dc1 <default>
可以看得,集群中有3个server和1个client,它们在数据中心dc1中。
打开http://192.168.30.128:8500/ui
,访问consul ui界面,
可以看到,之前演示注册的web服务nginx是正常状态,节点agent130是集群 leader。
consul kv 是consul的核心功能,并随consul agent一起安装。consul kv允许用户存储索引对象,尽管其主要用途是存储配置参数和元数据。
consul kv 数据存储在server上,可以由任何agent(client或server)访问。consul允许在所有server之间自动复制数据,如果发生故障,拥有一定数量的server将减少数据丢失的风险。
数据存储位于server上的数据目录中,为确保在完全中断的情况下不会丢失数据,可以使用 consul snapshot
命令备份数据。
另外,还可以通过 consul kv
子命令、HTTP API 和 Consul UI 访问kv存储。
kv当前为空,即没有存储配置信息。
查询数据:
consul kv get --recurse #查询所有数据
新建数据:
consul kv put username lzx #创建kv对consul kv get username lzx
更新数据:
consul kv put username liu #更新kv对consul kv get username liu
删除数据:
consul kv delete username #删除kv对consul kv get username Error! No key exists at: username
consul 集群部署完毕,整个过程非常简单。