Skip to main content

概述

kira-dragonfly 是基于 Dragonfly 的分布式 Redis 缓存服务,部署在两个区域,为 kira-be 提供低延迟的缓存访问。

部署信息

配置
平台Fly.io
区域sjc (San Jose), fra (Frankfurt)
内存8GB
CPU4 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;

连接配置

环境变量

REDIS_URL=redis://:[email protected]:6379

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_keysKey 数量
dragonfly_uptime_in_seconds运行时间

区分区域

指标通过 region 标签区分:
  • region=sjc - San Jose 实例
  • region=fra - Frankfurt 实例

建议报警

指标WarningCritical
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
  • 自动故障转移
当前独立实例模式适合纯缓存场景,无需复杂的高可用配置。