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. Rocket - debug - DebugTransport

    https://mp.weixin.qq.com/s/EcsuTjb4hFF9Ncig9Gfhew 简单介绍DebugTransport的实现. 1. JtagDTMConfig 1) JtagDTM ...

  2. Spring ( 二 ) IOC 依赖注入

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.什么是IOC IOC 全称指的是 Inverse Of Control 控制反转. 原来我们使用Sp ...

  3. Java实现 蓝桥杯 算法提高 01背包

    算法提高 01背包 时间限制:1.0s 内存限制:256.0MB 问题描述 给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个. 输入 ...

  4. Java实现 LeetCode 488 祖玛游戏

    488. 祖玛游戏 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色,黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球. 每一次,你可以从手里的球选一个,然后把这个球插入到一串 ...

  5. Java实现 LeetCode 207 课程表

    207. 课程表 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] ...

  6. Java实现 蓝桥杯VIP 算法提高 能量项链

    算法提高 能量项链 时间限制:1.0s 内存限制:256.0MB 问题描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记 ...

  7. java实现放麦子问题

    /* 你一定听说过这个故事.国王对发明国际象棋的大臣很佩服, 问他要什么报酬,大臣说:请在第 1 个棋盘格放 1 粒麦子, 在第 2 个棋盘格放 2 粒麦子,在第 3 个棋盘格放 4 粒麦子, 在第 ...

  8. java实现第二届蓝桥杯地铁换乘(C++)

    地铁换乘. 为解决交通难题,某城市修建了若干条交错的地铁线路,线路名及其所属站名如stations.txt所示. 线1 苹果园 .... 四惠东 线2 西直门 车公庄 .... 建国门 线4 .... ...

  9. 阿里云专有网络配置以及交换机配置+ip、子网掩码、ip网段计算原理讲解

    在阿里云上购买ECS或者其他服务,如redis.polardb时,需要配置专有网络,阿里的文档写的总体上还是比较抽象的,没有一定的网络基础,会一脸懵. 所以这里我来进行专有网络和交换机的配置,以及ip ...

  10. iOS-Reactive Cocoa的常见用法

    今天是周末,临近年底,工作上遇到不可抗力,会有点一些变动!这多少会让人有一点静不下来,但需克制,Reactive Cocoa是今天的主角! 废话不多说,今天聊聊Reactive Cocoa的常见使用! ...