Elasticsearch เชฎเชพเช‚ เชฒเชพเช‚เชฌเชพ เช—เชพเชณเชพเชจเชพ เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐเซ‡เชœ

Elasticsearch เชฎเชพเช‚ เชฒเชพเช‚เชฌเชพ เช—เชพเชณเชพเชจเชพ เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐเซ‡เชœ

เชฎเชพเชฐเซเช‚ เชจเชพเชฎ เช‡เช—เซ‹เชฐ เชธเชฟเชกเซ‹เชฐเซ‡เชจเซเช•เซ‹ เช›เซ‡, เชนเซเช‚ เชเชกเชฎเชฟเชจเซเชธเชจเซ€ เชŸเซ€เชฎเชฎเชพเช‚ เชเช• เชŸเซ‡เช•เชจเชฟเช•เชฒ เชฒเซ€เชกเชฐ เช›เซเช‚ เชœเซ‡ เชกเซ‹เชฎเช•เซเชฒเชฟเช•เชจเชพ เชธเชฎเช—เซเชฐ เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซ‡ เชœเชพเชณเชตเซ‡ เช›เซ‡.

เชนเซเช‚ Elasticsearch เชฎเชพเช‚ เชตเชฟเชคเชฐเชฟเชค เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐเซ‡เชœ เชธเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เชฎเชพเชฐเซ‹ เช…เชจเซเชญเชต เชถเซ‡เชฐ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚. เช…เชฎเซ‡ เชœเซ‹เชˆเชถเซเช‚ เช•เซ‡ เช—เชพเช‚เช เซ‹ เชชเชฐเชจเซ€ เช•เชˆ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชถเชพเชฐเซเชกเชจเชพ เชตเชฟเชคเชฐเชฃ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡, ILM เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡.

เชœเซ‡เช“ เชฒเซ‹เช— เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เชเช• เชฐเซ€เชคเซ‡ เช…เชฅเชตเชพ เชฌเซ€เชœเซ€ เชฐเซ€เชคเซ‡, เชชเช›เซ€เชจเชพ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฎเชพเชŸเซ‡ เชฒเชพเช‚เชฌเชพ เช—เชพเชณเชพเชจเชพ เชธเซเชŸเซ‹เชฐเซ‡เชœเชจเซ€ เชธเชฎเชธเซเชฏเชพเชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชตเซ‹ เชชเชกเซ‡ เช›เซ‡. Elasticsearch เชฎเชพเช‚, เช† เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชธเชพเชšเซเช‚ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เช•เซเชฏเซเชฐเซ‡เชŸเชฐ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชธเชพเชฅเซ‡ เชฌเชงเซเช‚ เช•เชฎเชจเชธเซ€เชฌ เชนเชคเซเช‚. เชธเช‚เชธเซเช•เชฐเชฃ 6.6 เช ILM เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชฐเชœเซ‚ เช•เชฐเซ€. เชคเซ‡ 4 เชคเชฌเช•เซเช•เชพเช“ เชงเชฐเชพเชตเซ‡ เช›เซ‡:

  • เช—เชฐเชฎ - เช‡เชจเซเชกเซ‡เช•เซเชธ เชธเช•เซเชฐเชฟเชฏเชชเชฃเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชฐเชนเซเชฏเซ‹ เช›เซ‡ เช…เชจเซ‡ เชชเซ‚เช›เชชเชฐเช› เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชฐเชนเซ€ เช›เซ‡.
  • เช—เชฐเชฎ - เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เชนเชตเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชนเชœเซ เชชเชฃ เชชเซ‚เช›เชชเชฐเช› เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชฐเชนเซ€ เช›เซ‡.
  • เช•เซ‹เชฒเซเชก - เช‡เชจเซเชกเซ‡เช•เซเชธ เชนเชตเซ‡ เช…เชชเชกเซ‡เชŸ เชฅเชคเซ‹ เชจเชฅเซ€ เช…เชจเซ‡ เชญเชพเช—เซเชฏเซ‡ เชœ เชชเซ‚เช›เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชฎเชพเชนเชฟเชคเซ€ เชนเชœเซ เชชเชฃ เชถเซ‹เชงเชตเชพ เชฏเซ‹เช—เซเชฏ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช, เชชเชฐเช‚เชคเซ เช•เซเชตเซ‡เชฐเซ€ เชงเซ€เชฎเซ€ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡.
  • เช•เชพเชขเซ€ เชจเชพเช–เซ‹ - เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเชจเซ€ เชนเชตเซ‡ เชœเชฐเซ‚เชฐ เชจเชฅเซ€ เช…เชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเซ€เชคเซ‡ เช•เชพเชขเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เช†เชชเซ‡เชฒ

  • Elasticsearch เชกเซ‡เชŸเชพ เชนเซ‹เชŸ: 24 เชชเซเชฐเซ‹เชธเซ‡เชธเชฐเซเชธ, 128 GB เชฎเซ‡เชฎเชฐเซ€, 1,8 TB SSD RAID 10 (8 เชจเซ‹เชกเซเชธ).
  • เช‡เชฒเชพเชธเซเชŸเชฟเช•เชธเชฐเซเชš เชกเซ‡เชŸเชพ เชตเซ‹เชฐเซเชฎ: 24 เชชเซเชฐเซ‹เชธเซ‡เชธเชฐเซเชธ, 64 เชœเซ€เชฌเซ€ เชฎเซ‡เชฎเชฐเซ€, 8 เชŸเซ€เชฌเซ€ เชจเซ‡เชŸเชเชช เชเชธเชเชธเชกเซ€ เชชเซ‹เชฒเชฟเชธเซ€ (4 เชจเซ‹เชกเซเชธ).
  • Elasticsearch เชกเซ‡เชŸเชพ เช•เซ‹เชฒเซเชก: 8 เชชเซเชฐเซ‹เชธเซ‡เชธเชฐเซเชธ, 32 GB เชฎเซ‡เชฎเชฐเซ€, 128 TB HDD RAID 10 (4 เชจเซ‹เชกเซเชธ).

เชฒเช•เซเชทเซเชฏ

เช† เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชตเซเชฏเช•เซเชคเชฟเช—เชค เช›เซ‡, เชคเซ‡ เชฌเชงเชพ เช—เชพเช‚เช เซ‹ เชชเชฐเชจเชพ เชธเซเชฅเชพเชจ, เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเช“เชจเซ€ เชธเช‚เช–เซเชฏเชพ, เชฒเซ‰เช—เซเชธ เชตเช—เซ‡เชฐเซ‡ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡. เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฆเชฐเชฐเซ‹เชœ 2-3 TB เชกเซ‡เชŸเชพ เช›เซ‡.

  • 5 เชฆเชฟเชตเชธ - เช—เชฐเชฎ เชคเชฌเช•เซเช•เซ‹ (8 เชฎเซเช–เซเชฏ / 1 เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ).
  • 20 เชฆเชฟเชตเชธ - เช—เชฐเชฎ เชคเชฌเช•เซเช•เซ‹ (เชธเช‚เช•เซ‹เชšเซ‹-เช‡เชจเซเชกเซ‡เช•เซเชธ 4 เชฎเซเช–เซเชฏ / 1 เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ).
  • 90 เชฆเชฟเชตเชธ - เชถเซ€เชค เชคเชฌเช•เซเช•เซ‹ (เชซเซเชฐเซ€เช-เช‡เชจเซเชกเซ‡เช•เซเชธ 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. เช‡เชฒเชพเชธเซเชŸเชฟเช•เชธเชฐเซเชš เชชเชฐ เช•เช‚เชˆเช• เชฒเช–เซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชเชชเซ€เชเชฎ เชธเชฐเซเชตเชฐ.

Logstash เชฆเซเชตเชพเชฐเชพ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเช“เชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเชพเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เชตเชฟเชšเชพเชฐ เช•เชฐเซ‹. เชคเซ‡ เช‡เชจเซเชกเซ‡เช•เซเชธ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฒเชพเช—เซ เชชเชกเซ‡ เช›เซ‡ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เชชเซ‡เชŸเชฐเซเชจ เช…เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช†เชˆเชเชฒเชเชฎ.

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 เชฎเชพเช‚ เชฒเชพเช‚เชฌเชพ เช—เชพเชณเชพเชจเชพ เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐเซ‡เชœ

_เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ/เชกเชฟเชซเซ‹เชฒเซเชŸ เชฎเซ‡เชณเชตเซ‹

{
  "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 เชจเซ‹เชกเซเชธ เช›เซ‡. เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃเชฎเชพเช‚ เชจเซ€เชšเซ‡เชจเซ€ เชฒเซ€เชŸเซ€เช“ เช›เซ‡:

  • เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เชซเช•เซเชค เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เชœ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช.
  • เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเชฎเชพเช‚ เชฆเชฐเซ‡เช• เชถเชพเชฐเซเชกเชจเซ€ เชจเช•เชฒ เชธเชฎเชพเชจ เชจเซ‹เชก เชชเชฐ เชฐเชนเซ‡เชตเซ€ เชœเซ‹เชˆเช.
  • เช•เซเชฒเชธเซเชŸเชฐ เช†เชฐเซ‹เช—เซเชฏ เชธเซเชฅเชฟเชคเชฟ เชฒเซ€เชฒเซ€ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช.

เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเชจเซ‡ เช•เชพเชชเชตเชพ เชฎเชพเชŸเซ‡, เช‡เชฒเชพเชธเซเชŸเชฟเช•เชธเชฐเซเชš เชคเชฎเชพเชฎ เชชเซเชฐเชพเชฅเชฎเชฟเช• เชถเชพเชฐเซเชกเชจเซ‡ เชเช• เชจเซ‹เชก เชชเชฐ เช–เชธเซ‡เชกเซ‡ เช›เซ‡, เชœเชฐเซ‚เชฐเซ€ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชธเชพเชฅเซ‡ เช•เชชเชพเชฏเซ‡เชฒ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเชจเซเช‚ เชกเซเชชเซเชฒเชฟเช•เซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชชเช›เซ€ เชœเซ‚เชจเชพเชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เซ‡ เช›เซ‡. เชชเชฐเชฟเชฎเชพเชฃ total_shards_per_node เชเช• เชจเซ‹เชก เชชเชฐ เชซเชฟเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซเช–เซเชฏ เชถเชพเชฐเซเชกเซเชธเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชœเซ‡เชŸเชฒเซ€ เช…เชฅเชตเชพ เชคเซ‡เชจเชพเชฅเซ€ เชตเชงเซ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช. เชจเชนเชฟเช‚เชคเชฐ, เชธเซ‚เชšเชจเชพเช“ เชนเชถเซ‡ เช…เชจเซ‡ เชถเชพเชฐเซเชกเซเชธ เชฏเซ‹เช—เซเชฏ เชจเซ‹เชกเซเชธ เชชเชฐ เชœเชถเซ‡ เชจเชนเซ€เช‚.

Elasticsearch เชฎเชพเช‚ เชฒเชพเช‚เชฌเชพ เช—เชพเชณเชพเชจเชพ เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐเซ‡เชœ
Elasticsearch เชฎเชพเช‚ เชฒเชพเช‚เชฌเชพ เช—เชพเชณเชพเชจเชพ เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐเซ‡เชœ

เชฎเซ‡เชณเชตเซ‹ /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"
          }
        }
      }
    }
  }
}

เชถเซ€เชค เชคเชฌเช•เซเช•เซ‹

เชธเซเชฅเชฟเชฐ (เชซเซเชฐเซ€เช) - เช…เชฎเซ‡ เชเชคเชฟเชนเชพเชธเชฟเช• เชกเซ‡เชŸเชพ เชชเชฐ เช•เซเชตเซ‡เชฐเซ€เชเชจเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช‡เชจเซเชกเซ‡เช•เซเชธเชจเซ‡ เชธเซเชฅเชฟเชฐ เช•เชฐเซ€เช เช›เซ€เช.

เชธเซเชฅเชฟเชฐ เชธเซ‚เชšเช•เชพเช‚เช•เซ‹ เชชเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชคเซ€ เชถเซ‹เชงเซ‹ เชฆเชฐเซ‡เช• เชจเซ‹เชก เชชเชฐ เชธเซเชฅเชฟเชฐ เชถเชพเชฐเซเชกเซเชธเชจเซ‡ เชนเชฟเชŸ เช•เชฐเชคเซ€ เชธเชฎเชตเชฐเซเชคเซ€ เชถเซ‹เชงเซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพเชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชจเชพเชจเชพ, เชธเชฎเชฐเซเชชเชฟเชค, เชถเซ‹เชง_เชฅเซเชฐเซ‹เชŸเชฒเซ‡เชก เชฅเซเชฐเซ‡เชกเชชเซ‚เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. เช† เชซเซเชฐเซ‹เชเชจ เชถเชพเชฐเซเชกเซเชธเชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช•เซเชทเชฃเชฟเช• เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชตเชงเชพเชฐเชพเชจเซ€ เชฎเซ‡เชฎเชฐเซ€เชจเซ€ เชฎเชพเชคเซเชฐเชพเชจเซ‡ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ‡ เช—เชพเช‚เช เซ‹เชจเซ‡ เชตเชงเซ เชชเชกเชคเชพ เชฎเซ‡เชฎเชฐเซ€ เชตเชชเชฐเชพเชถ เชธเชพเชฎเซ‡ เชฐเช•เซเชทเชฃ เช†เชชเซ‡ เช›เซ‡.
เชธเซเชฅเชฟเชฐ เชธเซ‚เชšเช•เชพเช‚เช•เซ‹ เชซเช•เซเชค เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เช›เซ‡: เชคเชฎเซ‡ เชคเซ‡เชฎเชพเช‚ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€.
เชธเซเชฅเชฟเชฐ เชธเซ‚เชšเช•เชพเช‚เช•เซ‹ เชชเชฐ เชถเซ‹เชง เชงเซ€เชฎเซ‡ เชงเซ€เชฎเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เช†เชตเซ‡ เชคเซ‡เชตเซ€ เช…เชชเซ‡เช•เซเชทเชพ เช›เซ‡. เชธเซเชฅเชฟเชฐ เชธเซ‚เชšเช•เชพเช‚เช•เซ‹ เช‰เชšเซเชš เชถเซ‹เชง เชฒเซ‹เชก เชฎเชพเชŸเซ‡ เชฌเชจเชพเชตเชพเชฏเซ‡เชฒ เชจเชฅเซ€. เชถเช•เซเชฏ เช›เซ‡ เช•เซ‡ เชธเซเชฅเชฟเชฐ เชธเซ‚เชšเช•เชพเช‚เช•เชจเซ€ เชถเซ‹เชง เชชเซ‚เชฐเซเชฃ เชฅเชตเชพเชฎเชพเช‚ เชธเซ‡เช•เชจเซเชกเซ‹ เช…เชฅเชตเชพ เชฎเชฟเชจเชฟเชŸ เชฒเชพเช—เซ€ เชถเช•เซ‡, เชญเชฒเซ‡ เชคเซ‡ เชœ เชถเซ‹เชง เชœเซเชฏเชพเชฐเซ‡ เชธเซ‚เชšเช•เชพเช‚เช•เซ‹ เชธเซเชฅเชฟเชฐ เชจ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชฎเชฟเชฒเชฟเชธเซ‡เช•เชจเซเชกเชฎเชพเช‚ เชชเซ‚เชฐเซเชฃ เชฅเชพเชฏ.

เชชเชฐเชฟเชฃเชพเชฎเซ‹

เช…เชฎเซ‡ เชถเซ€เช–เซเชฏเชพ เช•เซ‡ ILM เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชจเซ‹เชกเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพ, เช—เชฐเชฎ เช—เชพเช‚เช เซ‹ เชตเชšเซเชšเซ‡ เชถเชพเชฐเซเชกเซเชธเชจเซเช‚ เชตเชฟเชคเชฐเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ เชธเซ‡เชŸ เช•เชฐเชตเซเช‚ เช…เชจเซ‡ เชœเซ€เชตเชจเชจเชพ เชคเชฎเชพเชฎ เชคเชฌเช•เซเช•เชพเช“ เชธเชพเชฅเซ‡ เช‡เชจเซเชกเซ‡เช•เซเชธ เชฎเชพเชŸเซ‡ ILM เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเซเช‚.

เช‰เชชเชฏเซ‹เช—เซ€ เชฒเชฟเช‚เช•เซเชธ

เชธเซ‹เชฐเซเชธ: www.habr.com