Elasticsearch рдорд╛ рджреАрд░реНрдШрдХрд╛рд▓реАрди рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг

Elasticsearch рдорд╛ рджреАрд░реНрдШрдХрд╛рд▓реАрди рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг

рдореЗрд░реЛ рдирд╛рдо Igor Sidorenko рд╣реЛ, рдо Domclick рдХреЛ рд╕рдореНрдкреВрд░реНрдг рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдХрд╛рдпрдо рдЧрд░реНрдиреЗ рдкреНрд░рд╢рд╛рд╕рдХрд╣рд░реВрдХреЛ рдЯреЛрд▓реАрдорд╛ рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ рдиреЗрддрд╛ рд╣реБрдБред

рдо Elasticsearch рдорд╛ рд╡рд┐рддрд░рд┐рдд рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рд╕реЗрдЯрдЕрдк рдорд╛ рдореЗрд░реЛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБред рд╣рд╛рдореА рдиреЛрдбрд╣рд░реВрдорд╛ рдХреБрди рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рд╢рд╛рд░реНрдбрд╣рд░реВрдХреЛ рд╡рд┐рддрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫрдиреН, ILM рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рд░ рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреЗрд░ рд╣реЗрд░реНрдиреЗрдЫреМрдВред

рд▓рдЧрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗрд╣рд░реВ, рдПрдХ рддрд░рд┐рдХрд╛ рд╡рд╛ рдЕрд░реНрдХреЛ, рдкрдЫрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рджреАрд░реНрдШрдХрд╛рд▓реАрди рднрдгреНрдбрд╛рд░рдгрдХреЛ рд╕рдорд╕реНрдпрд╛рдХреЛ рд╕рд╛рдордирд╛ рдЧрд░реНрдЫрдиреНред Elasticsearch рдорд╛, рдпреЛ рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рд╕рддреНрдп рд╣реЛ, рдХрд┐рдирднрдиреЗ рд╕рдмреИ рдХреБрд░рд╛ рдХреНрдпреВрд░реЗрдЯрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рдВрдЧ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рдерд┐рдпреЛред рд╕рдВрд╕реНрдХрд░рдг 6.6 рд▓реЗ ILM рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНтАНрдпреЛред рдпрд╕рд▓реЗ 4 рдЪрд░рдгрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ:

  • рддрд╛рддреЛ - рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдкрдорд╛ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рд░ рд╕реЛрдзрд┐рдПрдХреЛ рдЫред
  • рдиреНрдпрд╛рдиреЛ - рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЕрдм рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди, рддрд░ рдЕрдЭреИ рд╕реЛрдзрд┐рдПрдХреЛ рдЫред
  • рдЪрд┐рд╕реЛ - рд╕реВрдЪрдХрд╛рдВрдХ рдЕрдм рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди рд░ рд╡рд┐рд░рд▓реИ рд╕реЛрдзрд┐рдПрдХреЛ рдЫред рдЬрд╛рдирдХрд╛рд░реА рдЕрдЭреИ рдкрдирд┐ рдЦреЛрдЬреА рдпреЛрдЧреНрдп рд╣реБрдиреБрдкрд░реНрдЫ, рддрд░ рдкреНрд░рд╢реНрдирд╣рд░реВ рдврд┐рд▓реЛ рд╣реБрди рд╕рдХреНрдЫред
  • рдореЗрдЯреНрдиреБрд╣реЛрд╕реН - рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЕрдм рдЖрд╡рд╢реНрдпрдХ рдЫреИрди рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрдорд╛ рдореЗрдЯрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫред

рджрд┐рдПрдХреЛ рдЫ

  • Elasticsearch рдбрд╛рдЯрд╛ рд╣рдЯ: 24 рдкреНрд░реЛрд╕реЗрд╕рд░, 128 GB рдореЗрдореЛрд░реА, 1,8 TB SSD RAID 10 (8 рдиреЛрдбрд╣рд░реВ)ред
  • Elasticsearch рдбрд╛рдЯрд╛ рд╡рд╛рд░реНрдо: 24 рдкреНрд░реЛрд╕реЗрд╕рд░, 64 GB рдореЗрдореЛрд░реА, 8 TB NetApp SSD рдиреАрддрд┐ (4 рдиреЛрдбрд╣рд░реВ)ред
  • Elasticsearch рдбрд╛рдЯрд╛ рдХреЛрд▓реНрдб: 8 рдкреНрд░реЛрд╕реЗрд╕рд░, 32 GB рдореЗрдореЛрд░реА, 128 TB HDD RAID 10 (4 рдиреЛрдбрд╣рд░реВ)ред

рд▓рдХреНрд╖реНрдп

рдпреА рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣реБрдиреН, рдпреЛ рд╕рдмреИ рдиреЛрдбрд╣рд░реВрдорд╛ рд╕реНрдерд╛рдирдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫ, рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛, рд▓рдЧрд╣рд░реВ, рдЖрджрд┐ред рд╣рд╛рдореАрд╕рдБрдЧ рдкреНрд░рддрд┐ рджрд┐рди реи-рей TB рдбрд╛рдЯрд╛ рдЫред

  • 5 рджрд┐рди - рддрд╛рддреЛ рдЪрд░рдг (8 рдореБрдЦреНрдп / 1 рдкреНрд░рддрд┐рдХреГрддрд┐)ред
  • 20 рджрд┐рди - рддрд╛рддреЛ рдЪрд░рдг (рд╕рдВрдХреБрдЪрд┐рдд-рд╕реВрдЪрдХрд╛рдВрдХ 4 рдореБрдЦреНрдп / 1 рдкреНрд░рддрд┐рдХреГрддрд┐)ред
  • репреж рджрд┐рди - рдЪрд┐рд╕реЛ рдЕрд╡рд╕реНрдерд╛ (рд╕реНрдерд┐рд░-рд╕реВрдЪрдХрд╛рдВрдХ 4 рдореБрдЦреНрдп / 1 рдкреНрд░рддрд┐рдХреГрддрд┐)ред
  • 120 рджрд┐рди - рдЪрд░рдг рдореЗрдЯрд╛рдЙрдиреБрд╣реЛрд╕реНред

Elasticsearch рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

рдиреЛрдбрд╣рд░реВрдорд╛ рд╢рд╛рд░реНрдбрд╣рд░реВ рд╡рд┐рддрд░рдг рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХреЗрд╡рд▓ рдПрдЙрдЯрд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдЪрд╛рд╣рд┐рдиреНрдЫ:

  • рд╣рдЯ-рдиреЛрдбреНрд╕:
    ~]# cat /etc/elasticsearch/elasticsearch.yml | grep attr
    # Add custom attributes to the node:
    node.attr.box_type: hot
  • рдиреНрдпрд╛рдиреЛ-рдиреЛрдбреНрд╕:
    ~]# cat /etc/elasticsearch/elasticsearch.yml | grep attr
    # Add custom attributes to the node:
    node.attr.box_type: warm
  • рдЪрд┐рд╕реЛ-рдиреЛрдбреНрд╕:
    ~]# cat /etc/elasticsearch/elasticsearch.yml | grep attr
    # Add custom attributes to the node:
    node.attr.box_type: cold

Logstash рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

рдпреЛ рд╕рдмреИ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рд░ рд╣рд╛рдореАрд▓реЗ рдпреЛ рд╕реБрд╡рд┐рдзрд╛ рдХрд╕рд░реА рд▓рд╛рдЧреВ рдЧрд░реНрдпреМрдВ? Elasticsearch рдорд╛ рд▓рдЧрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрд░ рд╕реБрд░реБ рдЧрд░реМрдВред рддреНрдпрд╣рд╛рдБ рджреБрдИ рддрд░рд┐рдХрд╛рд╣рд░реВ рдЫрдиреН:

  1. Logstash рд▓реЗ рдХрд╛рдлреНрдХрд╛рдмрд╛рдЯ рд▓рдЧрд╣рд░реВ рд▓реНрдпрд╛рдЙрдБрдЫред рд╕рдлрд╛ рд▓рд┐рди рд╡рд╛ рдЖрдлреНрдиреЛ рдЫреЗрдЙрдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
  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
    }
}

рдХрд┐рдмрд╛рдирд╛ рд╕реЗрдЯрдЕрдк

рддреНрдпрд╣рд╛рдБ рдПрдХ рдЖрдзрд╛рд░ рдврд╛рдБрдЪрд╛ рдЫ рдЬреБрди рд╕рдмреИ рдирдпрд╛рдБ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВрдорд╛ рд▓рд╛рдЧреВ рд╣реБрдиреНрдЫред рдпрд╕рд▓реЗ рддрд╛рддреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХреЛ рд╡рд┐рддрд░рдг, рд╢рд╛рд░реНрдбрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛, рдкреНрд░рддрд┐рдХреГрддрд┐рд╣рд░реВ, рдЖрджрд┐ рд╕реЗрдЯ рдЧрд░реНрджрдЫред рдЯреЗрдореНрдкреНрд▓реЗрдЯрдХреЛ рд╡рдЬрди рд╡рд┐рдХрд▓реНрдк рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░рд┐рдиреНрдЫ 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 рдорд╛ рджреАрд░реНрдШрдХрд╛рд▓реАрди рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг

_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 рдорд╛ рджреАрд░реНрдШрдХрд╛рд▓реАрди рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг

_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" : { }
          }
        }
      }
    }
  }
}

рд╕рдорд╕реНрдпрд╛рд╣рд░реВ

рд╕реЗрдЯрдЕрдк рд░ рдбрд┐рдмрдЧрд┐рдЩ рдЪрд░рдгрдорд╛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдерд┐рдПред

рддрд╛рддреЛ рдЪрд░рдг

рд╕реВрдЪрдХрд╣рд░реВрдХреЛ рд╕рд╣реА рд░реЛрдЯреЗрд╢рдирдХреЛ рд▓рд╛рдЧрд┐, рдЕрдиреНрддреНрдпрдорд╛ рдЙрдкрд╕реНрдерд┐рддрд┐ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ index_name-date-000026 рдврд╛рдБрдЪрд╛ рдирдореНрдмрд░рд╣рд░реВ 000001ред рддреНрдпрд╣рд╛рдБ рдХреЛрдбрдорд╛ рд░реЗрдЦрд╛рд╣рд░реВ рдЫрдиреН рдЬреБрди рдЕрдиреНрддрдорд╛ рд╕рдВрдЦреНрдпрд╛рд╣рд░реВрдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫред рдЕрдиреНрдпрдерд╛, рддреНрдпрд╣рд╛рдБ рддреНрд░реБрдЯрд┐ рд╣реБрдиреЗрдЫ, рд╕реВрдЪрдХрд╛рдВрдХрдорд╛ рдХреБрдиреИ рдиреАрддрд┐ рд▓рд╛рдЧреВ рдЧрд░рд┐рдиреЗ рдЫреИрди, рд░ рдпреЛ рд╕рдзреИрдВ рддрд╛рддреЛ рдЪрд░рдгрдорд╛ рд╣реБрдиреЗрдЫред

рддрд╛рддреЛ рдЪрд░рдг

рдЦреБрдореНрдЪреНрдпрд╛рдЙрдиреБрд╣реЛрд╕реН (рдХрдЯрдЕрдл) тАФ рд╢рд╛рд░реНрдбрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдШрдЯрд╛рдЙрдБрджреИ, рдХрд┐рдирднрдиреЗ рд╣рд╛рдореАрд╕рдБрдЧ рддрд╛рддреЛ рд░ рдЪрд┐рд╕реЛ рдЪрд░рдгрд╣рд░реВрдорд╛ 4 рдиреЛрдбрд╣рд░реВ рдЫрдиреНред рдХрд╛рдЧрдЬрд╛рддрдорд╛ рдирд┐рдореНрди рд░реЗрдЦрд╛рд╣рд░реВ рдЫрдиреН:

  • рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкрдвреНрдиреЗ рдорд╛рддреНрд░ рд╣реБрдиреБрдкрд░реНрдЫред
  • рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рд░реНрдбрдХреЛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдПрдЙрдЯреИ рдиреЛрдбрдорд╛ рд░рд╣рдиреБ рдкрд░реНрдЫред
  • рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╕реНрдерд┐рддрд┐ рд╣рд░рд┐рдпреЛ рд╣реБрдиреБрдкрд░реНрдЫред

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХрд╛рдБрдЯреНрдирдХрд╛ рд▓рд╛рдЧрд┐, Elasticsearch рд▓реЗ рд╕рдмреИ рдкреНрд░рд╛рдердорд┐рдХ рд╢рд╛рд░реНрдбрд╣рд░реВрд▓рд╛рдИ рдПрдЙрдЯрд╛ рдиреЛрдбрдорд╛ рд╕рд╛рд░реНрдЫ, рдЖрд╡рд╢реНрдпрдХ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдЯрд┐рдПрдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХреЛ рдирдХреНрдХрд▓ рдЧрд░реНрдЫ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдкреБрд░рд╛рдиреЛрд▓рд╛рдИ рдореЗрдЯрд╛рдЙрдБрдЫред рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ total_shards_per_node рдПрдХ рдиреЛрдбрдорд╛ рдлрд┐рдЯ рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐ рдореБрдЦреНрдп рд╢рд╛рд░реНрдбрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдмрд░рд╛рдмрд░ рд╡рд╛ рдмрдвреА рд╣реБрдиреБрдкрд░реНрдЫред рдЕрдиреНрдпрдерд╛, рддреНрдпрд╣рд╛рдБ рд╕реВрдЪрдирд╛рд╣рд░реВ рд╣реБрдиреЗрдЫрдиреН рд░ рд╢рд╛рд░реНрдбрд╣рд░реВ рд╕рд╣реА рдиреЛрдбрд╣рд░реВрдорд╛ рд╕рд╛рд░рд┐рдиреЗ рдЫреИрдирдиреНред

Elasticsearch рдорд╛ рджреАрд░реНрдШрдХрд╛рд▓реАрди рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг
Elasticsearch рдорд╛ рджреАрд░реНрдШрдХрд╛рд▓реАрди рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг

GET /srink-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"
          }
        }
      }
    }
  }
}

рдЪрд┐рд╕реЛ рдЪрд░рдг

рдЬрдореНрдиреБ (рдлреНрд░рд┐рдЬ) - рд╣рд╛рдореА рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдбреЗрдЯрд╛рдорд╛ рдкреНрд░рд╢реНрдирд╣рд░реВ рдЕрдиреБрдХреВрд▓рди рдЧрд░реНрди рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдлреНрд░рд┐рдЬ рдЧрд░реНрдЫреМрдВред

рдЬрдореЗ рднрдПрдХрд╛ рд╕реВрдЪрдХрд╣рд░реВрдорд╛ рдЧрд░рд┐рдПрдХрд╛ рдЦреЛрдЬрд╣рд░реВрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбрдорд╛ рдЬрдореЗрдХреЛ рд╢рд╛рд░реНрдбрд╣рд░реВрд▓рд╛рдИ рд╣рд┐рдЯ рдЧрд░реНрдиреЗ рд╕рдорд╡рд░реНрддреА рдЦреЛрдЬрд╣рд░реВрдХреЛ рд╕рдЩреНрдЦреНрдпрд╛ рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрди рд╕рд╛рдиреЛ, рд╕рдорд░реНрдкрд┐рдд, рдЦреЛрдЬ_рдереНрд░реЛрдЯрд▓ рдереНрд░реЗрдбрдкреВрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рдпрд╕рд▓реЗ рдЬрдореЗ рднрдПрдХрд╛ рд╢рд╛рд░реНрдбрд╣рд░реВрд╕рдБрдЧ рдорд┐рд▓реНрджреЛрдЬреБрд▓реНрджреЛ рдЕрд╕реНрдерд╛рдпреА рдбрд╛рдЯрд╛ рд╕рдВрд░рдЪрдирд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реАрдХреЛ рдорд╛рддреНрд░рд╛рд▓рд╛рдИ рд╕реАрдорд┐рдд рдЧрд░реНрдЫ, рдЬрд╕рд▓реЗ рдиреЛрдбрд╣рд░реВрд▓рд╛рдИ рдЕрддреНрдпрдзрд┐рдХ рдореЗрдореЛрд░реА рдЦрдкрддрдмрд╛рдЯ рдЬреЛрдЧрд╛рдЙрдБрдЫред
рдЬрдореЗ рднрдПрдХрд╛ рд╕реВрдЪрдХрд╣рд░реВ рдкрдвреНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рд╣реБрдиреН: рддрдкрд╛рдИрдВрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдорд╛ рд░рд╛рдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдиред
рд╕реНрдерд┐рд░ рд╕реВрдЪрдХрд╛рдВрдХрд╣рд░реВрдорд╛ рдЦреЛрдЬрд╣рд░реВ рдмрд┐рд╕реНрддрд╛рд░реИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реБрдиреЗ рдЕрдкреЗрдХреНрд╖рд╛ рдЧрд░рд┐рдПрдХреЛ рдЫред рдЬрдореЗрдХреЛ рд╕реВрдЪрдХрд╛рдЩреНрдХрд╣рд░реВ рдЙрдЪреНрдЪ рдЦреЛрдЬ рд▓реЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдЕрднрд┐рдкреНрд░реЗрд░рд┐рдд рдЫреИрдирдиреНред рдпреЛ рд╕рдореНрднрд╡ рдЫ рдХрд┐ рд╕реНрдерд┐рд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХреЛ рдЦреЛрдЬ рдкреВрд░рд╛ рд╣реБрди рд╕реЗрдХреЗрдиреНрдб рд╡рд╛ рдорд┐рдиреЗрдЯ рд▓рд╛рдЧреНрди рд╕рдХреНрдЫ, рдпрджреНрдпрдкрд┐ рд╕рдорд╛рди рдЦреЛрдЬрд╣рд░реВ рдорд┐рд▓рд┐рд╕реЗрдХреЗрдиреНрдбрдорд╛ рдкреВрд░рд╛ рднрдП рддрд╛рдкрдирд┐ рд╕реВрдЪрдХрд╛рдВрдХрд╣рд░реВ рдЬрдореЗрдХреЛ рдерд┐рдПрдиред

рдкрд░рд┐рдгрд╛рдорд╣рд░реВ

рд╣рд╛рдореАрд▓реЗ ILM рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдиреЛрдбрд╣рд░реВ рдХрд╕рд░реА рддрдпрд╛рд░ рдЧрд░реНрдиреЗ, рддрд╛рддреЛ рдиреЛрдбрд╣рд░реВ рдмреАрдЪ рд╢рд╛рд░реНрдбрд╣рд░реВ рд╡рд┐рддрд░рдг рдЧрд░реНрди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ, рд░ рдЬреАрд╡рдирдХрд╛ рд╕рдмреИ рдЪрд░рдгрд╣рд░реВ рднрдПрдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХреЛ рд▓рд╛рдЧрд┐ ILM рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рд╕рд┐рдХрд╛рдпреМрдВред

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдЩреНрдХрд╣рд░реВ

рд╕реНрд░реЛрдд: www.habr.com