SkyWalking 生产部署的高阶阶段 —— 集群化与高可用部署

在生产环境中,单节点 OAP 是不可接受的,一旦宕机,监控数据丢失,告警失效。因此,必须部署 OAP 集群 + 负载均衡 + 共享存储,实现真正的高可用。

下面,我为你提供一份 完整、清晰、可落地的 OAP 集群部署指南,涵盖:

  • ✅ OAP 集群核心原理
  • ✅ 多节点部署架构
  • ✅ 负载均衡配置(Nginx)
  • ✅ 数据一致性保障
  • ✅ 生产环境最佳实践

🏗️ SkyWalking OAP 集群化与高可用部署指南


一、为什么需要 OAP 集群?

问题 单节点风险 集群解决方案
❌ 宕机 监控中断,数据丢失 多节点冗余,故障转移
❌ 性能瓶颈 高并发写入时 OAP 延迟 负载分担,提升吞吐
❌ 升级维护 停机升级影响监控 滚动更新,无感切换

✅ 目标:7×24 小时稳定运行,不成为系统瓶颈


二、OAP 集群架构图

                     +------------------+
                     |   Load Balancer  |
                     |   (Nginx / VIP)  |
                     +--------+---------+
                              |
               +--------------+--------------+
               |                             |
        +------v-------+           +---------v----------+
        |   OAP Node 1   |           |   OAP Node 2       |
        | (Stateless)    |           | (Stateless)        |
        +------+---------+           +---------+----------+
               |                             |
               +--------------+--------------+
                              |
                     +--------v---------+
                     |  Shared Storage  |
                     | (Elasticsearch)  |
                     +------------------+
🔍 架构说明:
组件 说明
OAP Node 无状态服务,可水平扩展,每个节点功能相同
Load Balancer 接收 Agent 上报请求,分发到后端 OAP 节点
Shared Storage 所有 OAP 节点共享同一个 ES 集群,保证数据一致
Agent 配置指向 LB 地址,无需感知后端节点

✅ 关键设计:OAP 是无状态的,所有状态(数据)都存储在外部(如 ES),因此可轻松扩展。


三、部署步骤

步骤 1:准备共享存储(Elasticsearch 集群)

确保你有一个 高可用的 Elasticsearch 集群(至少 3 节点),例如:

# docker-compose-es.yml
version: '3.8'
services:
  es-node1:
    image: elasticsearch:7.17.3
    environment:
      - node.name=es-node1
      - cluster.name=skywalking-es
      - discovery.seed_hosts=es-node2,es-node3
      - cluster.initial_master_nodes=es-node1,es-node2,es-node3
    ports:
      - "9200:9200"
  es-node2: ...
  es-node3: ...

步骤 2:部署多个 OAP 节点

你可以通过 Docker、Kubernetes 或物理机部署多个 OAP 实例,所有节点使用相同的配置

示例:application.yml(所有节点相同)
cluster:
  selector: ${SW_CLUSTER:standalone}
  # 如果使用 ZooKeeper 或 Etcd 做集群协调(可选)
  # zookeeper:
  #   period: 3000
  #   nameSpace: /skywalking
  #   hostPort: localhost:2181

storage:
  selector: elasticsearch
  elasticsearch:
    nameSpace: prod-skywalking
    clusterNodes: http://es-node1:9200,http://es-node2:9200,http://es-node3:9200
    protocol: http
    indexShardsNumber: 5
    indexReplicasNumber: 1
    recordDataTTL: 30

✅ 所有 OAP 节点配置完全一致,指向同一个 ES 集群。


步骤 3:部署负载均衡器(Nginx)

Nginx 用于代理 Agent 的 gRPC 请求(端口 11800)和 HTTP 请求(12800)。

nginx.conf 配置示例:
worker_processes auto;

events {
    worker_connections 1024;
}

stream {
    upstream oap_backend {
        # 负载均衡策略:轮询(默认),也可用 least_conn
        server 192.168.1.10:11800 max_fails=3 fail_timeout=30s;
        server 192.168.1.11:11800 max_fails=3 fail_timeout=30s;
        server 192.168.1.12:11800 max_fails=3 fail_timeout=30s;
    }

    # 代理 gRPC(Agent 上报数据)
    server {
        listen 11800 so_keepalive=on;
        proxy_pass oap_backend;
        proxy_timeout 30s;
        proxy_responses 1;  # 启用健康检查
    }

    # 代理 HTTP(UI 查询)
    server {
        listen 12800 so_keepalive=on;
        proxy_pass oap_backend;
    }
}

✅ 启动 Nginx:

nginx -c /path/to/nginx.conf

步骤 4:配置 Agent 指向 LB

所有 Agent 的 collector.backend_service 指向 Nginx 的地址

java \
  -javaagent:/path/to/skywalking-agent.jar \
  -DSW_AGENT_NAME=order-service \
  -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=nginx-lb:11800 \
  -jar order-service.jar

✅ Agent 只需知道 LB 地址,无需关心后端有几个 OAP 节点。


四、高可用保障机制

机制 说明
无状态 OAP 所有状态在 ES,节点可随时增删
LB 健康检查 Nginx 自动剔除故障节点
ES 高可用 数据多副本,防止单点故障
滚动更新 逐个重启 OAP 节点,不影响服务
监控 OAP 自身 用 Prometheus + Grafana 监控 OAP 的 CPU、内存、GC

五、生产环境最佳实践

项目 建议
🖥️ OAP 节点数量 一般 2~4 个,根据吞吐量调整
📦 资源分配 每个 OAP 至少 4C8G,堆内存 -Xmx4g
🔄 JVM 调优 使用 G1 GC,避免 Full GC 频繁
🧩 配置管理 使用 ConfigMap(K8s)或配置中心统一管理
📊 容量规划 预估每日链路数据量,规划 ES 存储
🔐 安全通信 Agent → LB → OAP 启用 TLS(可选)

六、验证高可用性

1. 模拟节点宕机
  • 停止一个 OAP 节点
  • 观察 Nginx 日志:是否自动剔除
  • 检查 Agent 是否继续上报成功
2. 查看数据一致性
  • 在 UI 中查看服务、链路
  • 确保数据完整,无丢失
3. 性能压测
  • 使用 skywalking-load-test 工具模拟高并发上报
  • 观察 OAP 集群负载是否均衡

✅ 总结:OAP 集群部署口诀

“一共享(Storage)、二无状态(OAP)、三负载(LB)、四监控”

只要记住:

  • OAP 是无状态的
  • 数据存在 ES
  • Agent 走 LB
  • 节点可扩展

你就能轻松构建一个高可用、高性能的 SkyWalking 监控平台


🎁 附件:Kubernetes 部署片段(YAML)

# deployment-oap.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-oap
spec:
  replicas: 3
  selector:
    matchLabels:
      app: skywalking-oap
  template:
    metadata:
      labels:
        app: skywalking-oap
    spec:
      containers:
      - name: oap
        image: apache/skywalking-oap-server:9.7.0
        env:
        - name: SW_STORAGE
          value: elasticsearch
        - name: SW_STORAGE_ES_CLUSTER_NODES
          value: es-cluster:9200
        ports:
        - containerPort: 11800
        - containerPort: 12800
---
# service-oap.yaml
apiVersion: v1
kind: Service
metadata:
  name: skywalking-oap
spec:
  type: LoadBalancer
  ports:
    - port: 11800
      targetPort: 11800
      name: grpc
    - port: 12800
      targetPort: 12800
      name: http
  selector:
    app: skywalking-oap
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐