Skywalking的存储配置与调优
阅读原文时间:2023年07月10日阅读:3

https://blog.csdn.net/smooth00/article/details/96479544

作为一款APM和全链路监控平台,Skywalking算是挺出色的。Skywalking是APM监控平台的后起之秀,大有超越其他开源APM监控平台的趋势。它通过探针自动收集所需的指标,并进行分布式追踪。通过这些调用链路以及指标,Skywalking APM会感知应用间关系和服务间关系,并进行相应的指标统计。

目前Skywalking支持h2、mysql、ElasticSearch作为数据存储,我就说一下,这三个种库的优缺点和使用要求:

ElasticSearch不是自带的,需要安装,考虑到轻量级,我选用的是elasticsearch-6.2.4,原因是包小免安装,解压完也才30多M,而且目前最新版本的Skywalking 6.2.0是能够支持该版本的ElasticSearch。

Skywalking启用ES,只需要配置文件设置如下:

storage:
elasticsearch:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:}
user: ${SW_ES_USER:""}
password: ${SW_ES_PASSWORD:""}
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:}
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:}
# Those data TTL settings will override the same settings in core module.
recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:} # Unit is day
otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:} # Unit is day
monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:} # Unit is month
bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:} # Execute the bulk every requests
bulkSize: ${SW_STORAGE_ES_BULK_SIZE:} # flush the bulk every 20mb
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:} # flush the bulk every seconds whatever the number of requests
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:} # the number of concurrent requests
metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:}
segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:}

另外如果,想让ES能同时被本地和远程访问到,可以改一下ES的配置文件,IP改为如下:

network.host: 0.0.0.0

我专门写了linux下的ES启动脚本(脚本放在skywalking的bin目录下,ES放在Skywalking的根目录下),由于ES不能以root用户启动,所以脚本里加了用户的自动创建:

#!/bin/bash
check_user()
{
#判断用户是否存在passwd中
i=`cat /etc/passwd | cut -f1 -d':' | grep -w "$1" -c`
if [ $i -le ]; then
echo "User $1 is not in the passwd"
return
else
#显示用户存在
echo "User $1 is in then use"
return
fi
}

uname=elsearch
check_user $uname
if [ $? -eq ]
then
#添加此用户
sudo useradd $uname
passwd $uname --stdin ""
echo "user $uname add!!!"
fi
Cur_Dir=$(cd "$(dirname "$")"; pwd)
chown $uname:$uname -R $Cur_Dir/../elasticsearch
chmod -R $Cur_Dir/../elasticsearch
chmod -R $Cur_Dir/../elasticsearch/bin
su - $uname -c "nohup $Cur_Dir/../elasticsearch/bin/elasticsearch > $Cur_Dir/../elasticsearch/logs/output.log 2>&1 &"
echo "elasticsearch start success!"

考虑到ES也是需要先启动,确保端口监听正常了,才能启动oapService,所以我改造了skywalking自带的启动脚本,加了端口监听判断:

#!/usr/bin/env sh
check_port()
{
grep_port=`netstat -tlpn | grep "\b$1\b"`
echo "grep port is $grep_port"
if [ -n "$grep_port" ]
then
echo "port $port is in use"
return
else
echo "port is not established,please wait a moment……"
return
fi
}

PRG="$0"
PRGDIR=`dirname "$PRG"`
OAP_EXE=oapService.sh
WEBAPP_EXE=webappService.sh
elsearch_EXE=elasticsearchStart.sh

"$PRGDIR"/"$elsearch_EXE"

port=
echo "check $port"
for i in $(seq )
do
check_port $port
if [ $? -eq ]
then
sleep 2s
else
break
fi
done

"$PRGDIR"/"$OAP_EXE"

"$PRGDIR"/"$WEBAPP_EXE"

以上的准备,就是为Skywalking应用ES存储做好了准备,但是Elasticsearch本身也是存在写入瓶颈的,也就是说ES也会崩溃,一但崩溃,就可能oapService关闭,或是导致skywalking页面大盘空白。

我们可以做些调优,skywalking写入ES的操作是使用了ES的批量写入接口。我们可以调整这些批量的维度。尽量降低ES索引的写入频率,如:

bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:} # Execute the bulk every requests
bulkSize: ${SW_STORAGE_ES_BULK_SIZE:} # flush the bulk every 20mb
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:} # flush the bulk every seconds whatever the number of requests
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:} # the number of concurrent requests
metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:}

调用的源码如下:

BulkProcessor bulkProcessor = BulkProcessor.builder(
client,
new BulkProcessor.Listener() {
@Override
public void beforeBulk(long executionId,
BulkRequest request) { … }

        @Override  
        public void afterBulk(long executionId,  
                              BulkRequest request,  
                              BulkResponse response) { ... } 

        @Override  
        public void afterBulk(long executionId,  
                              BulkRequest request,  
                              Throwable failure) { ... }  
    })  
    .setBulkActions()  
    .setBulkSize(new ByteSizeValue(, ByteSizeUnit.MB))  
    .setFlushInterval(TimeValue.timeValueSeconds())  
    .setConcurrentRequests()  
    .setBackoffPolicy(  
        BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(), ))  
    .build();

参考博客:https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html

调整bulkActions默认2000次请求批量写入一次改到4000次;

bulkSize批量刷新从20M一次到40M一次;

flushInterval每10秒刷新一次堆改为每30秒刷新;

concurrentRequests查询的最大数量由5000改为8000。这种配置调优确实生效了,

重启服务后两三天了都没有出现过ES写入阻塞的问题。不过这种设置只是暂时的,你只能期望流量不突发,或者应用不增加。一旦遇到突发流量和应用的增加,ES写入瓶颈还是会凸显出来。而且参数设置过大带来了一个新的问题,就是数据写入延时会比较大,一次服务交互发生的trace隔好久才能在skywalking页面上查询到。所以最终解决方案是优化ES的写入性能,具体优化可以参考别人的文章:https://www.easyice.cn/archives/207

另外作为开源化的平台,扩展性也是其中的优势,本身ES就是分布式全文检索框架,可以部署成高可用的集群,另外Skyawalking也是分布式链路跟踪系统,分布式既然是它应用的特性,那么怎么去构建集群化的监控平台,就完全靠你自己的想象和发挥了。

另外附上Skywalking各模块完整的配置说明(为看不明白英文注释的人准备):

(1)Skywalking collector 配置
        OAP(Collector)链路数据归集器,主要用于数据落地,大部分都会选择 Elasticsearch 6,OAP配置文件为 /opt/apache-skywalking-apm-6.2.0/config/application.yml,配置单点的 OAP(Collector)配置如下:

cluster:
# 单节点模式
standalone:
# zk用于管理collector集群协作.
# zookeeper:
# 多个zk连接地址用逗号分隔.
# hostPort: localhost:
# sessionTimeout:
# 分布式 kv 存储设施,类似于zk,但没有zk重型(除了etcd,consul、Nacos等都是类似功能)
# etcd:
# serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
# 多个节点用逗号分隔, 如: 10.0.0.1:,10.0.0.2:,10.0.0.3:
# hostPort: ${SW_CLUSTER_ETCD_HOST_PORT:localhost:}
core:
default:
      # 混合角色:接收代理数据,1级聚合、2级聚合
# 接收者:接收代理数据,1级聚合点
# 聚合器:2级聚合点
      role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator

       # rest 服务地址和端口
      restHost: ${SW_CORE_REST_HOST:localhost}
      restPort: ${SW_CORE_REST_PORT:}
      restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/}

      # gRPC 服务地址和端口
      gRPCHost: ${SW_CORE_GRPC_HOST:localhost}
      gRPCPort: ${SW_CORE_GRPC_PORT:}

      downsampling:
      - Hour
      - Day
      - Month

      # 设置度量数据的超时。超时过期后,度量数据将自动删除.
      # 单位分钟
      recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:}

      # 单位分钟
      minuteMetricsDataTTL: ${SW_CORE_MINUTE_METRIC_DATA_TTL:}

      # 单位小时
      hourMetricsDataTTL: ${SW_CORE_HOUR_METRIC_DATA_TTL:}

      # 单位天
      dayMetricsDataTTL: ${SW_CORE_DAY_METRIC_DATA_TTL:}

      # 单位月
      monthMetricsDataTTL: ${SW_CORE_MONTH_METRIC_DATA_TTL:}

storage:

elasticsearch:

      # elasticsearch 的集群名称
      nameSpace: ${SW_NAMESPACE:"local-ES"}

  # elasticsearch 集群节点的地址及端口  
  clusterNodes: ${SW\_STORAGE\_ES\_CLUSTER\_NODES:192.168.2.10:}

  # elasticsearch 的用户名和密码  
  user: ${SW\_ES\_USER:""}  
  password: ${SW\_ES\_PASSWORD:""}

  # 设置 elasticsearch 索引分片数量  
  indexShardsNumber: ${SW\_STORAGE\_ES\_INDEX\_SHARDS\_NUMBER:}

  # 设置 elasticsearch 索引副本数  
  indexReplicasNumber: ${SW\_STORAGE\_ES\_INDEX\_REPLICAS\_NUMBER:}

  # 批量处理配置  
  # 每2000个请求执行一次批量  
  bulkActions: ${SW\_STORAGE\_ES\_BULK\_ACTIONS:}

  # 每 20mb 刷新一次内存块  
  bulkSize: ${SW\_STORAGE\_ES\_BULK\_SIZE:}

  # 无论请求的数量如何,每10秒刷新一次堆  
  flushInterval: ${SW\_STORAGE\_ES\_FLUSH\_INTERVAL:}

  # 并发请求的数量  
  concurrentRequests: ${SW\_STORAGE\_ES\_CONCURRENT\_REQUESTS:}

  # elasticsearch 查询的最大数量  
  metadataQueryMaxSize: ${SW\_STORAGE\_ES\_QUERY\_MAX\_SIZE:}

  # elasticsearch 查询段最大数量  
  segmentQueryMaxSize: ${SW\_STORAGE\_ES\_QUERY\_SEGMENT\_SIZE:}

(2)Skywalking webApp 配置
       Skywalking 的 WebApp 主要是用来展示落地的数据,因此只需要配置 Web 的端口及获取数据的 OAP(Collector)的IP和端口,webApp 配置文件地址为  /opt/apache-skywalking-apm-6.2.0/webapp/webapp.yml 配置如下:

server:
port: 
collector:
path: /graphql
ribbon:
ReadTimeout: 
# 指向所有后端collector 的 restHost:restPort 配置,多个使用, 分隔
listOfServers: localhost:

security:
user:
# username
admin:
# password
password: admin

()Skywalking Agent 配置
       Skywalking 的 Agent 主要用于收集和发送数据到 OAP(Collector),因此需要进行配置 Skywalking OAP(Collector)的地址,Agent 的配置文件地址为  /opt/apache-skywalking-apm-6.2./agent/config/agent.config,配置如下:

# 设置Agent命名空间,它用来隔离追踪和监控数据,当两个应用使用不同的名称空间时,跨进程传播链会中断。
agent.namespace=${SW_AGENT_NAMESPACE:default-namespace}

设置服务名称,会在 Skywalking UI 上显示的名称

agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}

每 3秒采集的样本跟踪比例,如果是负数则表示 %采集

agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-}

启用 Debug ,如果为 true 则将把所有检测到的类文件保存在"/debug"文件夹中

agent.is_open_debugging_class = ${SW_AGENT_OPEN_DEBUG:true}

后端的 collector 端口及地址

collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.2.215:}

日志级别

logging.level=${SW_LOGGING_LEVEL:DEBUG}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章