GCS 容错#

全局控制服务 (Global Control Service),简称 GCS,负责管理集群级别的元数据。它还提供了一些集群级别的操作,包括 ActorPlacement Group 和节点管理。默认情况下,GCS 不具备容错能力,因为它将所有数据存储在内存中。如果 GCS 失败,整个 Ray 集群都会失败。要启用 GCS 容错,您需要一个高可用的 Redis 实例,称为 HA Redis。然后,当 GCS 重启时,它会从 Redis 实例加载所有数据并恢复正常功能。

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

  • Actor 的创建、删除和重建。

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

  • 资源管理。

  • Worker 节点的注册。

  • Worker 进程的创建。

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

设置 Redis#

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

如果您正在使用 ray start 命令来启动 Ray Head 节点,请将操作系统环境变量 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

在您使用 Redis 备份 GCS 后,GCS 在重启时会从 Redis 中恢复其状态。在 GCS 恢复期间,每个 Raylet 会尝试重新连接到 GCS。如果一个 Raylet 在 60 秒以上无法重新连接,该 Raylet 将会退出,并且相应的节点将失败。您可以使用操作系统环境变量 RAY_gcs_rpc_server_reconnect_timeout_s 来设置此超时阈值。

如果 GCS 的 IP 地址在重启后可能会发生变化,请使用一个合格的域名,并在启动时将其传递给所有 Raylet。每个 Raylet 会解析该域名并连接到正确的 GCS。您需要确保在任何时候只有一个 GCS 在运行。

注意

使用外部 Redis 进行 GCS 容错,仅在您使用 KubeRay 来实现 Ray Serve 容错 时得到官方支持。对于其他情况,您可以自行承担风险使用,并且您需要实现额外的机制来检测 GCS 或 Head 节点的故障并重启它们。

注意

您也可以在 Anyscale 上运行 Ray 时启用 GCS 容错。有关说明,请参阅 Anyscale 的 文档