1. 为什么选择Docker Compose部署SkyWalking+BanyanDB

全链路监控已经成为现代分布式系统不可或缺的基础设施,而SkyWalking作为Apache顶级开源项目,凭借其强大的分布式追踪、服务网格观测和指标分析能力,在众多监控工具中脱颖而出。但传统部署方式需要分别配置OAP服务、UI界面和存储组件,步骤繁琐且容易出错。这正是Docker Compose的价值所在——它让复杂系统的部署变得像搭积木一样简单。

我去年在金融行业落地监控系统时,曾手动部署过SkyWalking 8.x版本,光是处理各组件间的网络通信就花了整整两天。后来改用Docker Compose后,同样的工作只需要15分钟。最新版的SkyWalking 10.x与BanyanDB的集成更加紧密,通过容器化部署可以充分发挥其云原生优势。BanyanDB作为专为观测数据设计的时序数据库,相比Elasticsearch等通用存储,在存储压缩率和查询性能上都有显著提升。

2. 环境准备与前置检查

2.1 硬件资源规划

虽然容器化部署对资源需求有所降低,但合理的资源配置仍然重要。根据实测经验:

  • 开发环境:至少2核CPU/4GB内存/50GB存储
  • 生产环境:建议4核CPU/8GB内存/200GB存储(数据保留7天)

特别要注意的是文件描述符限制,这是新手最容易踩的坑。建议执行以下命令永久修改系统限制:

echo "* soft nofile 102400" >> /etc/security/limits.conf
echo "* hard nofile 102400" >> /etc/security/limits.conf

2.2 Docker环境配置

推荐使用Docker 20.10+版本,并确保已安装Docker Compose插件(V2版本)。可以通过以下命令验证:

docker compose version

如果遇到镜像拉取慢的问题,可以配置国内镜像源。这里分享一个经过验证的配置方案:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.nju.edu.cn",
    "https://mirror.baidubce.com"
  ]
}
EOF
sudo systemctl restart docker

3. 编写Docker Compose编排文件

3.1 核心服务定义

创建docker-compose.yml文件,这是整个部署的核心。下面这个配置是我在三个不同项目中验证过的稳定版本:

version: '3.8'
services:
  banyandb:
    image: apache/skywalking-banyandb:latest
    container_name: banyandb
    ports:
      - "17913:17913"
    command: standalone --stream-root-path /tmp/stream-data --measure-root-path /tmp/measure-data
    ulimits:
      nofile: 102400

  oap:
    image: apache/skywalking-oap-server:latest
    container_name: oap
    depends_on:
      - banyandb
    environment:
      SW_STORAGE: banyandb
      SW_STORAGE_BANYANDB_TARGETS: banyandb:17912
      JAVA_OPTS: "-Xms2g -Xmx2g"
    volumes:
      - ./oap/config:/skywalking/config
    ports:
      - "11800:11800"
      - "12800:12800"
    ulimits:
      nofile: 102400

  ui:
    image: apache/skywalking-ui:latest
    container_name: ui
    depends_on:
      - oap
    environment:
      SW_OAP_ADDRESS: http://oap:12800
    ports:
      - "8080:8080"

3.2 关键配置解析

  • 网络拓扑:使用Docker默认的bridge网络,各服务通过服务名自动DNS解析
  • 存储配置:BanyanDB的standalone模式已满足大多数场景,生产环境可考虑集群部署
  • 内存分配:OAP服务默认1GB内存可能不足,建议调整为2GB(通过JAVA_OPTS)
  • 配置文件:将OAP的application.yml挂载到宿主机方便修改

4. 启动与验证

4.1 一键启动所有服务

执行以下命令启动整个监控平台:

mkdir -p oap/config
docker compose up -d

首次启动时会自动拉取镜像,整个过程约3-5分钟(取决于网络速度)。可以通过以下命令观察启动日志:

docker compose logs -f oap

4.2 服务健康检查

等待1-2分钟后,逐个验证服务状态:

# 检查BanyanDB
curl http://localhost:17913/healthz

# 检查OAP服务
curl http://localhost:12800/v3/management/healthCheck

# 检查UI服务
curl -I http://localhost:8080

4.3 界面访问与配置

  • SkyWalking UI:浏览器访问http://服务器IP:8080
  • BanyanDB管理界面:访问http://服务器IP:17913/debug/pprof

在UI界面右上角的"齿轮"图标中,建议修改以下默认配置:

  1. 时区设置为Asia/Shanghai
  2. 调整数据刷新间隔为15秒
  3. 开启自动拓扑图布局

5. 应用接入实战

5.1 Java应用接入

以Spring Boot应用为例,下载最新Java Agent:

wget https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz
tar -zxvf apache-skywalking-java-agent-9.0.0.tgz

启动应用时添加JVM参数:

java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=your_service_name \
-Dskywalking.collector.backend_service=localhost:11800 \
-jar your_application.jar

5.2 Kubernetes环境接入

对于K8s部署的应用,可以通过initContainer方式挂载Agent:

initContainers:
- name: skywalking-agent
  image: busybox
  command: ['sh', '-c', 'wget -O /skywalking/agent.tar.gz https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz && tar -zxvf /skywalking/agent.tar.gz -C /skywalking/']
  volumeMounts:
    - mountPath: /skywalking
      name: skywalking-agent

6. 常见问题排查指南

6.1 容器启动失败排查

如果OAP服务启动失败,最常见的原因是配置文件问题。可以进入容器检查配置:

docker exec -it oap cat /skywalking/config/application.yml

6.2 数据存储异常处理

当发现监控数据没有持久化时,检查BanyanDB日志:

docker compose logs banyandb | grep -i error

临时解决方案是重启BanyanDB容器,长期解决方案应考虑挂载持久化卷:

volumes:
  - banyandb-data:/tmp

volumes:
  banyandb-data:

6.3 性能调优建议

对于高负载环境,建议调整以下参数:

  • OAP的JVM内存增加到4GB
  • 修改BanyanDB的缓存配置
  • 增加OAP实例数量实现水平扩展

我在生产环境中发现,当TPS超过5000时,单节点OAP会出现处理延迟。这时可以通过修改docker-compose.yml,添加多个OAP实例:

  oap1:
    <<: *oap-config
    container_name: oap1
    
  oap2:
    <<: *oap-config
    container_name: oap2

7. 进阶配置与优化

7.1 自定义监控指标

在application.yml中添加自定义指标收集规则:

metrics:
  default:
    - name: custom_metric
      exp: "sum(instance_jvm_memory_max{area='heap'}) by (service)"

7.2 告警规则配置

创建alarm-settings.yml文件并挂载到OAP容器:

rules:
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 2
    silence-period: 5
    message: 服务 {name} 响应时间超过1秒

7.3 数据保留策略

BanyanDB默认保留7天数据,如需修改需要调整启动参数:

command: standalone --retention-policy "7d" --stream-root-path /data/stream --measure-root-path /data/measure

实际部署中遇到过磁盘空间不足的情况,后来我们通过定期清理旧数据解决了这个问题。建议生产环境至少预留200GB存储空间,或者考虑使用分布式存储方案。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐