Skywalking的存儲配置與調優


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: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用戶啟動,所以腳本里加了用戶的自動創建:

#!/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頁面大盤空白。

       我們可以做些調優,skywalking寫入ES的操作是使用了ES的批量寫入接口。我們可以調整這些批量的維度。盡量降低ES索引的寫入頻率,如:

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}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM