为持久化容错 GCS 调优 Redis#
使用 Redis 作为 KubeRay 中全局控制存储 (GCS) 的后端,可以在 Ray Head 丢失的情况下提供容错能力。它允许新的 Ray Head 通过读取 Redis 来重建其状态。
然而,如果 Redis 丢失了数据,Ray Head 的状态也会丢失。
因此,您可能希望在 Redis 集群发生部分或全部故障时获得进一步的保护。本指南介绍了如何为具有 KubeRay 的高可用 Ray 集群配置和调优 Redis。
对 Ray 集群进行调优以实现高可用性,可以保护长期运行的任务免受意外故障的影响,并允许您在普通硬件/可抢占机器上运行 Ray。
解决方案概述#
KubeRay 支持使用 Redis 持久化 GCS,这可以将(数据丢失的)故障点移出 Ray。但是,您仍然需要配置 Redis 本身来应对故障。
此解决方案配置一个由硬件存储支持的持久卷,Redis 将使用它来写入定期快照。如果 Redis 或其宿主节点丢失,Redis 部署可以从快照中恢复。
虽然 Redis 支持集群,但 KubeRay 只支持独立(单个副本)Redis,因此省略了集群配置。
持久化存储#
专用存储卷(如 Google Cloud Storage FUSE 或 S3)不支持追加操作,而 Redis 使用追加操作来高效地写入其追加日志文件 (AOF)。使用这些选项时,建议禁用 AOF。
对于 GCP GKE 和 Azure AKS,默认存储类分别是持久磁盘和SSD Azure 磁盘,配置持久化磁盘所需的唯一配置如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
storageClassName: standard-rwo
在 AWS 上,您还必须自己创建存储类。
调优备份#
Redis 支持按设定间隔进行数据库转储,这有助于快速恢复和正常运行期间的高性能。
Redis 还支持按高频率间隔(或连续)进行日志记录,这可以提供更强的持久性,但代价是更多的磁盘写入(即性能下降)。
以下配置是备份的一个良好起点,两者都已启用:
# Dump a backup every 60s, if there are 1000 writes since the prev. backup.
save 60 1000
dbfilename dump.rdb
# Enable the append-only log file.
appendonly yes
appendfilename "appendonly.aof"
在此推荐配置中,Redis 每 60 秒创建一个完整备份,并每秒更新一次追加日志,这在磁盘空间、延迟和数据安全性之间取得了合理的平衡。
还有更多选项可以配置 AOF,默认值如下所示:
# Sync the log to disk every second.
# Alternatives are "no" and "always" (every write).
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
您可以在此处查看完整参考。
如果您的作业通常是幂等的,并且可以从丢失几分钟的状态中恢复,那么您可能更倾向于禁用追加日志。
如果您希望您的作业尽可能少地丢失状态,那么您可能更倾向于将 appendfsync 设置为 always,这样 Redis 会立即存储所有写入。
整合#
编辑完整的 YAML 文件直到您满意为止,然后应用它。
kubectl apply -f config/samples/ray-cluster.persistent-redis.yaml
验证 Kubernetes 是否已配置磁盘并且 Redis 正在运行。
kubectl get persistentvolumes
kubectl get pods
# Should see redis-0 running.
在运行带有 GCS 中一些状态的任务后,您可以删除 ray head pod 和 redis pod,而不会丢失数据。
验证#
使用Ray kubectl 插件将连接转发到您刚刚创建的 Ray 集群。
$ kubectl ray session raycluster-external-redis
然后提交您选择的任何 Ray 作业并让它运行。完成后,删除所有 pod。
$ kubectl delete pods --all
等待 Kubernetes 配置 Ray Head 并进入就绪状态。然后重启端口转发,查看 Ray Dashboard。您应该会发现,尽管 ray head 和 Redis 副本丢失了,Ray 和 Redis 仍然持久化了您作业的元数据。