高可用模式(HA)
Vault 支持多服务器部署模式以实现高可用性。此模式通过运行多个 Vault 服务器来防止服务中断。使用支持高可用的数据存储时,会自动启用高可用模式。
用户可以通过启动服务器并查看输出数据存储信息之后是否紧跟着输出“(HA available)”来判断数据存储是否支持高可用性模式(“HA”)。如果是的话,则 Vault 将自动使用 HA 模式。
为了获得高可用性,其中某一个 Vault 服务器节点会在数据存储中成功获取锁。获取到锁的服务器节点将成为主节点;所有其他节点成为备用节点。此时,如果备用节点收到请求,它们将根据集群的当前配置和状态对相关详细信息进行请求转发或客户端重定向,请参阅本文下方的部分。由于这种架构,HA 无法提高性能可扩展性。一般来说,Vault 性能的瓶颈在于数据存储本身,而不是 Vault 内核。例如:为了增加使用 Consul 作为存储的 Vault 集群的性能可扩展性,我们通常需要扩展 Consul 而不是 Vault。
某些存储后端可以支持高可用性模式,这使它们可以同时存储 Vault 的信息以及 HA 锁信息。但是,Vault 也支持分开存储 Vault 数据 和 HA 锁,这可以通过在具有不同后端的配置文件中指定 storage
和 ha_storage
节来完成。例如,可以将 Vault 集群设置为使用 Consul 作为 ha_storage
来管理锁,并使用 Amazon S3 作为所有其他持久数据的存储。
以下部分更详细地解释了服务器通信模式和每种类型的请求处理。至少要满足重定向模式的要求才能使 HA 集群成功运行。
服务器对服务器的通信
两种处理请求的方法都依赖于主节点向其他节点通告自身的信息。该通信并非经由网络,而是通过 Vault 的加密存储完成的;主节点写入自身信息,然后解封了的从节点可以读取到这些信息。
客户端重定向方法是服务器对服务器通信的一种衍生——仅数据存储中的加密数据来传递状态,而不使用直接通信。
如果使用请求转发方法,服务器之间需要进行直接通信。为了安全地执行此操作,主节点还通过加密的数据存储条目通告新生成的用于客户端和服务器之间进行身份验证的私钥 (ECDSA-P521) 和自签名证书。每个备用节点使用私钥和证书通过通告的集群地址,建立连接到主节点的经过相互验证身份的 TLS 1.2 连接。当备用节点收到来自客户端的请求时,请求被序列化,通过这个受 TLS 保护的通信通道发送,并由主节点执行。然后主节点向备用节点返回响应,备用节点将响应发送回请求客户端。
请求转发
如果启用了请求转发(从 0.6.2 开始默认启用),客户端仍然可以通过设置 X-Vault-No-Request-Forwarding
标头为任意非空值来强行使用旧的重定向行为。
要成功设置集群需要一些配置参数,但有些参数可以自动确定。
客户端重定向
如果请求中的 X-Vault-No-Request-Forwarding
标头设置为非空值,备用节点将使用 307
状态代码将客户端重定向到主节点地址上。
这也是关闭请求转发或执行转发出错时使用的备用方法。因此所有高可用设置始终需要设定一个重定向地址。
一些高可用数据存储的驱动可以自动检测重定向地址,但通常需要通过配置文件中的配置项来手动配置它。该值的键是 api_addr
,它的值会优先使用环境变量 VAULT_API_ADDR
的值。
api_addr
值应设置成什么取决于 Vault 的配置方式。有两种常见情况:客户端直接访问的 Vault 服务器,以及通过负载均衡器访问的 Vault 服务器。
在这两种情况下,api_addr
都应该是包含 (http
/https
) 的完整 URL,而不仅仅是 IP 地址和端口。
直接访问
当客户端可以直接访问 Vault 服务器时,每个节点的 api_addr
应该设置成节点的地址。比如说有两个 Vault 节点:
A
:访问地址为https://a.vault.mycompany.com:8200
B
:访问地址为https://b.vault.mycompany.com:8200
那么节点 A
需要将其 api_addr
设置为 https://a.vault.mycompany.com:8200
,同时节点 B
需要将其 api_addr
设置为 https://b.vault.mycompany.com:8200
。
这样的话,当 A
成为主节点时,B
节点收到的任何请求都会被从定向到 A
节点的地址https://a.vault.mycompany.com:8200
,反之亦然。
使用负载均衡
有时客户端一开始通过负载均衡器访问一个 Vault 服务器,但实际上它可以直接访问均衡器后端每个 Vault 节点。在这种情况下,Vault 服务器实际上应该按照上一节所述进行设置,这样客户端可以直接访问服务器时可以被正确地重定向。
但是,如果只能通过负载均衡器访问 Vault 服务器,那么每个节点上的 api_addr
应该是相同的,那就是负载均衡器的地址。发送请求到备用节点的客户端将被重定向回负载均衡器;同时,负载均衡器的后端最好已更新为当前主节点的地址。这种机制可能会导致重定向循环,因此尽量不要这样设置。
每个节点的 listener
地址
Vault 配置文件中的每个 listener
块都包含一个 address
值,Vault 在该地址上侦听请求。同样,每个 listener
块都可以包含一个 cluster_address
,Vault 在该地址上侦听服务器对服务器的集群请求。如果不设置这个值,它的 IP 地址将自动设置为与 address
值相同,其端口将自动设置为在 address
使用的端口号上加 1(因此默认为 8201 端口)。
请注意,只有主节点运行了活动的侦听器。当一个节点晋升为主节点状态时,它将启动集群侦听器,当它变为备用节点时,它将停止这些侦听器。
每个节点的 cluster_addr
与 api_addr
类似,每个节点如果处于主节点状态时都应该通过服务器对服务器通信将其 cluster_addr
值通告给其他备用节点,并且 cluster_addr
作为配置文件中的顶层配置项而存在。每个节点上的 cluster_addr
应该设置为主机名或 IP 地址,备用服务器可以使用它来访问 listener
块中设置的该节点的一个或多个 cluster_address
值之一,包括端口号。 (请注意,该地址强制使用 https
,因为服务器之间仅使用 TLS 连接。)
如果设置了 VAULT_CLUSTER_ADDR
环境变量,那么该环境变量值会被优先使用。
支持的存储
目前支持高可用模式的存储后端有几种,包括 Consul、ZooKeeper 和 etcd。这些可能会随着时间的推移而改变。
HashiCorp 推荐使用 Consul 作为高可用存储,因为它由 HashiCorp 及其客户在商业支持下用于生产环境。
如果用户有兴趣实施另一个后端或向另一个后端添加高可用支持,HashiCorp 很乐意接受社区的贡献。添加高可用支持需要为存储后端实现 physical.HABackend 接口。