業(yè)務系統(tǒng)將各類的報表和統(tǒng)計數(shù)據(jù)存放于ES中,由于歷史原因,系統(tǒng)每天均以全量方式進行統(tǒng)計,隨著時間的推移,ES的數(shù)據(jù)存儲空間壓力巨大。同時由于沒有規(guī)劃好es的索引使用,個別索引甚至出現(xiàn)超過最大文檔數(shù)限制的問題,現(xiàn)實情況給運維人員帶來的挑戰(zhàn)是需要以最小的代價來解決這個問題。下面以內(nèi)網(wǎng)開發(fā)、測試環(huán)境舉例使用python腳本解決這個問題。
創(chuàng)新互聯(lián)建站專注于延慶企業(yè)網(wǎng)站建設(shè),成都響應式網(wǎng)站建設(shè)公司,商城網(wǎng)站定制開發(fā)。延慶網(wǎng)站建設(shè)公司,為延慶等地區(qū)提供建站服務。全流程按需網(wǎng)站建設(shè),專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務
Each Elasticsearch shard is a Lucene index. There is a maximum number of documents you can have in a single Lucene index. As of LUCENE-5843, the limit is 2,147,483,519 (= Integer.MAX_VALUE - 128) documents. You can monitor shard sizes using the _cat/shards API.
es本身支持“_delete_by_query”的形式對查詢出來的數(shù)據(jù)進行刪除。首先我們通過”_cat/indices“入口獲取當前es服務上所有的索引信息。
第一列表示索引當前的健康狀態(tài)
第三列表示索引的名稱
第四列表示索引在服務器上的存儲目錄名
第五、六列表示索引的副本數(shù)和分片信息
第七列表示當前索引的文檔數(shù)
最后兩列分別表示當前索引的存儲占用空間,倒數(shù)第二列等于倒數(shù)第一列乘以副本數(shù)
其次我們通過curl形式拼接成刪除命令發(fā)送給es服務端執(zhí)行,其中createtime字段為數(shù)據(jù)的產(chǎn)生時間,單位為毫秒
curl -X POST "http://192.168.1.19:9400/fjhb-surveyor-v2/_delete_by_query?pretty" -H 'Content-Type: application/json' -d '
{"query":{ "range": {
"createTime": {
"lt": 1580400000000,
"format": "epoch_millis"
}
}
}}'
#!/usr/bin/python
# -*- coding: UTF-8 -*-
###導入必須的模塊
import requests
import time
import datetime
import os
#定義獲取ES數(shù)據(jù)字典函數(shù),返回索引名和索引占用存儲空間大小字典
def getData(env):
header = {"Content-Type": "application/x-www-form-urlencoded",
"user-agent": "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
}
data = {}
with open('result.txt','w+') as f:
req = requests.get(url=env+'/_cat/indices',headers=header).text
f.write(req)
f.seek(0)
for line in f.readlines():
data[line.split()[2]] = line.split()[-1]
return data
#定義unix時間轉(zhuǎn)換函數(shù),以毫秒形式返回,返回值為int類型
def unixTime(day):
today = datetime.date.today()
target_day = today + datetime.timedelta(day)
unixtime = int(time.mktime(target_day.timetuple())) * 1000
return unixtime
#定義刪除es數(shù)據(jù)函數(shù),調(diào)用系統(tǒng)curl命令進行刪除,需要傳入環(huán)境、需要刪除數(shù)據(jù)的時間范圍(即多少天之前的數(shù)據(jù))參數(shù),由于索引數(shù)量眾多,我們只處理超過1G的索引即可
def delData(env,day):
header = 'Content-Type: application/json'
for key, value in getData(env).items():
if 'gb' in value:
size = float(value.split('gb')[0])
if size > 1:
url = dev + '/' + key + '/_delete_by_query?pretty'
command = ("curl -X POST \"%s\" -H '%s' "
"-d '{\"query\":{ \"range\": {\"createTime\": {\"lt\": %s,\"format\": \"epoch_millis\"}}}}'" % (
url, header, day))
print(command)
os.system(command)
if __name__ == '__main__':
dev = 'http://192.168.1.19:9400'
test1 = 'http://192.168.1.19:9200'
test2 = 'http://192.168.1.19:9600'
day = unixTime(-30)
delData(dev,day)
delData(test1,day)
delData(test2,day)
刪除前
刪除后
1、目前腳本采用操作系統(tǒng)crontab方式調(diào)度,一天運行一次
2、首次刪除因為數(shù)據(jù)量龐大,需要耗費較長時間,后續(xù)每天刪除一天的數(shù)據(jù)量,刪除效率尚可
3、腳本未考慮服務器報錯等例外情況與告警通知,實際應用場景需要進行補充
4、腳本未考慮日志記錄,實際應用場景需要進行補充
本文標題:Python腳本刪除查詢出來的數(shù)據(jù)進
本文地址:http://www.rwnh.cn/article18/gshodp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、關(guān)鍵詞優(yōu)化、響應式網(wǎng)站、靜態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)