前言
最近在学习微服务可观测性,选用 Apache SkyWalking 做分布式链路追踪。在部署 SkyWalking10.2.0 时踩了大量新版本的坑:
- SkyWalking10.2 彻底移除内置 H2、内存 memory 存储,不再支持单机无数据库模式;
- BanyanDB 镜像国内拉取困难;
- OAP 环境变量配置名称变更,旧文档
SW_ES_ADDRESS直接报错; - Docker 容器网络问题,OAP 尝试连接 127.0.0.1:9200 拒绝;
- Elasticsearch 启动必须修改宿主机内核参数
vm.max_map_count。
本文采用 SkyWalking10.2.0 + Elasticsearch8.11.0 组合,使用 docker-compose 编排,完整记录部署 + 排坑全过程。
环境信息
- 操作系统:Ubuntu 22.04(宝塔面板)
- Docker 版本:24+
- Docker Compose:v2
- 服务器:106.34.17.239
- 端口规划 | 端口 | 服务 | 说明 | | ---- | ---- | ---- | |9200|Elasticsearch|ES REST 接口 | |11800|SkyWalking OAP GRPC|Agent 上报链路数据端口 | |12800|SkyWalking OAP HTTP|UI 面板后端接口 | |8080|SkyWalking UI|Web 可视化面板 |
一、前置准备
1.1 安装 Docker & Docker Compose
# 更新源
apt update && apt upgrade -y
# 安装docker(宝塔一般自带docker,没有再执行)
apt install docker.io -y
# 启动并开机自启
systemctl start docker
systemctl enable docker
如果你用宝塔面板,直接在【软件商店】安装 Docker。
1.2 Elasticsearch 硬性内核参数(必做,否则 ES 无法启动)
ES 要求vm.max_map_count=262144
# 临时生效,重启服务器失效
sysctl -w vm.max_map_count=262144
# 永久生效
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p
1.3 防火墙放行端口(宝塔重点!)
宝塔安全 -> 防火墙,放行端口:9200,11800,12800,8080
二、编写 docker-compose.yml
新建目录存放配置文件
mkdir -p /opt/skywalking
cd /opt/skywalking
vi docker-compose.yml
复制下面完整配置粘贴进去
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
container_name: sky-es
restart: always
environment:
- TZ=Asia/Shanghai
- discovery.type=single-node
- xpack.security.enabled=false
- xpack.security.enrollment.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
volumes:
- es-data:/usr/share/elasticsearch/data
ulimits:
nofile:
soft: 65535
hard: 65535
oap:
image: apache/skywalking-oap-server:10.2.0
container_name: sky-oap
restart: always
depends_on:
- elasticsearch
ports:
- "11800:11800"
- "12800:12800"
environment:
- TZ=Asia/Shanghai
- SW_STORAGE=elasticsearch
# SkyWalking10.x 正确ES集群节点配置!旧文档SW_ES_ADDRESS已经废弃!
- SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
- JAVA_OPTS=-Xms512m -Xmx1024m
ui:
image: apache/skywalking-ui:10.2.0
container_name: sky-ui
restart: always
depends_on:
- oap
ports:
- "8080:8080"
environment:
- TZ=Asia/Shanghai
- SW_OAP_ADDRESS=http://oap:12800
volumes:
es-data:
⚠️ 踩坑重点:
depends_on仅控制容器启动先后顺序 ,不会等待 ES 服务就绪。ES 启动很慢,OAP 会持续重试连接,属于正常现象;- 容器内部网络,OAP 访问 ES 不能写
127.0.0.1,必须使用 compose 服务名elasticsearch:9200;- 环境变量:SW_STORAGE_ES_CLUSTER_NODES ,网上很多旧博客写的
SW_ES_ADDRESS在 10.2 版本无效,会报连接 127.0.0.1:9200 拒绝。
三、启动整套 SkyWalking 集群
# 进入目录
cd /opt/skywalking
# 销毁旧容器(修改yml后每次建议执行)
docker-compose down
# 后台拉起所有容器
docker-compose up -d
执行完成,可以看到三个容器:sky-es、sky-oap、sky-ui 状态 Started。
四、验证服务状态
4.1 验证 Elasticsearch 是否正常
curl http://127.0.0.1:9200
返回下面 json,代表 ES 启动成功:
{
"name" : "473adec58f7b",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "drYnIPU0SOG8HCkE5UnVzA",
"version" : {
"number" : "8.11.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "d9ec3fa628c7b0ba3d25692e277ba26814820b20",
"build_date" : "2023-11-04T10:04:57.184859352Z",
"build_snapshot" : false,
"lucene_version" : "9.8.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
4.2 查看 OAP 日志,等待初始化成功
ES 启动耗时较长,需要等待 2~3 分钟,再查看 OAP 日志
docker logs sky-oap -f
✅ 成功标志日志:OAP started successfully 出现这句话代表 OAP 连接 ES 成功,服务就绪。
前期看到
Connection refused报错不用慌,只是 OAP 在重试等待 ES 启动,等 ES 完全就绪会自动连上。
4.3 验证 OAP 容器内连通 ES
进入 oap 容器内部测试网络连通性
docker exec -it sky-oap curl http://elasticsearch:9200
返回 ES json,代表 docker compose 内部网络互通,配置没问题。
五、访问 SkyWalking UI 面板
浏览器访问地址:
http://106.34.17.239:8080
成功进入 SkyWalking 的 WebUI 市场页面。
- 【市场】:各类监控仪表盘插件安装,SpringBoot 微服务选择 常规服务
- 【服务】:查看接入的微服务列表、接口调用 Trace 链路(最核心页面)
- 【拓扑图】:微服务之间调用依赖关系图
- 【追踪】:根据 TraceId 查询单次请求完整调用链路,定位慢接口、异常报错
六、SpringBoot 项目 Agent 接入(后续使用)
下载 SkyWalking Agent 包,在 SpringBoot 项目 JVM 启动参数添加 agent 配置
-javaagent:/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=demo-service
-Dskywalking.collector.backend_service=106.34.17.239:11800
demo-service:自定义你的服务名称,微服务每个服务名称区分开106.34.17.239:11800:OAP GRPC 上报地址
启动 SpringBoot,等待几十秒,面板【服务】中就会识别到应用,开始采集链路、耗时、异常指标。
七、踩坑总结(重点,这是本文核心价值)
坑 1:SkyWalking10.2 版本不再支持 H2、memory 内置存储
旧版本 SkyWalking10.1 及以下支持 SW_STORAGE=h2,单机直接跑。10.2 版本移除内置存储,必须外接 BanyanDB 或者 Elasticsearch。BanyanDB 国内镜像拉取困难,因此选择 ES 方案。
坑 2:OAP 日志:Connection refused: localhost/127.0.0.1:9200
原因:网上旧教程使用环境变量SW_ES_ADDRESS,10.x 版本已经废弃。新版必须用:SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
另外容器内部localhost指向容器自身,不能写 127.0.0.1 访问 ES,要用 compose 服务名。
坑 3:Elasticsearch 启动失败,max virtual memory areas vm.max_map_count 65530 is too low
解决:执行前文内核参数命令sysctl -w vm.max_map_count=262144
坑 4:容器全部 Started,但是浏览器访问 8080 打不开面板
排查:宝塔 / 服务器安全组防火墙没有放行 8080 端口。
坑 5:OAP 一直报连接 ES 拒绝
depends_on 只保证容器启动顺序,ES 初始化需要时间,耐心等待 2~3 分钟,OAP 会自动重试。服务器内存建议至少 3G,内存过低 ES 会 OOM 崩溃。
八、可选:服务器内存不足降级方案(备选)
如果服务器内存较小,ES+OAP 非常吃内存,可以降级 SkyWalking 到 10.1 版本,支持内置 H2,不需要额外部署 ES。
version: '3.8'
services:
oap:
image: apache/skywalking-oap-server:10.1.0
container_name: sky-oap
restart: always
ports:
- "11800:11800"
- "12800:12800"
environment:
- TZ=Asia/Shanghai
- SW_STORAGE=h2
- JAVA_OPTS=-Xms256m -Xmx512m
ui:
image: apache/skywalking-ui:10.1.0
container_name: sky-ui
restart: always
depends_on:
- oap
ports:
- "8080:8080"
environment:
- TZ=Asia/Shanghai
- SW_OAP_ADDRESS=http://oap:12800
volumes:
oap-data:
结尾
SkyWalking 是微服务分布式追踪优秀开源 APM 工具,新版本改动较大,网上大量博客是旧版本配置,直接复制很容易踩坑。本文完整记录 SkyWalking10.2+ES 部署和排错流程。
后续文章预告:SpringBoot 项目接入 SkyWalking Agent,实现接口链路追踪、慢请求告警、SQL 监控。