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}

Skywalking的存储配置与调优的更多相关文章

  1. JVM-常用内存调优参数总结

    一.内存调整参数 -Xmx2g    设置堆内存最大值为2g -Xmx512m  设置堆内存最大值为512m -Xms1g   设置堆内存最小值1g (ps:-Xms和-Xmx实际上是 -XX:Ini ...

  2. hadoop 集群调优实践总结

    调优概述# 几乎在很多场景,MapRdeuce或者说分布式架构,都会在IO受限,硬盘或者网络读取数据遇到瓶颈.处理数据瓶颈CPU受限.大量的硬盘读写数据是海量数据分析常见情况. IO受限例子: 索引 ...

  3. 业务系统请求zabbix图表性能调优

    性能调优实践 性能调优实践 背景 问题分析 后端优化排查 前端优化排查 后端长响应排查 zabbix server 优化 总结 背景 用 vue.js 的框架 ant-design vue pro 实 ...

  4. 46张PPT讲述JVM体系结构、GC算法和调优

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...

  5. 《深入理解Java虚拟机》调优案例分析与实战

    上节学习回顾 在上一节当中,主要学习了Sun JDK的一些命令行和可视化性能监控工具的具体使用,但性能分析的重点还是在解决问题的思路上面,没有好的思路,再好的工具也无补于事. 本节学习重点 在书本上本 ...

  6. Spark Shuffle原理、Shuffle操作问题解决和参数调优

    摘要: 1 shuffle原理 1.1 mapreduce的shuffle原理 1.1.1 map task端操作 1.1.2 reduce task端操作 1.2 spark现在的SortShuff ...

  7. 搭建 windows(7)下Xgboost(0.4)环境 (python,java)以及使用介绍及参数调优

    摘要: 1.所需工具 2.详细过程 3.验证 4.使用指南 5.参数调优 内容: 1.所需工具 我用到了git(内含git bash),Visual Studio 2012(10及以上就可以),xgb ...

  8. jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎 ...

  9. jvm系列(六):jvm调优-从eclipse开始

    jvm调优-从eclipse开始 概述 什么是jvm调优呢?jvm调优就是根据gc日志分析jvm内存分配.回收的情况来调整各区域内存比例或者gc回收的策略:更深一层就是根据dump出来的内存结构和线程 ...

随机推荐

  1. [Python基础]001.Python准备

    Python准备 Python简介 使用版本 环境安装 编写第一个Python文件 编辑器选择 Python简介 Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,能简单而有效 ...

  2. Spring_自动装配 & bean之间的关系 & bean的作用域

    1.自动装配 beans-autowire.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...

  3. This关键字练习

    Account: package com.aff.ex; public class Account { private int id;// 账号 private double balance;// 余 ...

  4. 01 . Prometheus简介及安装配置Grafana

    Promethus简介 Prometheus受启发于Google的Brogmon监控系统(相似的Kubernetes是从Google的Brog系统演变而来),从2012年开始由前Google工程师在S ...

  5. bypass disable_function的方法及蚁剑插件bypass-php-function使用

    bypass disable_function的方法及蚁剑插件bypass-php-function使用 在学习php时,发现有许多函数会对网站或系统造成很大危险隐患,常见的危险函数有: phpinf ...

  6. jQuery-操作元素的内容,属性,样式

    1.操作内容 获取: 双标签:html() input:val() 设置: 双标签:html('新内容') input:val('新内容') 2.操作属性 * 获取:attr('属性名') * 设置: ...

  7. CSS3新增伪类有那些?

    p:first-of-type 选择属于其父元素的首个元素 p:last-of-type 选择属于其父元素的最后元素 p:only-of-type 选择属于其父元素唯一的元素 p:only-child ...

  8. MyBatis(二)参数传递和自定义结果集

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.myBatis的注解使用方式 package com.webcode.mapper; import ...

  9. Java实现 LeetCode 290 单词规律

    290. 单词规律 给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律. 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非 ...

  10. SQL server 常用的数据库 DDL语言

    use (数据库名) //切换到目标数据库 if exists (select * from sysdatabases where name='数据库名') //如果括号里面是查看有没有这个数据库 d ...