三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

SkyWalking与Elasticsearch生产级部署与优化指南

SkyWalking与Elasticsearch生产级部署与优化指南

1. SkyWalking与Elasticsearch生产级部署概述

SkyWalking作为分布式系统的APM(应用性能监控)工具,在生产环境中需要可靠的后端存储来支撑海量监控数据的持久化。Elasticsearch凭借其优秀的全文检索能力和水平扩展特性,成为SkyWalking官方推荐的后端存储方案之一。我在多个微服务项目中采用这种组合方案,实测单节点ES集群可轻松支撑日均千万级指标的存储查询需求。

这种架构的核心优势在于:

  • Elasticsearch的倒排索引结构特别适合trace数据的多维查询
  • 原生支持的水平扩展能力匹配监控数据量增长需求
  • 与SkyWalking的数据模型高度契合(metrics/traces/logs)
  • 相比HBase方案更易维护且社区支持完善

重要提示:生产环境务必部署ES集群而非单节点,我们曾因单节点故障导致三天监控数据丢失。建议至少3个主节点+2个数据节点的配置起步。

2. 环境准备与组件版本匹配

2.1 版本兼容性矩阵

根据官方文档和实际踩坑经验,推荐以下版本组合:

SkyWalking版本Elasticsearch版本关键特性支持
8.4.0+7.10.x索引生命周期管理
8.0.0-8.3.07.6.x-7.9.x安全认证支持
7.0.0-7.1.06.8.x基础功能支持

实测发现ES 7.10+版本在写入吞吐量上比6.x系列提升约40%,建议新部署直接采用7.x系列。

2.2 硬件资源配置建议

对于日均百万级span的生产环境:

  • 数据节点:16核CPU/32GB内存/2TB SSD ×3
  • 主节点:4核CPU/8GB内存/100GB SSD ×3
  • JVM堆内存设置不超过物理内存的50%
  • 必须配置SSD存储,HDD会导致查询延迟飙升

这是我的一个电商项目实际配置示例:

# elasticsearch.yml cluster.name: skywalking-prod node.name: es-data-1 node.roles: [ data ] path.data: /data/elasticsearch bootstrap.memory_lock: true network.host: 192.168.1.101 discovery.seed_hosts: ["es-master-1:9300", "es-master-2:9300"] cluster.initial_master_nodes: ["es-master-1", "es-master-2"]

3. Elasticsearch集群部署实战

3.1 系统调优前置工作

在安装ES前必须完成的操作:

  1. 内核参数调整
# /etc/sysctl.conf vm.max_map_count=262144 fs.file-max=655360 vm.swappiness=1
  1. 资源限制解除
# /etc/security/limits.conf elasticsearch soft nofile 65535 elasticsearch hard nofile 65535 elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited
  1. 磁盘IO优化
# 调度器改为deadline echo deadline > /sys/block/sda/queue/scheduler # 预读缓冲区调整为16 blockdev --setra 16 /dev/sda

3.2 集群化部署步骤

  1. 安装Java环境
# 使用JDK11(ES7.x兼容性最佳) yum install -y java-11-openjdk export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
  1. 配置节点角色
# master节点配置示例 node.roles: [ master, remote_cluster_client ] cluster.remote.connect: true # data节点配置示例 node.roles: [ data, ingest ]
  1. 关键安全配置
xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.authc.api_key.enabled: true

4. SkyWalking与ES集成配置

4.1 存储模块配置详解

修改config/application.yml

storage: selector: ${SW_STORAGE:elasticsearch} elasticsearch: nameSpace: ${SW_NAMESPACE:""} clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"} trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""} trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""} dayStep: ${SW_STORAGE_DAY_STEP:1} # 索引滚动周期 indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:3} # 分片数 indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # 副本数 superDatasetIndexShardsFactor: 5 # 超大数据集分片因子 user: ${SW_ES_USER:""} password: ${SW_ES_PASSWORD:""} secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""}

4.2 索引模板优化策略

通过ES的Index Template优化存储结构:

  1. 调整字段类型映射
PUT _template/sw_template { "index_patterns": ["sw_*"], "settings": { "number_of_shards": 3, "number_of_replicas": 1, "refresh_interval": "30s" }, "mappings": { "dynamic": false, "properties": { "trace_id": { "type": "keyword" }, "endpoint_name": { "type": "text", "fields": { "keyword": { "type": "keyword" } } }, "latency": { "type": "integer" }, "error": { "type": "boolean" } } } }
  1. 冷热数据分离
PUT _ilm/policy/sw_policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_size": "50GB" } } }, "warm": { "min_age": "7d", "actions": { "allocate": { "require": { "data": "warm" } } } } } } }

5. 性能调优与监控

5.1 JVM参数优化

ES节点的jvm.options关键配置:

-Xms16g -Xmx16g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30

5.2 写入性能优化

  1. 批量写入配置
# config/oap_buffer.yml buffer: size: 10000 # 内存缓冲区记录数 channelSize: 5 # 通道数量 bufferSize: 500 # 批量提交记录数
  1. 线程池调整
# config/application.yml receiver-sharing-server: jetty: acceptors: 2 selectors: 4 workers: 16

5.3 监控指标采集

通过Prometheus监控ES集群健康状态:

# prometheus.yml scrape_configs: - job_name: 'elasticsearch' metrics_path: '/_prometheus/metrics' static_configs: - targets: ['es-node1:9200', 'es-node2:9200']

关键监控指标阈值:

  • JVM堆内存使用率 > 70% 告警
  • GC时间 > 1s/次 告警
  • 磁盘使用率 > 85% 告警
  • 索引延迟 > 5s 告警

6. 常见问题排查手册

6.1 写入失败问题

现象:OAP日志出现BulkProcessor add failure

排查步骤

  1. 检查ES集群状态:GET _cluster/health
  2. 查看磁盘空间:df -h
  3. 检查索引是否只读:GET _settings
  4. 查看线程池状态:GET _nodes/stats/thread_pool

解决方案

# 临时解除索引只读状态 PUT _all/_settings { "index.blocks.read_only_allow_delete": null }

6.2 查询超时问题

现象:UI界面加载trace超时

优化方案

  1. 增加查询超时时间:
storage: elasticsearch: queryTimeout: 60
  1. 添加查询缓存:
core: selector: ${SW_CORE:default} default: traceQuery: cacheEnabled: true cacheSize: 10000 cacheExpire: 60

6.3 索引滚动异常

现象:每日新索引未自动创建

处理流程

  1. 检查索引模板是否存在:GET _template/sw_*
  2. 验证ILM策略状态:GET _ilm/policy/sw_policy
  3. 手动滚动索引:POST sw_index/_rollover

7. 生产环境维护要点

7.1 定期维护任务

  1. 索引清理(每日执行):
# 保留30天数据 curl -X DELETE "localhost:9200/sw_*?pretty" -H 'Content-Type: application/json' -d' { "query": { "range": { "@timestamp": { "lt": "now-30d/d" } } } }'
  1. 段合并优化(每周执行):
POST sw_*/_forcemerge?max_num_segments=1

7.2 备份策略

使用ES快照功能实现数据备份:

PUT _snapshot/sw_backup { "type": "fs", "settings": { "location": "/mnt/backups/elasticsearch" } } PUT _snapshot/sw_backup/daily_$(date +%Y%m%d) { "indices": "sw_*", "ignore_unavailable": true }

7.3 升级注意事项

  1. 先升级ES集群,再升级SkyWalking
  2. 采用滚动升级方式,确保服务不中断
  3. 升级前必须备份所有索引
  4. 验证版本兼容性矩阵

我在实际运维中发现,ES集群的稳定性直接影响SkyWalking的可用性。建议部署独立的ES集群专用于APM数据存储,避免与业务搜索服务混用资源。对于超大规模部署(日均span超过1亿),可以考虑采用Elasticsearch的CCR(跨集群复制)功能实现多活架构。

← 返回列表