Elasticsearch 效率優化 (2)
在 elasticsearch performance 1([[elasticsearch-enhance-performance-1]]) 中做了第一階段的優化。 這篇再來強化 index 的管理。
思路
- Log 量變大直接影響到 index 的大小,所以要讓 index 做 rollover。
- 由於做了 rollover,所以 index 名稱會不固定,所以使用 alias,並且做 filter 的處理。
- 調整 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"
補充
碰到 index 被鎖住時,將其開啟。
1PUT /_all/_settings
2{
3 "index.blocks.write": null
4}
1PUT /_all/_settings
2{
3 "index.blocks.read_only_allow_delete": null
4}