1. 程式人生 > >ELK之ES2.4.1雙例項平滑升級調優至5.2.1踩坑並supervisor管理記

ELK之ES2.4.1雙例項平滑升級調優至5.2.1踩坑並supervisor管理記

  ES老叢集用的2.4.1版本,跑的比較好就一直沒動,最近看資料ES5.X已經穩定,並且效能有較大提升,心裡就發癢了,但由於業務要保持高可用的屬性,就得想一個平滑升級的方案,最後想到了多例項過度的辦法,5.X版本網上介紹配置變化較大,也做好了踩坑準備,確定好要升級後,立刻動手。

一、對應升級改造方案

  使用埠9220和9330 安裝並配置好新的ES5.2.1例項——>關掉logstash並將ES2.4.1例項堆疊調小重啟(kafka保留3個小時日誌所以不會丟失)——>啟動ES5.2.1並將logstash開啟指向ES5.2.1——>安裝新版kibana例項做好指向,老資料用http://host/old

訪問——>ES5.2.1配置調優。

二、升級後統一用supervisord-monitor管理

wKioL1iz3GvBu8mDAAGvMs78Wgw928.png

三、優化前後ES的cpu、IO和thread_pool的監控資料如下

優化前:

wKiom1i3yCjS40QJAAMVIA8Hui4955.png

wKioL1i3yGaS3FBiAAIcHJa7s-Y915.png

優化後:

wKiom1iz3MGx3tKQAAKfoNS6Wh8608.png

wKiom1iz3OfReZAmAAEKu6aP5q0812.png

從監控資料看最高的活躍程序數還是bulk的批量處理操作,如果不調優,直接會block。

四、升級過程——編寫了ES5.2.1的安裝指令碼如下

  之前用的rpm包,後考慮直接使用tar包安裝,對於需要系統做的調優操作,直接編寫自動化安裝指令碼,一鍵將所有系統引數配置後,將環境搭建好。

#/bin/sh
id elasticsearch || useradd elasticsearch -s /sbin/nologin   #新增使用者
grep "* - nofile 512000" /etc/security/limits.conf || echo  "* - nofile 512000"  >> /etc/security/limits.conf  #修改檔案描述符數量
grep "elasticsearch - nproc unlimited" /etc/security/limits.conf || echo "elasticsearch - nproc unlimited"   >> /etc/security/limits.conf  #修改最大開啟程序數數量
grep "fs.file-max = 1024000" /etc/sysctl.conf || echo "fs.file-max = 1024000"  >> /etc/sysctl.conf  #修改系統檔案描述符
grep "vm.max_map_count = 262144" /etc/sysctl.conf || echo "vm.max_map_count = 262144"  >>  /etc/sysctl.conf  #修改程式最大管理的vm
sysctl -p
cd /usr/local/src
[ ! -f /usr/local/src/elasticsearch-5.2.1.zip ] && wget 
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.1.zip
[ ! -d /usr/local/src/elasticsearch-5.2.1 ] && unzip elasticsearch-5.2.1.zip
mv elasticsearch-5.2.1 /usr/local/
chown -R elasticsearch:elasticsearch /usr/local/elasticsearch-5.2.1  #修改擁有者所有組
sed -i 's/-XX:+UseConcMarkSweepGC/-XX:+UseG1GC/' /usr/local/elasticsearch-5.2.1/config/jvm.options    #GC方式修改為G1
sed -i 's/-XX:CMSInitiatingOccupancyFraction=75/-XX:MaxGCPauseMillis=200/' /usr/local/elasticsearch-5.2.1/config/jvm.options
sed -i 's/-XX:+UseCMSInitiatingOccupancyOnly/#-XX:+UseCMSInitiatingOccupancyOnly/' /usr/local/elasticsearch-5.2.1/config/jvm.options

五、升級過程——配置檔案、索引相關的更新調優

   升級期間著實踩了不少坑,老版ES索引配置可以直接寫到配置檔案裡,新版是不行的,必須使用api去設定,另外ES2.X版本的程序數調優,在ES5.X我發現調整與否沒有影響。配置檔案如下:

cluster.name: yz-5search
path.data:  /data1/LogData5/
path.logs:  /data1/LogData5/logs
bootstrap.memory_lock: false   #centos6核心不支援,必須要關閉
bootstrap.system_call_filter: false
network.host: 10.39.40.94
http.port: 9220
transport.tcp.port: 9330
discovery.zen.ping.unicast.hosts: ["10.39.40.94:9330","10.39.40.95:9330","10.39.40.96:9330","10.39.40.97:9330"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"

為了加快索引效率,編寫index的模板配置(index配置不允許寫到配置檔案了),將引數put到es的裡,當然模板也可以通過前端logstash指定(要改logtash覺得麻煩),template指令碼如下:

#/bin/sh
#index template
curl -XPUT 'http://10.39.40.94:9220/_template/cms_logs?pretty' -d '{
     "order": 6,                                    #優先順序
      "template": "logstash-cms*",                  #正則匹配索引
      "settings": {
             "index.refresh_interval" : "60s",  #索引重新整理時間
             "index.number_of_replicas" : "0",  #副本數設定為0
             "index.number_of_shards" : "8",    #分片數設定為8,共4臺伺服器
             "index.translog.flush_threshold_size" : "768m",  #translog觸發flush的閥值
             "index.store.throttle.max_bytes_per_sec" : "500m", #儲存的閥值
             "index.translog.durability": "async",              #設定translog非同步重新整理到硬碟,更注重效能
             "index.merge.scheduler.max_thread_count": "1",     #機械盤設定為1
             "index.routing.allocation.total_shards_per_node": "2"  #每個節點上兩個分片
      }
}'

備:如果是更改,將PUT改為POST

日誌保留7天,清除的指令碼如下,寫入計劃任務:

#!/bin/bash
DATE=`date +%Y.%m.%d.%I`
DATA2=`date +%Y.%m.%d -d'-7 day'`
curl -XDELETE "http://10.39.40.97:9220/logstash-*-${DATA2}*?pretty"

   由於單個索引達到了35G甚至40G以上,於是在logstash層面對建索引數量進行修改,把每天12個索引修改為每天24個索引:

wKioL1iz8ePgwJl0AABVVIEQxVY697.png

logstash的修改如下:

index => "logstash-cms-front-nginx-%{+YYYY.MM.dd.hh}"  修改為
index => "logstash-cms-front-nginx-%{+YYYY.MM.dd.HH}"

備註:supervisor的安裝

easy_install meld3
eays_install pip
easy_install supervisor