在实时监控、运营大屏、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 缓存关键指标 |
| 监控 | 必须监控数据延迟与查询性能 |
4863

被折叠的 条评论
为什么被折叠?



