生产级 Elasticsearch 实时大屏聚合方案

在实时监控、运营大屏、IoT 数据分析等场景中,Elasticsearch 实时大屏聚合方案 需要满足:

  • 低延迟:数据写入后秒级可见;
  • 高吞吐:支持每秒数万次写入;
  • 稳定聚合:图表刷新平滑,无抖动;
  • 可扩展:支持多维度下钻分析;
  • 高可用:7×24 小时不间断。

本文将为你设计一套 生产级 Elasticsearch 实时大屏聚合方案,涵盖数据建模、写入优化、聚合策略、缓存机制与架构设计。


一、典型大屏需求

指标说明
📊 实时订单量每分钟新增订单数
💰 实时交易额近 1 小时销售额
🌍 用户地域分布按省份/城市聚合
🛒 热销商品 Top 10按销量排序
⏱️ 平均响应时间P95 延迟
📈 趋势曲线每分钟/每 5 分钟趋势图

二、系统架构设计

+------------------+     +---------------------+
| 业务系统 / IoT 设备 | --> | Kafka / Pulsar      |
+------------------+     +----------+----------+
                                    |
                                    v
                     +--------------------------+
                     | Logstash / Flink         |
                     | - 数据清洗               |
                     | - 时间对齐               |
                     +------------+-------------+
                                  |
                                  v
                     +--------------------------+
                     | Elasticsearch Cluster    |
                     | - hot-warm 架构          |
                     | - ILM 管理生命周期       |
                     +------------+-------------+
                                  |
                                  v
                     +--------------------------+
                     | Kibana / 自研前端        |
                     | - 实时图表               |
                     | - 大屏展示               |
                     +--------------------------+
                                  |
                                  v
                     +--------------------------+
                     | Prometheus + Grafana     |
                     | - 监控集群与数据延迟     |
                     +--------------------------+

三、数据建模设计

1. 索引命名与生命周期

metrics-2024-10-01  # 按天分索引
metrics-2024-10-02
...

或使用 Data Stream(推荐):

POST /_data_stream/metrics-stream

自动管理 rollover、ILM。


2. Mapping 设计

PUT /metrics-stream
{
  "mappings": {
    "properties": {
      "@timestamp": { "type": "date" },
      "event_type": { "type": "keyword" },           // order, click, payment
      "user_id": { "type": "keyword" },
      "province": { "type": "keyword" },
      "city": { "type": "keyword" },
      "product_id": { "type": "keyword" },
      "amount": { "type": "scaled_float", "scaling_factor": 100 },  // 单位:分
      "response_time_ms": { "type": "long" },
      "tags": { "type": "keyword" }  // region:us, device:mobile
    }
  }
}

✅ 所有聚合字段使用 keyword 或数值类型。


四、写入性能优化

1. 批量写入(Bulk API)

  • 使用 bulk 接口,每批 1000~5000 条;
  • 避免单条写入。
POST /_bulk
{ "index": { "_index": "metrics-stream" } }
{ "@timestamp": "...", "event_type": "order", "amount": 10000 }
...

2. 调整刷新间隔

PUT /metrics-stream/_settings
{
  "refresh_interval": "5s"  // 平衡实时性与性能
}

可接受 5 秒延迟,避免频繁刷新。


3. 合理分片策略

  • 每天数据量预估:1 亿条 × 0.5KB ≈ 50GB
  • 主分片数:2~4(每 shard 1525GB)
  • 副本数:1(读多可增至 2)

五、聚合查询设计

1. 实时趋势图(每分钟聚合)

GET /metrics-stream/_search
{
  "size": 0,
  "query": {
    "range": {
      "@timestamp": {
        "gte": "now-1h",
        "lt": "now"
      }
    }
  },
  "aggs": {
    "trend": {
      "date_histogram": {
        "field": "@timestamp",
        "fixed_interval": "1m",
        "min_doc_count": 0
      },
      "aggs": {
        "total_amount": { "sum": { "field": "amount" } },
        "order_count": { "value_count": { "field": "event_type" } }
      }
    }
  }
}

min_doc_count: 0 确保时间轴连续。


2. 地域分布(Top N)

"aggs": {
  "by_province": {
    "terms": {
      "field": "province",
      "size": 10,
      "order": { "total_amount": "desc" }
    },
    "aggs": {
      "total_amount": { "sum": { "field": "amount" } }
    }
  }
}

3. 热销商品 Top 10

"aggs": {
  "top_products": {
    "terms": {
      "field": "product_id",
      "size": 10,
      "order": { "sales": "desc" }
    },
    "aggs": {
      "sales": { "sum": { "field": "amount" } }
    }
  }
}

六、性能优化策略

1. 预计算 + 物化视图(推荐)

对于高频聚合,使用 Transform 预计算:

PUT _transform/sales-summary
{
  "source": { "index": "metrics-stream" },
  "pivot": {
    "group_by": {
      "hour": { "date_histogram": { "field": "@timestamp", "fixed_interval": "1h" } },
      "province": { "terms": { "field": "province" } }
    },
    "aggregations": {
      "revenue": { "sum": { "field": "amount" } },
      "order_count": { "value_count": { "field": "event_type" } }
    }
  },
  "dest": { "index": "summary-hourly" },
  "frequency": "5m"
}

查询时直接查 summary-hourly,性能提升 10 倍以上。


2. 缓存高频查询结果

  • 使用 Redis 缓存最近 5 分钟的聚合结果;
  • TTL=60s,避免数据过旧;
  • 适用于“总订单量”、“实时在线用户”等指标。
{
  "key": "dashboard:total_orders:last_5m",
  "value": 12345,
  "timestamp": "2024-06-01T10:00:00Z"
}

3. 使用 composite 支持大屏下钻

"aggs": {
  "top_cities": {
    "composite": {
      "sources": [
        { "province": { "terms": { "field": "province" } } },
        { "city": { "terms": { "field": "city" } } }
      ],
      "size": 10
    }
  }
}

支持点击省份查看城市详情。


七、Kibana 大屏配置

1. 使用 Lens 可视化

  • 创建时间序列图、饼图、表格;
  • 设置自动刷新(5s/10s);
  • 使用 Dashboard 组合多个图表。

2. 开启“实时模式”

  • 在 Kibana Dashboard 中启用 Live Streaming
  • 设置刷新间隔(如 5s);
  • 支持“当前时间”动态更新。

八、监控与告警

1. 监控指标

指标说明
ingest_rate写入吞吐(docs/s)
query_latency聚合查询 P95 延迟
jvm.heap_used_percent内存压力
indexing_pressure写入阻塞
data_stream.backing_index.count滚动状态

2. 告警规则

  • 聚合延迟 > 3s
  • 数据延迟 > 10s(对比业务时间戳)
  • 集群状态 ≠ green

九、扩展建议

场景建议方案
超大规模数据使用 Hot-Warm-Cold 架构
跨集群聚合使用 Cross-Cluster Search
预测分析结合 ML Job 预测趋势
权限隔离使用 Kibana Spaces 按团队隔离
降级机制查询失败时返回缓存数据

十、总结:大屏聚合最佳实践 ✅

项目建议
数据建模所有聚合字段用 keyword
写入方式bulk + refresh_interval=5s
聚合查询使用 date_histogram + terms
高频聚合使用 Transform 预计算
实时性5~10s 可接受
缓存Redis 缓存关键指标
监控必须监控数据延迟与查询性能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值