SkyWalking 高可用部署的基石 —— Storage 集群化。
🔥 核心观点:
OAP 可以无状态扩展,但真正的高可用和数据可靠性,取决于 Storage 层 —— 尤其是 Elasticsearch 集群的设计与运维。
下面,我为你系统梳理 SkyWalking 生产环境 Storage 集群(Elasticsearch)的完整部署与优化指南,涵盖架构设计、性能调优、数据安全、容灾备份等关键内容。
🏗️ SkyWalking 生产环境 Storage 集群部署指南
—— Elasticsearch 高可用集群实战
一、为什么生产环境必须使用 ES 集群?
| 单节点 ES | 集群化 ES |
|---|---|
| ❌ 单点故障,宕机即服务中断 | ✅ 多节点冗余,自动故障转移 |
| ❌ 数据无副本,磁盘损坏即丢失 | ✅ 多副本机制,保障数据安全 |
| ❌ 性能瓶颈,查询慢 | ✅ 分片 + 分布式查询,提升吞吐 |
| ❌ 无法水平扩展 | ✅ 支持动态扩容节点 |
| ❌ 不适合海量数据 | ✅ 支持 PB 级数据存储 |
✅ 结论:SkyWalking 的可靠性 = OAP 集群 × ES 集群
二、Elasticsearch 集群架构设计(推荐 3~5 节点)
+------------------+
| Load Balancer |
| (可选,用于 UI/OAP 查询) |
+--------+---------+
|
+--------------+--------------+
| |
+--------v--------+ +----------v----------+
| Master Node | | Master Node |
| (dedicated) | | (dedicated) |
+--------+--------+ +----------+----------+
| |
+--------v--------+ +----------v----------+
| Data Node |<------->| Data Node |
| (hot/warm) | | (hot/warm) |
+--------+--------+ +----------+----------+
| |
+--------v--------+ +----------v----------+
| Ingest Node | | Ingest Node |
| (可选,预处理) | | (可选,预处理) |
+-----------------+ +---------------------+
+------------------+
| Coordinating |
| Node (可选) |
+------------------+
🔧 节点角色分离(最佳实践)
| 节点类型 | 数量 | 职责 | 推荐配置 |
|---|---|---|---|
| Master-eligible | 3(奇数) | 集群管理、元数据协调 | 2C4G,SSD |
| Data Node | 3~n | 存储数据、执行查询 | 8C16G+,SSD,大磁盘 |
| Ingest Node | 0~2 | 数据预处理(如解析日志) | 4C8G |
| Coordinating Node | 可选 | 代理查询请求,减轻 Data 节点压力 | 4C8G |
✅ 建议:Master 与 Data 角色分离,避免管理操作影响数据性能。
三、关键配置优化(elasticsearch.yml)
1. 基础配置(所有节点)
# 集群名称(所有节点一致)
cluster.name: skywalking-prod
# 节点名称(唯一)
node.name: es-data-01
# 角色分配
node.roles: [ data, ingest ] # 或 master, data_hot, data_warm 等
# 网络
network.host: 0.0.0.0
http.port: 9200
# 发现配置(3节点示例)
discovery.seed_hosts: ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
cluster.initial_master_nodes: ["es-master-01", "es-master-02", "es-master-03"]
# 防止脑裂
discovery.zen.minimum_master_nodes: 2 # 对于3节点,设为 (n/2)+1
2. JVM 配置(jvm.options)
# 堆内存:不超过物理内存的 50%,且 ≤ 32GB
-Xms8g
-Xmx8g
# 使用 G1 GC
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
⚠️ 堆内存不要超过 32GB,否则 JVM 指针压缩失效,性能下降。
四、SkyWalking 侧存储配置优化
在 application.yml 中优化与 ES 的交互:
storage:
selector: elasticsearch
elasticsearch:
nameSpace: prod-skywalking
clusterNodes: http://es-data-01:9200,http://es-data-02:9200,http://es-data-03:9200
protocol: http
indexShardsNumber: 5 # 根据数据量调整,单 shard < 50GB
indexReplicasNumber: 1 # 副本数,生产建议 ≥1
bulkActions: 1000 # 每批写入文档数
flushInterval: 10 # 刷新间隔(秒)
concurrentRequests: 2 # 并发写入请求数
# 数据保留策略(关键!)
recordDataTTL: 30 # 调用链数据保留 30 天
otherMetricsDataTTL: 45 # 指标数据
monthMetricsDataTTL: 180 # 月聚合数据
五、分片(Shard)与副本(Replica)策略
| 策略 | 建议 |
|---|---|
| 单索引分片数 | 5~10(根据数据量) |
| 单 shard 大小 | 控制在 10~50GB 之间 |
| 副本数 | 生产环境设为 1 或 2 |
| 冷热架构 | 高频查询用 hot 节点(SSD),历史数据迁移到 warm 节点(HDD) |
📊 估算示例:
每天 1 亿条链路数据,每条约 1KB → 每天 100GB → 建议 5 个分片,每天一个索引。
六、数据可靠性保障
1. ✅ 副本机制(Replica)
- 设置
indexReplicasNumber: 1→ 每个分片有 1 个副本 - 单节点故障时,副本自动提升为主分片
2. ✅ 定期备份(Snapshot)
# 注册备份仓库
PUT _snapshot/skywalking_backup
{
"type": "fs",
"settings": {
"location": "/backups/es-snapshots"
}
}
# 创建快照
PUT _snapshot/skywalking_backup/snapshot-20250405
📁 存储位置:NFS、S3、HDFS
3. ✅ 监控集群健康
- 使用 Kibana 或 Prometheus + Grafana 监控:
- 集群状态(green/yellow/red)
- JVM 内存使用
- 磁盘使用率
- 查询延迟
七、性能优化建议
| 优化项 | 建议 |
|---|---|
| 🚫 关闭不必要的字段 | "_all", doc_values: false(非聚合字段) |
| 🔍 合理使用 keyword vs text | 精确匹配用 keyword,全文检索用 text |
| ⏱️ 索引滚动 | 按天创建索引(如 skywalking_trace_segment-20250405) |
| 🧹 定期清理 | 使用 ILM(Index Lifecycle Management)自动删除旧索引 |
| 📈 写入优化 | 批量写入、避免小批量请求 |
八、验证集群是否正常
1. 检查集群健康
curl http://localhost:9200/_cluster/health?pretty
期望输出:
{
"cluster_name" : "skywalking-prod",
"status" : "green",
"number_of_nodes" : 5,
"number_of_data_nodes" : 3
}
2. 检查索引状态
curl http://localhost:9200/_cat/indices/skywalking*?v
确保:
- 索引存在
- 状态为
green - 分片分布均匀
3. SkyWalking UI 验证
- 能看到服务、拓扑、链路
- 查询无超时或错误
✅ 总结:ES 集群部署 checklist
| 步骤 | 操作 |
|---|---|
| 1️⃣ 规划集群规模 | 至少 3 节点,角色分离 |
2️⃣ 配置 elasticsearch.yml | 网络、发现、角色 |
| 3️⃣ JVM 调优 | 堆内存 ≤ 32GB,使用 G1 GC |
| 4️⃣ 配置副本 | indexReplicasNumber: 1 |
| 5️⃣ 设置 TTL | 避免磁盘爆满 |
| 6️⃣ 启用备份 | Snapshot 到 S3/NFS |
| 7️⃣ 监控集群 | Prometheus + Grafana |
| 8️⃣ 压测验证 | 模拟高并发写入 |
🎁 附件:Docker Compose 示例(3节点 ES)
version: '3.8'
services:
es-master-01:
image: elasticsearch:7.17.3
environment:
- node.name=es-master-01
- cluster.name=skywalking-es
- node.roles=master
- discovery.seed_hosts=es-master-02,es-master-03
- cluster.initial_master_nodes=es-master-01,es-master-02,es-master-03
ports:
- "9201:9200"
es-master-02: ...
es-master-03: ...
es-data-01:
image: elasticsearch:7.17.3
environment:
- node.name=es-data-01
- cluster.name=skywalking-es
- node.roles=data
- discovery.seed_hosts=es-master-01,es-master-02,es-master-03
volumes:
- es-data01:/usr/share/elasticsearch/data
volumes:
es-data01:
611

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



