SkyWalking OAP 集群化与高可用部署指南
本文详细介绍了SkyWalking OAP集群的高可用部署方案。主要内容包括: 必要性分析:单节点OAP存在宕机、性能瓶颈等风险,集群化可解决这些问题 架构设计:采用无状态OAP节点+负载均衡+共享存储(ES)的方案 部署步骤: 搭建Elasticsearch集群作为共享存储 部署多个OAP节点 配置Nginx负载均衡器 修改Agent配置指向负载均衡地址 高可用保障机制和最佳实践建议 验证方法和
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
更多推荐
所有评论(0)