ДолгосрочноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch

ДолгосрочноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch

МСня Π·ΠΎΠ²ΡƒΡ‚ Π˜Π³ΠΎΡ€ΡŒ Π‘ΠΈΠ΄ΠΎΡ€Π΅Π½ΠΊΠΎ, я Ρ‚Π΅Ρ…Π»ΠΈΠ΄ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Π°Π΄ΠΌΠΈΠ½ΠΎΠ², ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ состоянии всю инфраструктуру Π”ΠΎΠΌΠΊΠ»ΠΈΠΊ.

Π₯ΠΎΡ‡Ρƒ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ своим ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ Π² настройкС распрСдСлённого хранСния Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch. ΠœΡ‹ рассмотрим, ΠΊΠ°ΠΊΠΈΠ΅ настройки Π½Π° Π½ΠΎΠ΄Π°Ρ… ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° распрСдСлСниС ΡˆΠ°Ρ€Π΄ΠΎΠ², ΠΊΠ°ΠΊ устроСн ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ILM.

Π’Π΅, ΠΊΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π»ΠΎΠ³Π°ΠΌΠΈ, Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ долгосрочного Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°. Π’ Elasticsearch это особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΊΡƒΡ€Π°Ρ‚ΠΎΡ€Π° всё Π±Ρ‹Π»ΠΎ прискорбно. Π’ вСрсии 6.6 появился Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ILM. Он состоит ΠΈΠ· 4 Ρ„Π°Π·:

  • Hot β€” индСкс Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ обновляСтся ΠΈ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ.
  • Warm β€” индСкс большС Π½Π΅ обновляСтся, Π½ΠΎ всё Π΅Ρ‰Ρ‘ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ.
  • Cold β€” индСкс большС Π½Π΅ обновляСтся ΠΈ Ρ€Π΅Π΄ΠΊΠΎ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ всё Π΅Ρ‰Ρ‘ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ доступна для поиска, Π½ΠΎ запросы ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅.
  • Delete β€” индСкс большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ бСзопасно ΡƒΠ΄Π°Π»Π΅Π½.

Π”Π°Π½ΠΎ

  • Elasticsearch Data Hot: 24 процСссора, 128 Π“Π± памяти, 1,8 Π’Π± SSD RAID 10 (8 Π½ΠΎΠ΄).
  • Elasticsearch Data Warm: 24 процСссора, 64 Π“Π± памяти, 8 Π’Π± NetApp SSD Policy (4 Π½ΠΎΠ΄Ρ‹).
  • Elasticsearch Data Cold: 8 процСссоров, 32 Π“Π± памяти, 128 Π’Π± HDD RAID 10 (4 Π½ΠΎΠ΄Ρ‹).

ЦСль

Π­Ρ‚ΠΈ настройки ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹, всё зависит ΠΎΡ‚ мСста Π½Π° Π½ΠΎΠ΄Π°Ρ…, количСства индСксов, Π»ΠΎΠ³ΠΎΠ² ΠΈ Ρ‚.Π΄. Π£ нас это 2-3 Π’Π± Π΄Π°Π½Π½Ρ‹Ρ… Π·Π° сутки.

  • 5 Π΄Π½Π΅ΠΉ β€” Ρ„Π°Π·Π° Hot (8 основных / 1 Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°).
  • 20 Π΄Π½Π΅ΠΉ β€” Ρ„Π°Π·Π° Warm (shrink-индСкс 4 основных / 1 Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°).
  • 90 Π΄Π½Π΅ΠΉ β€” Ρ„Π°Π·Π° Cold (freeze-индСкс 4 основных / 1 Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°).
  • 120 Π΄Π½Π΅ΠΉ β€” Ρ„Π°Π·Π° Delete.

Настройка Elasticsearch

Для распрСдСлСния ΡˆΠ°Ρ€Π΄ ΠΏΠΎ Π½ΠΎΠ΄Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ всСго ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€:

  • Hot-Π½ΠΎΠ΄Ρ‹:
    ~]# cat /etc/elasticsearch/elasticsearch.yml | grep attr
    # Add custom attributes to the node:
    node.attr.box_type: hot
  • Warm-Π½ΠΎΠ΄Ρ‹:
    ~]# cat /etc/elasticsearch/elasticsearch.yml | grep attr
    # Add custom attributes to the node:
    node.attr.box_type: warm
  • Cold-Π½ΠΎΠ΄Ρ‹:
    ~]# cat /etc/elasticsearch/elasticsearch.yml | grep attr
    # Add custom attributes to the node:
    node.attr.box_type: cold

Настройка Logstash

Как это всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ? Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с попадания Π»ΠΎΠ³ΠΎΠ² Π² Elasticsearch. Π•ΡΡ‚ΡŒ Π΄Π²Π° способа:

  1. Logstash Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ Π»ΠΎΠ³ΠΈ ΠΈΠ· Kafka. ΠœΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Ρ€Π°Ρ‚ΡŒ чистыми ΠΈΠ»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° своСй сторонС.
  2. Π§Ρ‚ΠΎ-Ρ‚ΠΎ само ΠΏΠΈΡˆΠ΅Ρ‚ Π² Elasticsearch, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, APM-сСрвСр.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ управлСния индСксами Ρ‡Π΅Ρ€Π΅Π· Logstash. Он создаСт индСкс ΠΈ примСняСт ΠΊ Π½Π΅ΠΌΡƒ шаблон индСкса ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ILM.

k8s-ingress.conf

input {
    kafka {
        bootstrap_servers => "node01, node02, node03"
        topics => ["ingress-k8s"]
        decorate_events => false
        codec => "json"
    }
}

filter {
    ruby {
        path => "/etc/logstash/conf.d/k8s-normalize.rb"
    }
    if [log] =~ "[warn]" or [log] =~ "[error]" or [log] =~ "[notice]" or [log] =~ "[alert]" {
        grok {
            match => { "log" => "%{DATA:[nginx][error][time]} [%{DATA:[nginx][error][level]}] %{NUMBER:[nginx][error][pid]}#%{NUMBER:[nginx][error][tid]}: *%{NUMBER:[nginx][error][connection_id]} %{DATA:[nginx][error][message]}, client: %{IPORHOST:[nginx][error][remote_ip]}, server: %{DATA:[nginx][error][server]}, request: "%{WORD:[nginx][error][method]} %{DATA:[nginx][error][url]} HTTP/%{NUMBER:[nginx][error][http_version]}", (?:upstream: "%{DATA:[nginx][error][upstream][proto]}://%{DATA:[nginx][error][upstream][host]}:%{DATA:[nginx][error][upstream][port]}/%{DATA:[nginx][error][upstream][url]}", )?host: "%{DATA:[nginx][error][host]}"(?:, referrer: "%{DATA:[nginx][error][referrer]}")?" }
            remove_field => "log"
        }
    }
    else {
        grok {
            match => { "log" => "%{IPORHOST:[nginx][access][host]} - [%{IPORHOST:[nginx][access][remote_ip]}] - %{DATA:[nginx][access][remote_user]} [%{HTTPDATE:[nginx][access][time]}] "%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][bytes_sent]} "%{DATA:[nginx][access][referrer]}" "%{DATA:[nginx][access][agent]}" %{NUMBER:[nginx][access][request_lenght]} %{NUMBER:[nginx][access][request_time]} [%{DATA:[nginx][access][upstream][name]}] (?:-|%{IPORHOST:[nginx][access][upstream][addr]}:%{NUMBER:[nginx][access][upstream][port]}) (?:-|%{NUMBER:[nginx][access][upstream][response_lenght]}) %{DATA:[nginx][access][upstream][response_time]} %{DATA:[nginx][access][upstream][status]} %{DATA:[nginx][access][request_id]}" }
            remove_field => "log"
        }
    }
}
output {
    elasticsearch {
        id => "k8s-ingress"
        hosts => ["node01", "node02", "node03", "node04", "node05", "node06", "node07", "node08"]
        manage_template => true # Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ шаблонами
        template_name => "k8s-ingress" # имя примСняСмого шаблона
        ilm_enabled => true # Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ILM
        ilm_rollover_alias => "k8s-ingress" # alias для записи Π² индСксы, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ
        ilm_pattern => "{now/d}-000001" # шаблон для создания индСксов, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ "{now/d}-000001" Ρ‚Π°ΠΊ ΠΈ "000001"
        ilm_policy => "k8s-ingress" # ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° прикрСпляСмая ΠΊ индСксу
        index => "k8s-ingress-%{+YYYY.MM.dd}" # Π½Π°Π·Π²Π°Π½ΠΈΠ΅ создаваСмого индСкса, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ %{+YYYY.MM.dd}, зависит ΠΎΡ‚ ilm_pattern
    }
}

Настройка Kibana

Π•ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ примСняСтся ΠΊΠΎ всСм Π½ΠΎΠ²Ρ‹ΠΌ индСксам. Он Π·Π°Π΄Π°Ρ‘Ρ‚ распрСдСлСниС горячих индСксов, количСство ΡˆΠ°Ρ€Π΄ΠΎΠ², Ρ€Π΅ΠΏΠ»ΠΈΠΊ ΠΈ Ρ‚.Π΄. ВСс шаблона опрСдСляСтся ΠΎΠΏΡ†ΠΈΠ΅ΠΉ order. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ с Π±ΠΎΠ»Π΅Π΅ высоким вСсом ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π½ΠΎΠ²Ρ‹Π΅.

ДолгосрочноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch
ДолгосрочноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch

GET _template/default

{
  "default" : {
    "order" : -1, # вСс шаблона
    "version" : 1,
    "index_patterns" : [
      "*" # примСняСм ΠΊΠΎ всСм индСксам
    ],
    "settings" : {
      "index" : {
        "codec" : "best_compression", # ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сТатия
        "routing" : {
          "allocation" : {
            "require" : {
              "box_type" : "hot" # распрСдСляСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ горячим Π½ΠΎΠ΄Π°ΠΌ
            },
            "total_shards_per_node" : "8" # максимальноС количСство ΡˆΠ°Ρ€Π΄ΠΎΠ² Π½Π° Π½ΠΎΠ΄Ρƒ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ индСкса
          }
        },
        "refresh_interval" : "5s", # ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» обновлСния индСкса
        "number_of_shards" : "8", # количСство ΡˆΠ°Ρ€Π΄ΠΎΠ²
        "auto_expand_replicas" : "0-1", # количСство Ρ€Π΅ΠΏΠ»ΠΈΠΊ Π½Π° Π½ΠΎΠ΄Ρƒ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ индСкса
        "number_of_replicas" : "1" # количСство Ρ€Π΅ΠΏΠ»ΠΈΠΊ
      }
    },
    "mappings" : {
      "_meta" : { },
      "_source" : { },
      "properties" : { }
    },
    "aliases" : { }
  }
}

Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ ΠΊ индСксам k8s-ingress-* с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ шаблона с Π±ΠΎΠ»Π΅Π΅ высоким вСсом.

ДолгосрочноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch
ДолгосрочноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch

GET _template/k8s-ingress

{
  "k8s-ingress" : {
    "order" : 100,
    "index_patterns" : [
      "k8s-ingress-*"
    ],
    "settings" : {
      "index" : {
        "lifecycle" : {
          "name" : "k8s-ingress",
          "rollover_alias" : "k8s-ingress"
        },
        "codec" : "best_compression",
        "routing" : {
          "allocation" : {
            "require" : {
              "box_type" : "hot"
            }
          }
        },
        "number_of_shards" : "8",
        "number_of_replicas" : "1"
      }
    },
    "mappings" : {
      "numeric_detection" : false,
      "_meta" : { },
      "_source" : { },
      "dynamic_templates" : [
        {
          "all_fields" : {
            "mapping" : {
              "index" : false,
              "type" : "text"
            },
            "match" : "*"
          }
        }
      ],
      "date_detection" : false,
      "properties" : {
        "kubernetes" : {
          "type" : "object",
          "properties" : {
            "container_name" : {
              "type" : "keyword"
            },
            "container_hash" : {
              "index" : false,
              "type" : "keyword"
            },
            "host" : {
              "type" : "keyword"
            },
            "annotations" : {
              "type" : "object",
              "properties" : {
                "value" : {
                  "index" : false,
                  "type" : "text"
                },
                "key" : {
                  "index" : false,
                  "type" : "keyword"
                }
              }
            },
            "docker_id" : {
              "index" : false,
              "type" : "keyword"
            },
            "pod_id" : {
              "type" : "keyword"
            },
            "labels" : {
              "type" : "object",
              "properties" : {
                "value" : {
                  "type" : "keyword"
                },
                "key" : {
                  "type" : "keyword"
                }
              }
            },
            "namespace_name" : {
              "type" : "keyword"
            },
            "pod_name" : {
              "type" : "keyword"
            }
          }
        },
        "@timestamp" : {
          "type" : "date"
        },
        "nginx" : {
          "type" : "object",
          "properties" : {
            "access" : {
              "type" : "object",
              "properties" : {
                "agent" : {
                  "type" : "text"
                },
                "response_code" : {
                  "type" : "integer"
                },
                "upstream" : {
                  "type" : "object",
                  "properties" : {
                    "port" : {
                      "type" : "keyword"
                    },
                    "name" : {
                      "type" : "keyword"
                    },
                    "response_lenght" : {
                      "type" : "integer"
                    },
                    "response_time" : {
                      "index" : false,
                      "type" : "text"
                    },
                    "addr" : {
                      "type" : "keyword"
                    },
                    "status" : {
                      "index" : false,
                      "type" : "text"
                    }
                  }
                },
                "method" : {
                  "type" : "keyword"
                },
                "http_version" : {
                  "type" : "keyword"
                },
                "bytes_sent" : {
                  "type" : "integer"
                },
                "request_lenght" : {
                  "type" : "integer"
                },
                "url" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword"
                    }
                  }
                },
                "remote_user" : {
                  "type" : "text"
                },
                "referrer" : {
                  "type" : "text"
                },
                "remote_ip" : {
                  "type" : "ip"
                },
                "request_time" : {
                  "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis||dd/MMM/YYYY:H:m:s Z",
                  "type" : "date"
                },
                "host" : {
                  "type" : "keyword"
                },
                "time" : {
                  "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis||dd/MMM/YYYY:H:m:s Z",
                  "type" : "date"
                }
              }
            },
            "error" : {
              "type" : "object",
              "properties" : {
                "server" : {
                  "type" : "keyword"
                },
                "upstream" : {
                  "type" : "object",
                  "properties" : {
                    "port" : {
                      "type" : "keyword"
                    },
                    "proto" : {
                      "type" : "keyword"
                    },
                    "host" : {
                      "type" : "keyword"
                    },
                    "url" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword"
                        }
                      }
                    }
                  }
                },
                "method" : {
                  "type" : "keyword"
                },
                "level" : {
                  "type" : "keyword"
                },
                "http_version" : {
                  "type" : "keyword"
                },
                "pid" : {
                  "index" : false,
                  "type" : "integer"
                },
                "message" : {
                  "type" : "text"
                },
                "tid" : {
                  "index" : false,
                  "type" : "keyword"
                },
                "url" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword"
                    }
                  }
                },
                "referrer" : {
                  "type" : "text"
                },
                "remote_ip" : {
                  "type" : "ip"
                },
                "connection_id" : {
                  "index" : false,
                  "type" : "keyword"
                },
                "host" : {
                  "type" : "keyword"
                },
                "time" : {
                  "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis||dd/MMM/YYYY:H:m:s Z",
                  "type" : "date"
                }
              }
            }
          }
        },
        "log" : {
          "type" : "text"
        },
        "@version" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "ignore_above" : 256,
              "type" : "keyword"
            }
          }
        },
        "eventtime" : {
          "type" : "float"
        }
      }
    },
    "aliases" : { }
  }
}

ПослС примСнСния всСх шаблонов ΠΌΡ‹ примСняСм ILM-ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Тизнью индСксов.

ДолгосрочноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch

ДолгосрочноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch

ДолгосрочноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch

GET _ilm/policy/k8s-ingress

{
  "k8s-ingress" : {
    "version" : 14,
    "modified_date" : "2020-06-11T10:27:01.448Z",
    "policy" : {
      "phases" : {
        "warm" : { # тСплая Ρ„Π°Π·Π°
          "min_age" : "5d", # срок ΠΆΠΈΠ·Π½ΠΈ индСкса послС Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π΄ΠΎ наступлСния Ρ‚Π΅ΠΏΠ»ΠΎΠΉ Ρ„Π°Π·Ρ‹
          "actions" : {
            "allocate" : {
              "include" : { },
              "exclude" : { },
              "require" : {
                "box_type" : "warm" # ΠΊΡƒΠ΄Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ индСкс
              }
            },
            "shrink" : {
              "number_of_shards" : 4 # ΠΎΠ±Ρ€Π΅Π·Π°Π½ΠΈΠ΅ индСксов, Ρ‚.ΠΊ. Ρƒ нас 4 Π½ΠΎΠ΄Ρ‹
            }
          }
        },
        "cold" : { # холодная Ρ„Π°Π·Π°
          "min_age" : "25d", # срок ΠΆΠΈΠ·Π½ΠΈ индСкса послС Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π΄ΠΎ наступлСния Ρ…ΠΎΠ»ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°Π·Ρ‹
          "actions" : {
            "allocate" : {
              "include" : { },
              "exclude" : { },
              "require" : {
                "box_type" : "cold" # ΠΊΡƒΠ΄Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ индСкс
              }
            },
            "freeze" : { } # Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Π΅ΠΌ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
          }
        },
        "hot" : { # горячая Ρ„Π°Π·Π°
          "min_age" : "0ms",
          "actions" : {
            "rollover" : {
              "max_size" : "50gb", # ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ индСкса Π΄ΠΎ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ (Π±ΡƒΠ΄Π΅Ρ‚ Ρ…2, Ρ‚.ΠΊ. Π΅ΡΡ‚ΡŒ 1 Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°)
              "max_age" : "1d" # ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ срок ΠΆΠΈΠ·Π½ΠΈ индСкса Π΄ΠΎ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ
            },
            "set_priority" : {
              "priority" : 100
            }
          }
        },
        "delete" : { # Ρ„Π°Π·Π° удалСния
          "min_age" : "120d", # ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ срок ΠΆΠΈΠ·Π½ΠΈ послС Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ
          "actions" : {
            "delete" : { }
          }
        }
      }
    }
  }
}

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

Π‘Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π° этапС настройки ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

Hot-Ρ„Π°Π·Π°

Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ индСксов ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ присутствиС Π² ΠΊΠΎΠ½Ρ†Π΅ index_name-date-000026 чисСл Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° 000001. Π’ ΠΊΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ строчки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ индСксы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСгулярного выраТСния Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ чисСл Π² ΠΊΠΎΠ½Ρ†Π΅. Π˜Π½Π°Ρ‡Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ошибка, ΠΊ индСксу Π½Π΅ примСнятся ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΈ ΠΎΠ½ всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π² hot-Ρ„Π°Π·Π΅.

Warm-Ρ„Π°Π·Π°

Shrink (ΠΎΠ±Ρ€Π΅Π·Π°Π½ΠΈΠ΅) β€” ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ количСства ΡˆΠ°Ρ€Π΄ΠΎΠ², ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½ΠΎΠ΄ Π² Ρ‚Π΅ΠΏΠ»ΠΎΠΉ ΠΈ Ρ…ΠΎΠ»ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°Π·Π°Ρ… Ρƒ нас ΠΏΠΎ 4. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ строчки:

  • The index must be read-only.
  • A copy of every shard in the index must reside on the same node.
  • The cluster health status must be green.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ€Π΅Π·Π°Ρ‚ΡŒ индСкс, Elasticsearch ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ всС основныС (primary) ΡˆΠ°Ρ€Π΄Ρ‹ Π½Π° ΠΎΠ΄Π½Ρƒ Π½ΠΎΠ΄Ρƒ, Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΡ€Π΅Π·Π°Π½Π½Ρ‹ΠΉ индСкс с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, Π° ΠΏΠΎΡ‚ΠΎΠΌ удаляСт старый. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ total_shards_per_node Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½ ΠΈΠ»ΠΈ большС количСства основных ΡˆΠ°Ρ€Π΄ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π° ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΎΠ΄Π΅. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π±ΡƒΠ΄ΡƒΡ‚ увСдомлСния ΠΈ ΡˆΠ°Ρ€Π΄Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΅Π΄ΡƒΡ‚ Π½Π° Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½ΠΎΠ΄Ρ‹.

ДолгосрочноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch
ДолгосрочноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Elasticsearch

GET /shrink-k8s-ingress-2020.06.06-000025/_settings

{
  "shrink-k8s-ingress-2020.06.06-000025" : {
    "settings" : {
      "index" : {
        "refresh_interval" : "5s",
        "auto_expand_replicas" : "0-1",
        "blocks" : {
          "write" : "true"
        },
        "provided_name" : "shrink-k8s-ingress-2020.06.06-000025",
        "creation_date" : "1592225525569",
        "priority" : "100",
        "number_of_replicas" : "1",
        "uuid" : "psF4MiFGQRmi8EstYUQS4w",
        "version" : {
          "created" : "7060299",
          "upgraded" : "7060299"
        },
        "lifecycle" : {
          "name" : "k8s-ingress",
          "rollover_alias" : "k8s-ingress",
          "indexing_complete" : "true"
        },
        "codec" : "best_compression",
        "routing" : {
          "allocation" : {
            "initial_recovery" : {
              "_id" : "_Le0Ww96RZ-o76bEPAWWag"
            },
            "require" : {
              "_id" : null,
              "box_type" : "cold"
            },
            "total_shards_per_node" : "8"
          }
        },
        "number_of_shards" : "4",
        "routing_partition_size" : "1",
        "resize" : {
          "source" : {
            "name" : "k8s-ingress-2020.06.06-000025",
            "uuid" : "gNhYixO6Skqi54lBjg5bpQ"
          }
        }
      }
    }
  }
}

Cold-Ρ„Π°Π·Π°

Freeze (Π·Π°ΠΌΠΎΡ€ΠΎΠ·ΠΊΠ°) β€” ΠΌΡ‹ Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Π΅ΠΌ индСкс для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ запросов ΠΏΠΎ историчСским Π΄Π°Π½Π½Ρ‹ΠΌ.

Searches performed on frozen indices use the small, dedicated, search_throttled threadpool to control the number of concurrent searches that hit frozen shards on each node. This limits the amount of extra memory required for the transient data structures corresponding to frozen shards, which consequently protects nodes against excessive memory consumption.
Frozen indices are read-only: you cannot index into them.
Searches on frozen indices are expected to execute slowly. Frozen indices are not intended for high search load. It is possible that a search of a frozen index may take seconds or minutes to complete, even if the same searches completed in milliseconds when the indices were not frozen.

Π˜Ρ‚ΠΎΠ³ΠΈ

ΠœΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ΄Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ILM, настроили шаблон для распрСдСлСния ΡˆΠ°Ρ€Π΄ΠΎΠ² ΠΏΠΎ горячим Π½ΠΎΠ΄Π°ΠΌ ΠΈ настроили ILM Π½Π° индСкс со всСми Ρ„Π°Π·Π°ΠΌΠΈ ΠΆΠΈΠ·Π½ΠΈ.

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com