Skywalking的存儲配置與調優

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

 做爲一款APM和全鏈路監控平臺,Skywalking算是挺出色的。Skywalking是APM監控平臺的後起之秀,大有超越其餘開源APM監控平臺的趨勢。它經過探針自動收集所需的指標,並進行分佈式追蹤。經過這些調用鏈路以及指標,Skywalking APM會感知應用間關係和服務間關係,並進行相應的指標統計。java

        目前Skywalking支持h二、mysql、ElasticSearch做爲數據存儲,我就說一下,這三個種庫的優缺點和使用要求:mysql

     

        ElasticSearch不是自帶的,須要安裝,考慮到輕量級,我選用的是elasticsearch-6.2.4,緣由是包小免安裝,解壓完也才30多M,並且目前最新版本的Skywalking 6.2.0是可以支持該版本的ElasticSearch。linux

        Skywalking啓用ES,只須要配置文件設置以下:

web

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改成以下:sql

network.host: 0.0.0.0

    我專門寫了linux下的ES啓動腳本(腳本放在skywalking的bin目錄下,ES放在Skywalking的根目錄下),因爲ES不能以root用戶啓動,因此腳本里加了用戶的自動建立:apache

#!/bin/bash check_user() { #判斷用戶是否存在passwd中 i=`cat /etc/passwd | cut -f1 -d':' | grep -w "$1" -c` if [ $i -le 0 ]; then echo "User $1 is not in the passwd"
        return 0
    else #顯示用戶存在 echo "User $1 is in then use"
        return 1 fi } uname=elsearch check_user $uname if [ $? -eq 0 ] then #添加此用戶 sudo useradd $uname passwd $uname --stdin "123456" echo "user $uname add!!!" fi Cur_Dir=$(cd "$(dirname "$0")"; pwd) chown $uname:$uname -R $Cur_Dir/../elasticsearch chmod -R 766 $Cur_Dir/../elasticsearch chmod -R 777 $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 1
  else echo "port is not established,please wait a moment......"
    return 0 fi } PRG="$0" PRGDIR=`dirname "$PRG"` OAP_EXE=oapService.sh WEBAPP_EXE=webappService.sh elsearch_EXE=elasticsearchStart.sh "$PRGDIR"/"$elsearch_EXE" port=9200 echo "check $port"
for i in $(seq 1 20) do check_port $port if [ $? -eq 0 ] then sleep 2s else
    break fi done "$PRGDIR"/"$OAP_EXE"
 
"$PRGDIR"/"$WEBAPP_EXE"

以上的準備,就是爲Skywalking應用ES存儲作好了準備,可是Elasticsearch自己也是存在寫入瓶頸的,也就是說ES也會崩潰,一但崩潰,就可能oapService關閉,或是致使skywalking頁面大盤空白。api

       咱們能夠作些調優,skywalking寫入ES的操做是使用了ES的批量寫入接口。咱們能夠調整這些批量的維度。儘可能下降ES索引的寫入頻率,如:bash

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

調用的源碼以下:

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(10000) .setBulkSize(new ByteSizeValue(5, ByteSizeUnit.MB)) .setFlushInterval(TimeValue.timeValueSeconds(5)) .setConcurrentRequests(1) .setBackoffPolicy( BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3)) .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:2181 # sessionTimeout: 100000 # 分佈式 kv 存儲設施,相似於zk,但沒有zk重型(除了etcd,consul、Nacos等都是相似功能) # etcd: # serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} # 多個節點用逗號分隔, 如: 10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379 # hostPort: ${SW_CLUSTER_ETCD_HOST_PORT:localhost:2379} 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:12800}       restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/}       # gRPC 服務地址和端口       gRPCHost: ${SW_CORE_GRPC_HOST:localhost}       gRPCPort: ${SW_CORE_GRPC_PORT:11800}       downsampling:       - Hour       - Day       - Month       # 設置度量數據的超時。超時過時後,度量數據將自動刪除.       # 單位分鐘       recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:90}       # 單位分鐘       minuteMetricsDataTTL: ${SW_CORE_MINUTE_METRIC_DATA_TTL:90}       # 單位小時       hourMetricsDataTTL: ${SW_CORE_HOUR_METRIC_DATA_TTL:36}       # 單位天       dayMetricsDataTTL: ${SW_CORE_DAY_METRIC_DATA_TTL:45}       # 單位月       monthMetricsDataTTL: ${SW_CORE_MONTH_METRIC_DATA_TTL:18} storage: elasticsearch:       # elasticsearch 的集羣名稱       nameSpace: ${SW_NAMESPACE:"local-ES"} # elasticsearch 集羣節點的地址及端口 clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.2.10:9200} # elasticsearch 的用戶名和密碼 user: ${SW_ES_USER:""} password: ${SW_ES_PASSWORD:""} # 設置 elasticsearch 索引分片數量 indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2} # 設置 elasticsearch 索引副本數 indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0} # 批量處理配置 # 每2000個請求執行一次批量 bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:2000} # 每 20mb 刷新一次內存塊 bulkSize: ${SW_STORAGE_ES_BULK_SIZE:20} # 不管請求的數量如何,每10秒刷新一次堆 flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # 併發請求的數量 concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # elasticsearch 查詢的最大數量 metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000} # elasticsearch 查詢段最大數量 segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}

(2)Skywalking webApp 配置
       Skywalking 的 WebApp 主要是用來展現落地的數據,所以只須要配置 Web 的端口及獲取數據的 OAP(Collector)的IP和端口,webApp 配置文件地址爲  /opt/apache-skywalking-apm-6.2.0/webapp/webapp.yml 配置以下:

server: port: 9000 collector: path: /graphql ribbon: ReadTimeout: 10000 # 指向全部後端collector 的 restHost:restPort 配置,多個使用, 分隔 listOfServers: localhost:12800 security: user: # username admin: # password password: admin
3)Skywalking Agent 配置        Skywalking 的 Agent 主要用於收集和發送數據到 OAP(Collector),所以須要進行配置 Skywalking OAP(Collector)的地址,Agent 的配置文件地址爲  /opt/apache-skywalking-apm-6.2.0/agent/config/agent.config,配置以下:
# 設置Agent命名空間,它用來隔離追蹤和監控數據,當兩個應用使用不一樣的名稱空間時,跨進程傳播鏈會中斷。 agent.namespace=${SW_AGENT_NAMESPACE:default-namespace} # 設置服務名稱,會在 Skywalking UI 上顯示的名稱 agent.service_name=${SW_AGENT_NAME:Your_ApplicationName} # 每 3秒採集的樣本跟蹤比例,若是是負數則表示 100%採集 agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1} # 啓用 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:11800} # 日誌級別 logging.level=${SW_LOGGING_LEVEL:DEBUG}
相關文章
相關標籤/搜索