GCS 容错#

全局控制服务 (GCS) 是一个管理集群级别元数据的服务器。它还提供了一些集群级别的操作,包括actorplacement group和节点管理。默认情况下,GCS 不具备容错性,因为所有数据都存储在内存中,它的故障意味着整个 Ray 集群的故障。要使 GCS 具备容错性,需要使用 HA Redis。然后,当 GCS 重启时,它会从 Redis 实例加载所有数据并恢复正常功能。

在恢复期间,以下功能不可用:

  • Actor 创建、删除和重建。

  • Placement Group 创建、删除和重建。

  • 资源管理。

  • Worker 节点注册。

  • Worker 进程创建。

然而,正在运行的 Ray 任务和 Actor 仍然存活,并且任何现有对象将继续可用。

设置 Redis#

如果你正在使用KubeRay,请参考KubeRay 文档关于 GCS 容错

如果你使用ray start来启动 Ray 头节点,请设置操作系统环境变量RAY_REDIS_ADDRESS为 Redis 地址,并在调用ray start时提供--redis-password标志和密码。

RAY_REDIS_ADDRESS=redis_ip:port ray start --head --redis-password PASSWORD --redis-username default

如果你使用ray up来启动 Ray 集群,修改head_start_ray_commands字段,将RAY_REDIS_ADDRESS--redis-password添加到ray start命令中。

head_start_ray_commands:
  - ray stop
  - ulimit -n 65536; RAY_REDIS_ADDRESS=redis_ip:port ray start --head --redis-password PASSWORD --redis-username default --port=6379 --object-manager-port=8076 --autoscaling-config=~/ray_bootstrap_config.yaml --dashboard-host=0.0.0.0

如果你使用 Kubernetes 但不是KubeRay,请参考此文档

一旦 GCS 由 Redis 支持,当它重启时,将通过从 Redis 读取来恢复状态。当 GCS 从故障状态恢复时,Raylet 将尝试重新连接到 GCS。如果 Raylet 超过 60 秒未能重新连接到 GCS,Raylet 将退出,相应的节点也将失败。这个超时阈值可以通过操作系统环境变量RAY_gcs_rpc_server_reconnect_timeout_s进行调整。

如果 GCS 的 IP 地址在重启后会改变,最好使用合格域名,并在启动时将其传递给所有 Raylet。Raylet 将解析域名并连接到正确的 GCS。你需要确保任何时候只有一个 GCS 存活。

注意

只有在使用KubeRay实现Ray Serve 容错的情况下,外部 Redis 支持的 GCS 容错是官方支持的。对于其他情况,你可以自行承担风险使用它,你需要实现额外的机制来检测 GCS 或头节点的故障并重新启动它。