Files
2025-11-03 20:16:08 +08:00

7.3 KiB
Raw Permalink Blame History

Restate 多节点集群

用于生产工作负载的高可用 3 节点 Restate 集群。此配置提供容错和自动故障转移功能。

特性

  • 高可用性3 节点集群可以容忍 1 个节点故障
  • 数据复制可配置的复制因子默认3 个节点中的 2 个)
  • 自动快照:定期快照存储在 MinIOS3 兼容)中
  • 负载分配:用于负载均衡的多个入口端点
  • 元数据仲裁:用于一致性的复制元数据集群

快速开始

  1. 复制环境变量文件:

    cp .env.example .env
    
  2. 启动集群:

    docker compose up -d
    
  3. 验证集群健康状态:

    # 检查节点 1
    curl http://localhost:9070/health
    
    # 检查节点 2
    curl http://localhost:29070/health
    
    # 检查节点 3
    curl http://localhost:39070/health
    

架构

集群由以下部分组成:

  • 3 个 Restate 节点:具有复制状态的分布式工作流引擎
  • MinIO:用于分区快照的 S3 兼容存储
  • Replicated Bifrost Provider:跨节点的日志复制
  • 元数据集群:所有节点上的分布式元数据服务器

服务端点

节点 1主节点

  • Ingress APIhttp://localhost:8080
  • Admin APIhttp://localhost:9070
  • 节点通信:端口 5122

节点 2

  • Ingress APIhttp://localhost:28080
  • Admin APIhttp://localhost:29070
  • 节点通信:端口 25122

节点 3

  • Ingress APIhttp://localhost:38080
  • Admin APIhttp://localhost:39070
  • 节点通信:端口 35122

MinIO

  • APIhttp://localhost:9000
  • 控制台:http://localhost:9001(管理 UI
    • 用户名:minioadmin
    • 密码:minioadmin

环境变量

集群配置

变量 默认值 说明
RESTATE_VERSION 1.5.3 Restate 服务器版本
RESTATE_CLUSTER_NAME restate-cluster 集群名称
RESTATE_DEFAULT_REPLICATION 2 写入所需的最小副本数

端口配置

每个节点有三个端口:

  • NODEx_INGRESS_PORT_OVERRIDEIngress API 端口
  • NODEx_ADMIN_PORT_OVERRIDEAdmin API 端口
  • NODEx_NODE_PORT_OVERRIDE:节点间通信端口

快照配置

变量 默认值 说明
RESTATE_WORKER__SNAPSHOTS__DESTINATION s3://restate/snapshots S3 存储桶路径
RESTATE_WORKER__SNAPSHOTS__SNAPSHOT_INTERVAL_NUM_RECORDS 1000 每个快照的记录数
RESTATE_WORKER__SNAPSHOTS__AWS_ENDPOINT_URL http://minio:9000 S3 端点

MinIO 配置

变量 默认值 说明
MINIO_VERSION latest MinIO 版本
MINIO_ROOT_USER minioadmin MinIO 管理员用户名
MINIO_ROOT_PASSWORD minioadmin MinIO 管理员密码
MINIO_API_PORT_OVERRIDE 9000 MinIO API 端口
MINIO_CONSOLE_PORT_OVERRIDE 9001 MinIO 控制台端口

使用示例

部署服务(到任何节点)

# 部署到节点 1
curl -X POST http://localhost:9070/deployments \
  -H 'Content-Type: application/json' \
  -d '{"uri": "http://my-service:9080"}'

使用负载均衡调用服务

使用负载均衡器或 DNS 轮询跨入口端点:

# 节点 1
curl -X POST http://localhost:8080/MyService/myMethod \
  -H 'Content-Type: application/json' \
  -d '{"key": "value"}'

# 节点 2
curl -X POST http://localhost:28080/MyService/myMethod \
  -H 'Content-Type: application/json' \
  -d '{"key": "value"}'

检查集群状态

# 从任何管理 API
curl http://localhost:9070/cluster

容错能力

集群配置为:

  • 复制因子2数据写入 3 个节点中的 2 个)
  • 仲裁元数据操作需要多数2/3 节点)
  • 容错能力:可以在不停机的情况下容忍 1 个节点故障

测试故障转移

停止一个节点:

docker compose stop restate-2

集群继续运行。服务在节点 1 和 3 上仍然可用。

快照和备份

分区快照每 1000 条记录自动保存到 MinIO。这使得

  • 故障后快速恢复
  • 备份和恢复功能
  • 减少节点重启时的重放时间

查看快照

http://localhost:9001 访问 MinIO 控制台:

  1. 使用 minioadmin / minioadmin 登录
  2. 导航到 restate 存储桶
  3. 浏览 snapshots/ 目录

备份策略

要备份集群数据:

  1. 停止集群:

    docker compose down
    
  2. 备份卷:

    docker run --rm -v restate-cluster_restate_data:/data -v $(pwd)/backup:/backup alpine tar czf /backup/restate-data.tar.gz -C /data .
    docker run --rm -v restate-cluster_minio_data:/data -v $(pwd)/backup:/backup alpine tar czf /backup/minio-data.tar.gz -C /data .
    

资源限制

每个 Restate 节点

  • CPU0.5-2.0 核心
  • 内存512MB-2GB

MinIO 实例

  • CPU0.25-1.0 核心
  • 内存128MB-512MB

根据 docker-compose.yaml 中的工作负载进行调整。

扩展

要添加更多节点:

  1. docker-compose.yaml 中添加新服务
  2. 设置唯一的 RESTATE_NODE_NAMERESTATE_FORCE_NODE_ID
  3. 将节点地址添加到 RESTATE_METADATA_CLIENT__ADDRESSES
  4. 暴露唯一端口
  5. 设置 RESTATE_AUTO_PROVISION=false

生产注意事项

  • 存储使用持久存储卷EBS、持久磁盘
  • 网络:确保节点之间的低延迟(<10ms
  • 监控:在端口 9070 上设置 Prometheus 抓取
  • 安全:在生产环境中更改 MinIO 凭据
  • 复制:根据集群大小调整 RESTATE_DEFAULT_REPLICATION
  • 快照:考虑使用外部 S3 进行快照存储

监控

每个节点都公开指标:

curl http://localhost:9070/metrics   # 节点 1
curl http://localhost:29070/metrics  # 节点 2
curl http://localhost:39070/metrics  # 节点 3

故障排除

节点无法启动

检查日志:

docker compose logs restate-1

确保所有节点可以在端口 5122 上相互访问。

防止脑裂

集群使用 raft 共识和多数仲裁。如果节点被分区只有具有多数2+ 节点)的分区保持活动状态。

数据恢复

如果数据损坏:

  1. 停止集群
  2. 从卷备份恢复
  3. 重启集群

文档

许可证

此配置在项目许可证下提供。Restate 采用 Business Source License 1.1 许可。

注意事项

  • 对于单节点部署,请参见 restate
  • MinIO 用于演示目的;在生产环境中使用 AWS S3/兼容存储
  • 集群在首次启动时自动配置
  • 节点 ID 被固定以确保重启时的一致标识