په Elasticsearch کې د اوږدې مودې ډاټا ذخیره کول

په Elasticsearch کې د اوږدې مودې ډاټا ذخیره کول

زما نوم ایګور سیډورینکو دی، زه د مدیرانو په ټیم کې تخنیکي مشر یم چې د ډومکلیک ټول زیربنا ساتي.

زه غواړم په 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 نوډونه).

هدف

دا تنظیمات انفرادي دي، دا ټول د نوډونو په ځای پورې اړه لري، د شاخصونو شمیر، لاګ، او نور. موږ هره ورځ 2-3 TB ډیټا لرو.

  • 5 ورځې - ګرم پړاو (8 اصلي / 1 نقل).
  • 20 ورځې - ګرم پړاو (shrink-index 4 اصلي / 1 نقل).
  • 90 ورځې - سړه مرحله (منجمد شاخص 4 اصلي / 1 نقل).
  • 120 ورځې - د ړنګولو مرحله.

د Elasticsearch تنظیم کول

د نوډونو په اوږدو کې د شارډ ویشلو لپاره، تاسو یوازې یو پیرامیټر ته اړتیا لرئ:

  • Hotنوډونه:
    ~]# 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 کې د اوږدې مودې ډاټا ذخیره کول

ترلاسه کړئ _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/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"
          }
        }
      }
    }
  }
}

سړه مرحله

لغوه کړ (فریز) - موږ د تاریخي معلوماتو په اړه پوښتنو ته د مطلوب کولو لپاره شاخص کنګل کوو.

په منجمد شاخصونو کې ترسره شوي لټونونه کوچني، وقف شوي، د لټون_throttled تار پول کاروي ترڅو د سمو لټونونو شمیر کنټرول کړي چې په هر نوډ کې منجمد شارډونه وهي. دا د اضافي حافظې مقدار محدودوي چې د انتقالي ډیټا جوړښتونو لپاره اړین دي چې د منجمد شارډونو سره مطابقت لري، چې په پایله کې نوډونه د ډیر حافظې مصرف په وړاندې ساتي.
منجمد شاخصونه یوازې د لوستلو وړ دي: تاسو نشئ کولی دوی ته اشاره وکړئ.
په منجمد شاخصونو کې لټونونه تمه کیږي چې ورو ورو اجرا شي. منجمد شاخصونه د لوړ لټون بار لپاره ندي. دا ممکنه ده چې د منجمد شاخص لټون ممکن څو ثانیې یا دقیقې بشپړ شي، حتی که ورته لټونونه په ملی ثانیو کې بشپړ شي کله چې شاخصونه کنګل شوي نه وي.

پایلې

موږ زده کړل چې څنګه د ILM سره کار کولو لپاره نوډونه چمتو کړو، د ګرمو نوډونو ترمنځ د شارډونو ویشلو لپاره یوه نمونه جوړه کړو، او د ژوند ټولو مرحلو سره د شاخص لپاره ILM ترتیب کړو.

ګټور لینکونه

سرچینه: www.habr.com