Elasticsearch 效率優化 (2)

elasticsearch performance 1 中做了第一階段的優化。 這篇再來強化 index 的管理。

思路

  1. Log 量變大直接影響到 index 的大小,所以要讓 index 做 rollover。
  2. 由於做了 rollover,所以 index 名稱會不固定,所以使用 alias,並且做 filter 的處理。
  3. 調整 Filebeat 的 index 名稱,改用 alias 寫入 log。

Log 量變大直接影響到 index 的大小,所以要讓 index 做 rollover

先建立一個 index lifecycle management,名稱為 kubernetes。 可以看到 hot 階段的 rollover 配置,如果 index size 大於 20G 或者 index age 大於 15 天,就自動生成一個新的 index。

API:

1PUT _ilm/policy/<policy_id>

Json:

 1{
 2  "kubernetes" : {
 3    "version" : 1,
 4    "modified_date" : "2021-06-18T06:24:15.524Z",
 5    "policy" : {
 6      "phases" : {
 7+-- 21 lines: "warm" : {···········································
 8+-- 10 lines: "cold" : {···········································
 9        "hot" : {
10          "min_age" : "0ms",
11          "actions" : {
12            "readonly" : { },
13            "shrink" : {
14              "number_of_shards" : 1
15            },
16            "rollover" : {
17              "max_primary_shard_size" : "20gb",
18              "max_age" : "15d"
19            },
20            "forcemerge" : {
21              "max_num_segments" : 1
22            },
23            "set_priority" : {
24              "priority" : 100
25            }
26          }
27        },
28+---  8 lines: "delete" : {········································
29      }
30    }
31  }
32}

由於做了 rollover,所以 index 名稱會不固定,所以使用 alias,並且做 filter 的處理

這邊建立一個 index,注意如果使用 rollover,index 名稱的結尾必須以 -number 作為結為,例如 kubernetes-dev-000001。 之後 ilm 在做 rollover 時會自動遞增 number

先建置一個 index,並使用 index template 指定 ilm 為剛剛建立的 kubernetes。

API:

1PUT kubernetes-dev-000001

建立一個 alias dev 並指向 index kubernetes-dev-000001。其中要注意 "is_write_index": true,這個配置是讓 Filebeat 可以使用 alias 寫入 log。 下面範例可以看到建置了 filter,包括了限制這個 alias 只能查到近 60 天的資料,以及 kubernets 的 namespace 必須為 dev。

API:

1POST /_aliases

Json:

 1{
 2  "actions": [
 3    {
 4      "add": {
 5        "index": "kubernetes-dev-000001",
 6        "alias": "dev",
 7        "is_write_index": true,
 8        "filter": {
 9          "bool":{"filter":[{"range":{"@timestamp":{"gte":"now-60d/d"}}},{"term":{"kubernetes.namespace":"dev"}}]}
10        }
11      }
12    }
13  ]
14}

調整 Filebeat 的 index 名稱,改用 alias 寫入 log

這邊為 Filebeat 的設定檔,可以看到 output.elasticsearch.inde: 'dev' 是指向我們所建立的 alias dev。就不用管 ilm 遞增 index 的 number 時會影響到我們的寫入。

Yaml:

 1filebeat.autodiscover:
 2  providers:
 3    - type: kubernetes
 4      node: ${NODE_NAME}
 5      templates:
 6        - config:
 7            - type: container
 8              paths:
 9                - "/var/log/containers/*-${data.kubernetes.container.id}.log"
10              exclude_files:
11+--  3 lines: - /var/log/containers/filebeat.*.log················
12              exclude_lines:
13+--  3 lines: - "^$"··············································
14output.elasticsearch:
15  hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}']
16  index: 'dev'
17  username: ${ELASTICSEARCH_USERNAME}
18  password: ${ELASTICSEARCH_PASSWORD}
19setup.ilm.enabled: false
20setup.ilm.policy_name: "kubernetes"
21setup.template.name: "kubernetes"
22setup.template.pattern: "kubernetes-*"
23setup.template.settings.index.lifecycle.name: "kubernetes"
24setup.template.settings.index.lifecycle.rollover_alias: "dev"
25

補充

碰到 index 被鎖住時,將其開啟。

1PUT /_all/_settings
2{
3  "index.blocks.write": null
4}
1PUT /_all/_settings
2{
3  "index.blocks.read_only_allow_delete": null
4}
comments powered by Disqus