作为一款APM和全链路监控平台,Skywalking算是挺出色的。Skywalking是APM监控平台的后起之秀,大有超越其他开源APM监控平台的趋势。它通过探针自动收集所需的指标,并进行分布式追踪。通过这些调用链路以及指标,Skywalking APM会感知应用间关系和服务间关系,并进行相应的指标统计。
目前Skywalking支持h2、mysql、ElasticSearch作为数据存储,我就说一下,这三个种库的优缺点和使用要求:
1、首先是默认的h2
h2是Skywalking自带的,对应的jar包路径是Skywalking/oap-libs/h2-1.4.196.jar,h2是一种内存数据库,在Skywalking配置文件的默认配置如下:
h2: driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource} url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db} user: ${SW_STORAGE_H2_USER:sa} metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
作为内存数据库,当然是保存在内存中,只要服务重启或是Skywalking应用故障了,基本上所监控到的数据也就丢失了,所以h2的内存模式其实不适合于应用服务长时间监控的场景。但是h2也可以变为文件数据库,配置如下:
h2: driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource} url: ${SW_STORAGE_H2_URL:jdbc:h2:tcp://127.0.0.1/~/skywalking-oap-db;AUTO_SERVER=TRUE} user: ${SW_STORAGE_H2_USER:sa} metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
和内存模式的配置区别就是URL换成了文件的路径,默认路径是在用户目录下(如administrator或root或home/user等用户目录)自动创建数据库文件skywalking-oap-db。
要使用文件数据库,有个前提是要先启动h2的TCP服务,因为默认skywalking调用的是内存数据库,如果没有启动h2 TCP,由于监听不到端口,oapService就会判断为连接故障而关闭。启动h2 TCP服务,可以在bin目录新建启动脚本,linux脚本如下:
#!/usr/bin/env sh PRG="$0" PRGDIR=`dirname "$PRG"` [ -z "$OAP_HOME" ] && OAP_HOME=`cd "$PRGDIR/.." >/dev/null; pwd` OAP_LOG_DIR="${OAP_HOME}/logs" JAVA_OPTS=" -Xms64M -Xmx256M" if [ ! -d "${OAP_HOME}/logs" ]; then mkdir -p "${OAP_LOG_DIR}" fi _RUNJAVA=${JAVA_HOME}/bin/java [ -z "$JAVA_HOME" ] && _RUNJAVA=java CLASSPATH="$OAP_HOME/config:$CLASSPATH" for i in "$OAP_HOME"/oap-libs/h2*.jar do CLASSPATH="$i:$CLASSPATH" done OAP_OPTIONS=" -Doap.logDir=${OAP_LOG_DIR}" # 如果需要远程连接h2数据库,需将-tcp改为-tcpAllowOthers eval exec "\"$_RUNJAVA\" ${JAVA_OPTS} ${OAP_OPTIONS} -classpath $CLASSPATH org.h2.tools.Server -tcp \ 2>${OAP_LOG_DIR}/h2Tcp.log 1> /dev/null &" if [ $? -eq 0 ]; then sleep 1 echo "SkyWalking h2Tcp started successfully!" else echo "SkyWalking h2Tcp started failure!" exit 1 fi 对应的windows脚本如下:
@REM 如果需要远程查看h2数据库(tcp端口9092,页面访问端口8082),需将-tcp改为-tcpAllowOthers @echo off setlocal set OAP_PROCESS_TITLE=Skywalking-H2TcpServer set OAP_HOME=%~dp0%.. set OAP_OPTS="-Xms64M -Xmx256M -Doap.logDir=%OAP_HOME%\logs" set CLASSPATH=%OAP_HOME%\config;.; set CLASSPATH=%OAP_HOME%\oap-libs\*;%CLASSPATH% if defined JAVA_HOME ( set _EXECJAVA="%JAVA_HOME%\bin\java" ) if not defined JAVA_HOME ( echo "JAVA_HOME not set." set _EXECJAVA=java ) start "%OAP_PROCESS_TITLE%" %_EXECJAVA% "%OAP_OPTS%" -cp "%CLASSPATH%" org.h2.tools.Server -tcp endlocal 先启动h2文件数据库,确保9092端口能被监听,再启动Skywalking的其他服务。
h2文件数据库虽然非常轻量级,毕竟skywalking自带了,但是稳定性却很差,一但文件损坏(大并发量和大吞吐量的监控数据,就会把它干坏),oapService服务就启动不了了,需要清除文件或是恢复及覆盖文件才能启动(对于一般应用者来说,这也是要命的事)。
2、Mysql数据库
启用mysql存储,有两个地方需要配置,一个是application.yml
mysql: metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
另一个是datasource-settings.properties
jdbcUrl=jdbc:mysql://localhost:3306/swtest dataSource.user=root dataSource.password=root@1234
mysql数据库相对要稳定,毕竟是被大量使用的数据库,而且可以做相应的优化,配置缓存,加大数据吞吐量。但是基于mysql的查询速度我觉得不快,特别是skywalking中【追踪】查看,3万条以上的记录查询基本上觉得卡。但作为长时间的应用性能监控来说,mysql合适。而对于Linux下的部署来说,mysql偏重量级了(编译后的二进制mysql安装包就有好几百M)。
3、ElasticSearch
官网好像是推荐使用ElasticSearch,为什么推荐?我猜的,应该是快呀。ES(ElasticSearch)是一款分布式全文检索框架,底层基于Lucene实现,是给搜索引擎专用的,不快都不行。试了一下10万条的追踪记录,基本上很快就能查询展示。
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:9200} user: ${SW_ES_USER:""} password: ${SW_ES_PASSWORD:""} indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2} indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0} # Those data TTL settings will override the same settings in core module. recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # Unit is day otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:45} # Unit is day monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:18} # Unit is month bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:2000} # Execute the bulk every 2000 requests bulkSize: ${SW_STORAGE_ES_BULK_SIZE:20} # flush the bulk every 20mb flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000} segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
另外如果,想让ES能同时被本地和远程访问到,可以改一下ES的配置文件,IP改为如下:
network.host: 0.0.0.0
我专门写了linux下的ES启动脚本(脚本放在skywalking的bin目录下,ES放在Skywalking的根目录下),由于ES不能以root用户启动,所以脚本里加了用户的自动创建: