kira-dragonfly 是基于 Dragonfly 的分布式 Redis 缓存服务,部署在两个区域,为 kira-be 提供低延迟的缓存访问。
部署信息
| 配置 | 值 |
|---|
| 平台 | Fly.io |
| 区域 | sjc (San Jose), fra (Frankfurt) |
| 内存 | 8GB |
| CPU | 4 vCPU (shared) |
| 存储 | 10GB Volume |
| 端口 | 6379 (内部) |
| 内部地址 | kira-dragonfly.internal:6379 |
架构设计
独立实例
两个区域各自运行独立的 Dragonfly 实例,不进行跨区域复制。
这种设计适合缓存场景:
- 缓存数据可以从源重新生成
- 避免跨区域同步的延迟和复杂性
- 每个区域的 kira-be 访问本地 Dragonfly
6PN 私有网络
Dragonfly 仅在 Fly.io 内部网络 (6PN) 中可访问:
- 使用
.internal DNS 解析
- 自动路由到最近的实例
- WireGuard 加密传输
- 无需 TLS(网络层已加密)
使用场景
kira-be 缓存
目前用于缓存 signed_url:
// kira-be/src/ai/libs/upload.ts
const cached = await redis.get(`signed_url:${bucket}:${path}`);
if (cached) return cached;
const url = await generateSignedUrl(bucket, path);
await redis.setex(`signed_url:${bucket}:${path}`, 3600, url);
return url;
连接配置
环境变量
ioredis 客户端
import Redis from "ioredis";
const redis = new Redis(process.env.REDIS_URL, {
maxRetriesPerRequest: 3,
retryDelayOnFailover: 100,
});
cd kira-dragonfly
# 首次部署
fly apps create kira-dragonfly
fly volumes create dragonfly_data --region sjc --size 10
fly volumes create dragonfly_data --region fra --size 10
fly secrets set DRAGONFLY_PASSWORD=<password>
fly deploy
fly scale count 2 --region sjc,fra
# 后续部署 (CI/CD 自动执行)
fly deploy
测试连接
# 建立本地隧道
fly proxy 6379:6379 -a kira-dragonfly -r sjc
# 测试
redis-cli -h localhost -a <password> ping
重启实例
fly machines restart -a kira-dragonfly
OpenTelemetry
每个实例运行 OTEL Collector sidecar,将 Dragonfly 指标发送到 Better Stack。
关键指标
| 指标 | 说明 |
|---|
dragonfly_memory_used_bytes | 内存使用量 |
dragonfly_connected_clients | 连接数 |
dragonfly_keyspace_hits_total | 缓存命中 |
dragonfly_keyspace_misses_total | 缓存未命中 |
dragonfly_commands_processed_total | 命令处理数 |
dragonfly_db_keys | Key 数量 |
dragonfly_uptime_in_seconds | 运行时间 |
区分区域
指标通过 region 标签区分:
region=sjc - San Jose 实例
region=fra - Frankfurt 实例
建议报警
| 指标 | Warning | Critical |
|---|
| Memory Used | > 5GB | > 6.5GB |
| Connected Clients | > 100 | > 200 |
| Cache Hit Rate | < 80% | < 50% |
文件结构
kira-dragonfly/
├── .github/
│ └── workflows/
│ └── deploy.yml # CI/CD
├── Dockerfile # Dragonfly + OTEL Collector
├── fly.toml # Fly.io 配置
├── otel-collector.yaml # OTEL 配置
├── start.sh # 启动脚本
└── README.md
配置详情
fly.toml
app = 'kira-dragonfly'
primary_region = 'sjc'
[build]
dockerfile = "Dockerfile"
[mounts]
source = "dragonfly_data"
destination = "/data"
[[vm]]
memory = '8gb'
cpu_kind = 'shared'
cpus = 4
otel-collector.yaml
receivers:
prometheus:
config:
scrape_configs:
- job_name: 'dragonfly'
scrape_interval: 30s
static_configs:
- targets: ['localhost:6379']
metrics_path: /metrics
processors:
resource:
attributes:
- key: service.name
value: kira-dragonfly
action: upsert
- key: region
value: ${env:FLY_REGION}
action: upsert
- key: machine.id
value: ${env:FLY_MACHINE_ID}
action: upsert
exporters:
otlphttp:
endpoint: https://s1667254.us-east-9.betterstackdata.com
headers:
Authorization: "Bearer <token>"
service:
pipelines:
metrics:
receivers: [prometheus]
processors: [resource]
exporters: [otlphttp]
未来扩展
Cluster 模式
如果数据量增长需要水平扩展,可以迁移到 Redis Cluster 模式:
# 每个区域 3 节点
fly scale count 6 --region sjc,sjc,sjc,fra,fra,fra
需要修改客户端配置使用 Cluster 连接。
Sentinel 模式
如果需要高可用(主从自动切换),可以添加 Sentinel:
- 每个区域 1 主 + 1 从 + 3 Sentinel
- 自动故障转移
当前独立实例模式适合纯缓存场景,无需复杂的高可用配置。