SkyWalking 生产部署的关键环节 —— 存储与配置管理。
默认的 H2 存储仅用于测试,生产环境必须切换到 Elasticsearch,以支持高并发、高性能的链路查询和指标聚合。
下面,我为你提供一份 完整、清晰、可落地的指南,涵盖:
- ✅ 如何将 SkyWalking OAP 的存储从 H2 切换为 Elasticsearch
- ✅ 如何配置
application.yml连接 ES 集群 - ✅ 生产环境关键配置优化(采样率、数据过期、性能调优)
🧩 一、为什么不能用 H2?为什么要换 Elasticsearch?
| 对比项 | H2(默认) | Elasticsearch(生产推荐) |
|---|---|---|
| 性能 | 慢,不支持高并发查询 | 高性能,支持海量数据检索 |
| 可靠性 | 单机文件存储,易损坏 | 分布式、高可用、可扩展 |
| 功能 | 不支持日志、拓扑复杂时卡顿 | 支持 Logs、Metrics、Traces 全家桶 |
| 数据保留 | 手动管理 | 支持 TTL 自动过期 |
| 适用场景 | 本地测试、Demo | 生产环境 |
✅ 结论:H2 仅用于学习,生产必须用 Elasticsearch
🔁 二、切换存储:H2 → Elasticsearch
步骤 1:准备 Elasticsearch 集群
确保你有一个可用的 Elasticsearch 7.x 或 8.x 集群(SkyWalking 9.x 推荐 ES 7.17.3+)
# 示例:使用 Docker 启动单节点 ES(测试用)
docker run -d \
--name elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
docker.elastic.co/elasticsearch/elasticsearch:7.17.3
访问:http://localhost:9200 应返回 JSON 信息。
步骤 2:修改 OAP 配置文件 application.yml
路径:apache-skywalking-apm-bin/config/application.yml
修改前:默认使用 H2
storage:
selector: ${SW_STORAGE:h2}
h2:
driver: org.h2.jdbcx.JdbcDataSource
url: jdbc:h2:~/oap-db
userName: sa
修改后:切换为 Elasticsearch
storage:
selector: ${SW_STORAGE:elasticsearch} # 关键:切换为 elasticsearch
elasticsearch:
nameSpace: ${SW_NAMESPACE:skywalking} # 索引前缀,如 skywalking_trace_segment
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} # ES 集群地址
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:http} # 协议:http 或 https
user: ${SW_ES_USER:} # 如果启用了 x-pack 安全认证
password: ${SW_ES_PASSWORD:}
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:4} # 索引分片数
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # 副本数
# TLS / HTTPS 配置(可选)
# trustStorePath: ${SW_SW_STORAGE_ES_TLS_JKS_PATH:""}
# trustStorePass: ${SW_SW_STORAGE_ES_TLS_JKS_PASS:""}
# 自定义索引设置(可选)
# bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # 每批写入文档数
# flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # 刷新间隔(秒)
# 数据过期策略(关键!)
recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:90} # 链路数据保留天数(默认 90)
otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRICS_DATA_TTL:90} # 其他指标
monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRICS_DATA_TTL:180} # 月聚合指标
步骤 3:设置环境变量(推荐方式)
你也可以通过环境变量覆盖配置,便于容器化部署:
export SW_STORAGE=elasticsearch
export SW_NAMESPACE=prod-skywalking
export SW_STORAGE_ES_CLUSTER_NODES=es-node1:9200,es-node2:9200
export SW_STORAGE_ES_HTTP_PROTOCOL=http
export SW_STORAGE_ES_INDEX_SHARDS_NUMBER=5
export SW_STORAGE_ES_INDEX_REPLICAS_NUMBER=1
export SW_STORAGE_ES_RECORD_DATA_TTL=30 # 链路数据只保留 30 天
export SW_STORAGE_ES_OTHER_METRICS_DATA_TTL=45
✅ 推荐:在
docker-compose.yml或 Kubernetes 中使用环境变量配置。
步骤 4:启动 OAP Server
cd apache-skywalking-apm-bin
bin/oap.sh start
查看日志:
tail -f logs/skywalking-oap.log
✅ 成功标志:
[StartTimeBasedIndexPolicy] Index policy started. Data TTL: 30 days
[IndexController] Indices created: skywalking_trace_segment-20250405
表示已成功连接 ES 并创建索引。
⚙️ 三、基础配置优化(生产建议)
1. 📉 采样率控制(降低 Agent 开销)
在 agent/config/agent.config 中设置:
# 每3秒采集1个 trace(约 0.33 QPS),适合生产
agent.sample_n_per_3_secs=1
# 或关闭采样(调试用)
# agent.sample_n_per_3_secs=-1
✅ 生产建议:高 QPS 服务设为
1,低流量服务可设为-1(全量)
2. 🗑️ 数据过期时间(TTL)
在 application.yml 中配置:
elasticsearch:
recordDataTTL: 30 # 调用链数据保留 30 天
otherMetricsDataTTL: 45 # 指标数据保留 45 天
monthMetricsDataTTL: 180 # 月聚合数据保留 180 天
✅ 建议根据磁盘容量和合规要求调整。
3. 🧱 索引分片与副本(ES 性能调优)
indexShardsNumber: 5 # 根据数据量调整,单 shard 建议 < 50GB
indexReplicasNumber: 1 # 副本提高可用性
🔍 分片建议:
- 小集群:4~5
- 大集群:10~20(需评估 ES 节点数)
4. 🚀 批量写入优化(提升 OAP 写入性能)
bulkActions: 1000 # 每批写入 1000 条文档
flushInterval: 10 # 每 10 秒强制刷新
concurrentRequests: 2 # 并发写入请求
5. 🔐 安全配置(启用 HTTPS + 认证)
protocol: https
user: skywalking
password: mysecretpassword
trustStorePath: /path/to/truststore.jks
trustStorePass: changeit
适用于启用了 x-pack security 的 ES 集群。
📦 四、验证配置是否生效
1. 查看 ES 中的索引
curl http://localhost:9200/_cat/indices/skywalking*?v
应看到类似:
health status index uuid pri rep docs.count
green open skywalking_trace_segment-20250405 abc123 4 1 12000
green open skywalking_service_relation-202504 def456 4 1 300
2. 查看 SkyWalking UI
启动 UI 后访问:http://localhost:8080
- 能看到服务、拓扑、链路 → 说明 OAP 写入成功
- 查看日志无
ElasticsearchException错误
✅ 五、总结:存储切换 checklist
| 步骤 | 操作 |
|---|---|
| 1️⃣ 准备 ES 集群 | 确保网络可达,版本兼容(7.x / 8.x) |
2️⃣ 修改 application.yml | selector: elasticsearch + 配置集群地址 |
| 3️⃣ 设置 TTL | 根据业务需求配置数据保留时间 |
| 4️⃣ 调整分片 | 避免单 shard 过大 |
| 5️⃣ 启动 OAP | 检查日志是否成功连接 ES |
| 6️⃣ 验证数据 | UI 能看到服务和链路 |
🎁 附件:Docker Compose 示例片段
version: '3.8'
services:
oap:
image: apache/skywalking-oap-server:9.7.0
environment:
- SW_STORAGE=elasticsearch
- SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
- SW_STORAGE_ES_RECORD_DATA_TTL=30
- SW_STORAGE_ES_INDEX_SHARDS_NUMBER=5
depends_on:
- elasticsearch
ports:
- "12800:12800"
- "11800:11800"
783

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



