elasticsearch 實現只保留固定時間的數據

    elk爲常見的日誌分析平臺,在很多公司都用使用,但是日誌數據是一個不斷海量增加的東西,如果沒有太大的存儲來存儲這些日誌歷史數據,就會需要刪除時間過長的歷史數據,以保證數據量可控。還不知道elk的,可以參考我另外的elk安裝博文:

Centos7.2 搭建ELK-5.6.4日誌分析平臺(一)

Centos7.2 搭建ELK-5.6.4日誌分析平臺(二)

centos7 Supervisor的安裝與配置,管理elk進程。

    

    elk中elasticsearch爲搜索引擎,也是數據的儲存單元。要想實現只保留固定時間的數據,這裏以7天爲例,要想每個索引的數據都只保留最近7天的數據,大於7天的則刪除,有兩種方法:

1.  看你的索引是怎麼樣的,如果你的索引名稱中有時間,比如logstash-2019-01-02 這樣,就是每天都會生成一個新的索引,這樣的話可以使用官方的Curator 工具

2. 如果你的索引中不帶時間,比如,如果是根據應用或者服務名來命名的,那麼注意,Curator是無法實現刪除索中的某一段數據的!!這裏需要特別注意,網上很多說可以實現的,那是因爲他們的索引如上面1 所說,是根據時間日期來生成的。但實際上,很多索引都不是這樣的,按正常的思維,更容易用服務名或應用名作爲索引,以此來區分日誌所屬應用,方便日誌的分析對應指定的應用。這種時候需要使用elasticsearch的api:delete_by_query來進行刪除指定數據。這種方法也是通用的,更推薦用這種方法

 

這裏兩種方法都詳細說明。

一 使用API

    刪除指定的數據,需要使用到delete_by_query接口,這裏需要科普一下,在elk中,每一條日誌數據就是一個doc文檔,如下:每條數據都會有一個_index,_type,_id 分別就是索引,類型,id。

 

delete_by_query的接口格式如下:

請求方式爲:post  

url爲: http://elasticsearch-host:9200/{index}/_delete_by_query?conflicts=proceed

需要傳參數,通過參數執行選擇的數據,傳參格式爲json。

下面以刪除所有索引,超過7天的歷史數據爲例,用python寫成的腳本如下,可以直接拿去用

import requests
import json

es_host = '127.0.0。1' # Elasticsearch訪問地址

headers = {
    'Content-Type': 'application/json'
}
# 這裏url中,用*匹配所有的索引,也可以寫成logstash-* 匹配所有以logstash-開頭的索引等等。
url = 'http://{}:9200/*/_delete_by_query?conflicts=proceed'.format(es_host)

data = {
    "query": {
        "range": {
            "@timestamp": {    # 這裏我根據默認的時間來作爲查詢的時間字段,也可以是自定義的
                "lt": "now-7d",    # 這裏是7天,時間可自定義
                "format": "epoch_millis"
            }
        }
    }
}

response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.json())

# 刪除後,需要執行forcemerge操作,手動釋放磁盤空間
url2 ='http://{}:9200/_forcemerge?only_expunge_deletes=true&max_num_segments=1'.format(es_host)
response = requests.post(url2)

print(response.json())

 

以上,就是一個完整的刪除索引的歷史數據的一個腳本,然後只需要將此腳本添加到crontab中,每天定時執行以此就可以實現只保留固定時間的數據了。怎麼添加到crontab就不贅述了,不懂的參考我另一篇博文《centos7.2 利用crontab執行定時計劃任務

 

 

二 Elasticsearch Curator

簡介

   curator 是一個官方的,可以管理elasticsearch索引的工具,可以實現創建,刪除,段合併等等操作。詳見官方文檔

 

版本

    

 

安裝

    安裝非常簡單,直接通過pip安裝即可。 其他安裝方案,詳見官方文檔:安裝

pip install elasticsearch-curator

 

使用

    安裝後,便可以在命令行中直接使用,使用--help查看一下使用方法

curator --help
Usage: curator [OPTIONS] ACTION_FILE

  Curator for Elasticsearch indices.

  See http://elastic.co/guide/en/elasticsearch/client/curator/current

Options:
  --config PATH  Path to configuration file. Default: ~/.curator/curator.yml
  --dry-run      Do not perform any changes.
  --version      Show the version and exit.
  --help         Show this message and exit.

 

看到使用需要定義兩個文件,一個配置文件 curator,.yml 和 操作文件 action.yml

配置文件 curator.yml 示例如下: 詳細的配置文件配置方法,詳見官方文檔: 配置文件curator.yml

client:
  hosts:
    - 127.0.0.1
  port: 9200
  url_prefix:
  use_ssl: False
  certificate:
  client_cert:
  client_key:
  ssl_no_validate: False
  # 下面用戶名密碼修改爲自己es的用戶密碼
  http_auth: elastic:123456
  timeout:
  master_only: True

logging:
  loglevel: INFO
  logfile:
  logformat: default
  blacklist: ['elasticsearch', 'urllib3']

 

然後就是action.yml 文件,定義需要執行的操作,我們這裏需要刪除索引中時間過長的歷史數據,詳細的操作文件action.yml配置的字段和用法,詳見官方文檔: 

action操作類型定義

filters過濾器定義

actions:
  1:
    action: delete_indices    # 這裏執行操作類型爲刪除索引
    description: "delete index expire date"
    options:
      ignore_empty_list: True
      timeout_override:
      continue_if_exception: False
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix    # 這裏是指匹配前綴爲 “yaobili-” 的索引,還可以支持正則匹配等,詳見官方文檔
      value: logstash-
    # 這裏匹配時間
    - filtertype: age
      source: name    # 這裏不單可以根據name來匹配,還可以根據字段等,詳見官方文檔
      direction: older
    # 這裏定義的是days,還有weeks,months等,總時間爲unit * unit_count
      unit: days
      unit_count: 7
      timestring: '%Y.%m.%d'    # 這裏是跟在logstash-後面的時間的格式

 

ok,定義了兩個文件後,則可以直接使用命令行進行執行:指定兩個文件的路徑即可。

curator --config curator.yml action.yaml
輸出日誌:
2019-01-02 16:27:28,721 INFO      Preparing Action ID: 1, "delete_indices"
2019-01-02 16:27:28,733 INFO      Trying Action ID: 1, "delete_indices": delete expire index
2019-01-02 16:27:28,800 INFO      Skipping action "delete_indices" due to empty list: <class 'curator.exceptions.NoIndices'>
2019-01-02 16:27:28,800 INFO      Action ID: 1, "delete_indices" completed.
2019-01-02 16:27:28,800 INFO      Job completed

 

最後,將此命令添加到crontab中即可,怎麼添加到crontab就不贅述了,不懂的參考我另一篇博文《centos7.2 利用crontab執行定時計劃任務

 

好了,到此,兩種方法都說完了,有什麼問題,歡迎留言,一同學習,一同進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章