集成存储后端(Raft)

集成存储后端可以用来保存 Vault 的数据。与其他存储后端不同,集成存储并非将数据保存在一个地方,相反,Vault 集群中的所有节点都将拥有 Vault 数据的复制副本。数据通过 Raft 共识算法在所有节点上复制。

  • 支持高可用集群 —— 集成存储后端支持高可用集群。
  • HashiCorp 官方支持 —— HashiCorp 提供对集成存储后端的官方支持
storage "raft" {
  path = "/path/to/raft/data"
  node_id = "raft_node_1"
}
cluster_addr = "http://127.0.0.1:8201"

注意,使用集成存储后端时:

  • 需要提供 cluster_addr 来指定 Raft 集群通信所使用的地址与端口。
  • 不能设置 ha_storage 参数。
  • 强烈建议将 disable_mlock 设置为 true ,并且关闭操作系统的内存换页。

raft 参数

  • path (string: "") – Vault 数据存储的路径。该参数也可以通过环境变量 VAULT_RAFT_PATH 来设置。
  • node_id (string: "") - Raft 集群中本节点的 ID。该参数也可以通过环境变量 VAULT_RAFT_NODE_ID 来设置。
  • performance_multiplier (integer: 0) - 服务器用来缩放关键 Raft 时间参数的整数乘数。调整该参数会影响 Vault 检测领导者宕机随后进行新领导者选举的时间,代价是使用更多网络和 CPU 资源获取更好的性能。忽略该参数或将参数设置为 0 代表使用下面描述的默认倍数。该参数值越小代表时间约束越紧张,这会增加检测的敏感度,而越大的值则会降低检测的敏感度。

默认情况下,Vault 会使用适合于最小 Vault 服务集群的较低性能的倍数设置,目前相当于将该值设置为 5 (该默认值可能会在 Vault 未来的版本中被改变,取决于目标最小服务器配置是否发生变化)。将该参数设置为 1 会使得 Raft 以最高性能模式工作,推荐在生产环境 Vault 服务器上进行这样的配置。该参数允许设置的最大值为 10。

  • trailing_logs (integer: 10000) - 该参数控制了在快照创建后磁盘上的日志存储中保留多少条日志条目。该参数只在由于快照很大,写入吞吐量太高导致在快照被完全写完之前日志就被截断进而导致集群追随者无法跟上领导者的日志进度时才需要被调整。如果需要用该参数来恢复集群,请考虑降低吸入吞吐量或是减少 Vault 中保存的数据量。默认值 10000 适用于大多数正常的工作负载。
  • snapshot_threshold (integer: 8192) - 该参数控制了在两次创建保存到磁盘的快照之间 Raft 提交日志的最小条目数。这是一个低优先级的参数,应该极少需要被调整。在非常繁忙,IO 过载的集群上可以增加该参数的值以减少磁盘 IO 并最大限度地减少所有服务器同时创建快照的可能性。增加该参数的值是以磁盘空间为代价换取降低磁盘 IO,因为日志将会变得更大,并且 raft.db 文件所占用的空间在下一次创建快照之前无法被回收。如果显著增加该参数的值会导致服务器宕机或故障转移后需要更多的时间恢复,因为需要重放更多的日志来恢复状态。
  • retry_join (list: []) - retry_join 配置节可以被反复声明。每当 Raft 集群引导启动时,如果如果实现知道所有节点的连接细节,那么指定该配置节可以使得节点自动加入 Raft 集群。集群的所有节点都应该通过该配置节引用要加入的集群中的所有其他节点。当节点中有一个节点完成了初始化,它将成为领导者并且其他节点会以它为领导者组建集群。当使用的是 Shamir 封印时,加入了集群的节点仍然需要手工解封。
  • max_entry_size (integer: 1048576) - 该参数配置了每条 Raft 条目的最大字节数。该限制同时适用于 Put 操作和 Transaction 操作。任何超过该值的 Put 或 Transaction 操作都将导致相应的操作失败。Raft 对于 Raft 日志条目的最大尺寸有一个建议值,该建议值时更近当前的架构、默认时间决定的。集成存储还使用了块尺寸来将大块数据分割成小块序列。默认情况下,块尺寸与 Raft 的最大日志尺寸相同。该参数的默认值是 1048576——是块尺寸的两倍。
  • autopilot_reconcile_interval (string: "10s") - 该参数配置了自动驾驶系统接收所有状态变更的时间间隔。状态变更可能意味着各种事:例如,一个新加入的投票者节点;最初通过自动驾驶作为非投票者添加到 Raft 集群已成功度过稳定期,从而有资格被提升为投票者;该节点已变得不健康,需要通过状态 API 体现出来;节点已被标记为死亡,需要从 Raft 配置中驱逐,等等。

retry_join 配置节

  • leader_api_addr (string: "") - 可能的领导者节点地址。
  • auto_join (string: "") - 云端自动加入集群配置,使用 go-discover 语法。
  • auto_join_scheme (string: "") - 可选的自动加入地址协议。可配置的项有 http 或者 https
  • auto_join_port (uint: "") - 可选的自动加入地址的端口号。
  • leader_tls_servername (string: "") - 使用 HTTPS 连接时使用的 TLS 服务器名称。该名称应该要与远程服务器证书的 DNS SANs 中的名称之一相匹配。
  • leader_ca_cert_file (string: "") - 潜在领导者节点的 CA 证书的路径。
  • leader_client_cert_file (string: "") - 作为追随者节点与潜在的领导者节点建立连接进行身份验证时所用的客户端证书的路径。
  • leader_client_key_file (string: "") - 作为追随者节点与潜在的领导者节点建立连接进行身份验证时所用的客户端私钥的路径。
  • leader_ca_cert (string: "") - 潜在领导者节点的 CA 证书
  • leader_client_cert (string: "") - 作为追随者节点与潜在的领导者节点建立连接进行身份验证时所用的客户端证书。
  • leader_client_key (string: "") - 作为追随者节点与潜在的领导者节点建立连接进行身份验证时所用的客户端私钥。

每一个 retry_join 块都可以通过文件路径或是单行证书字符串(以 \n 代表换行)设置 TLS 证书,但不能同时设置两者。每一个 retry_join 块都可以包含 leader_api_addr 参数或是 auto-join 参数,但不能同时设置两者。如果设置了 auto_join 参数,Vault 会自动尝试使用 go-discover 发现并解析潜在的 Raft 领导者地址。请阅读 go-discover 项目的 README 获取更多信息。

默认情况下,Vault 会尝试使用 HTTPS 协议和 8200 端口访问被发现的节点。系统管理员可以通过配置 auto_join_scheme 参数和 auto_join_port 参数修改这两个值。

配置样例:

storage "raft" {
  path    = "/Users/foo/raft/"
  node_id = "node1"

  retry_join {
    leader_api_addr = "http://127.0.0.2:8200"
    leader_ca_cert_file = "/path/to/ca1"
    leader_client_cert_file = "/path/to/client/cert1"
    leader_client_key_file = "/path/to/client/key1"
  }
  retry_join {
    leader_api_addr = "http://127.0.0.3:8200"
    leader_ca_cert_file = "/path/to/ca2"
    leader_client_cert_file = "/path/to/client/cert2"
    leader_client_key_file = "/path/to/client/key2"
  }
  retry_join {
    leader_api_addr = "http://127.0.0.4:8200"
    leader_ca_cert_file = "/path/to/ca3"
    leader_client_cert_file = "/path/to/client/cert3"
    leader_client_key_file = "/path/to/client/key3"
  }
  retry_join {
    auto_join = "provider=aws region=eu-west-1 tag_key=vault tag_value=... access_key_id=... secret_access_key=..."
  }
}

results matching ""

    No results matching ""