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管理
github:https://github.com/mlazarov/supervisord-monitor
三、優化前後ES的cpu、IO和thread_pool的監控數據如下
優化前:
優化後:
從監控數據看最高的活躍進程數還是bulk的批量處理操作,如果不調優,直接會block。
四、升級過程——編寫了ES5.2.1的安裝調優腳本如下
之前用的rpm包,後考慮直接使用tar包安裝,對於需要系統做的調優操作,直接編寫自動化安裝腳本,一鍵將所有系統參數配置後,將環境搭建好。
#/bin/sh #writer:gaolixu 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 swapoff -a #關閉虛擬內存 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 #writer:gaolixu #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.policy.segments_per_tier": "25", #每一輪merge的segment的允許數量,默認是10 "index.merge.policy.floor_segment": "100mb", #小於這個值的segment會四捨五入,防止很小的segment的頻繁flush "index.merge.scheduler.max_thread_count": "1", #機械盤設置爲1 "index.routing.allocation.total_shards_per_node": "2" #每個節點上兩個分片 } }'
備:如果是更改,將PUT改爲POST
日誌保留7天,清除的腳本如下,寫入計劃任務:
#!/bin/bash #writer:gaolixu 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個索引:
logstash的修改如下:
index => "logstash-cms-front-nginx-%{+YYYY.MM.dd.hh}" 修改爲 index => "logstash-cms-front-nginx-%{+YYYY.MM.dd.HH}"
備註:supervisor的安裝
easy_install meld3 easy_install pip easy_install supervisor
自建個人原創站運維網咖社(www.net-add.com),新的博文會在網咖社更新,歡迎瀏覽。