7.3 KiB
7.3 KiB
Restate 多节点集群
用于生产工作负载的高可用 3 节点 Restate 集群。此配置提供容错和自动故障转移功能。
特性
- 高可用性:3 节点集群可以容忍 1 个节点故障
- 数据复制:可配置的复制因子(默认:3 个节点中的 2 个)
- 自动快照:定期快照存储在 MinIO(S3 兼容)中
- 负载分配:用于负载均衡的多个入口端点
- 元数据仲裁:用于一致性的复制元数据集群
快速开始
-
复制环境变量文件:
cp .env.example .env -
启动集群:
docker compose up -d -
验证集群健康状态:
# 检查节点 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 API:
http://localhost:8080 - Admin API:
http://localhost:9070 - 节点通信:端口 5122
节点 2
- Ingress API:
http://localhost:28080 - Admin API:
http://localhost:29070 - 节点通信:端口 25122
节点 3
- Ingress API:
http://localhost:38080 - Admin API:
http://localhost:39070 - 节点通信:端口 35122
MinIO
- API:
http://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_OVERRIDE:Ingress API 端口NODEx_ADMIN_PORT_OVERRIDE:Admin 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 控制台:
- 使用
minioadmin/minioadmin登录 - 导航到
restate存储桶 - 浏览
snapshots/目录
备份策略
要备份集群数据:
-
停止集群:
docker compose down -
备份卷:
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 节点
- CPU:0.5-2.0 核心
- 内存:512MB-2GB
MinIO 实例
- CPU:0.25-1.0 核心
- 内存:128MB-512MB
根据 docker-compose.yaml 中的工作负载进行调整。
扩展
要添加更多节点:
- 在
docker-compose.yaml中添加新服务 - 设置唯一的
RESTATE_NODE_NAME和RESTATE_FORCE_NODE_ID - 将节点地址添加到
RESTATE_METADATA_CLIENT__ADDRESSES - 暴露唯一端口
- 设置
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+ 节点)的分区保持活动状态。
数据恢复
如果数据损坏:
- 停止集群
- 从卷备份恢复
- 重启集群
文档
许可证
此配置在项目许可证下提供。Restate 采用 Business Source License 1.1 许可。
注意事项
- 对于单节点部署,请参见 restate
- MinIO 用于演示目的;在生产环境中使用 AWS S3/兼容存储
- 集群在首次启动时自动配置
- 节点 ID 被固定以确保重启时的一致标识