Ngaran abdi Igor Sidorenko, Kami pamimpin teknis dina tim admins anu ngajaga sakabéh infrastruktur Domclick.
Abdi hoyong bagikeun pangalaman abdi dina nyetel neundeun data disebarkeun di Elasticsearch. Urang bakal ningali naon setélan dina titik anu tanggung jawab distribusi beling, kumaha ILM jalan sareng jalanna.
Jalma anu digawekeun ku log, hiji cara atawa sejen, nyanghareupan masalah neundeun jangka panjang pikeun analisis engké. Dina Elasticsearch, ieu hususna leres, sabab sadayana hanjakal sareng fungsionalitas kurator. Vérsi 6.6 ngawanohkeun fungsionalitas ILM. Ieu diwangun ku 4 fase:
Panas - Indéks ieu aktip diropéa sareng ditaros.
Haneut - Indéks henteu deui diropéa, tapi masih ditaroskeun.
Tiis - Indéks henteu deui diropéa sareng jarang ditaroskeun. Inpormasi kedah tetep tiasa dipilarian, tapi patarosan tiasa langkung laun.
Hapus - Indéks henteu diperyogikeun deui sareng tiasa dihapus sacara aman.
90 poé - Fase tiis (freeze-indéks 4 utama / 1 réplika).
120 poé - fase Hapus.
Nyetél Elasticsearch
Pikeun ngadistribusikaeun hiji beling sakuliah titik, anjeun peryogi ngan hiji parameter:
panas- titik:
~]# cat /etc/elasticsearch/elasticsearch.yml | grep attr
# Add custom attributes to the node:
node.attr.box_type: hot
haneut- titik:
~]# cat /etc/elasticsearch/elasticsearch.yml | grep attr
# Add custom attributes to the node:
node.attr.box_type: warm
tiis- titik:
~]# cat /etc/elasticsearch/elasticsearch.yml | grep attr
# Add custom attributes to the node:
node.attr.box_type: cold
Nyetél Logstash
Kumaha éta sadayana dianggo sareng kumaha urang nerapkeun fitur ieu? Hayu urang mimitian ku asup log kana Elasticsearch. Aya dua cara:
Logstash nyokot log ti Kafka. Bisa nyokot bersih atawa ngarobah di sisi Anjeun.
Hal sorangan nyerat ka Elasticsearch, contona, server APM.
Pertimbangkeun conto ngatur indéks ngaliwatan Logstash. Éta nyiptakeun indéks sareng nerapkeunana pola indéks sarta pakait 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
}
}
Setélan kibana
Aya pola dasar anu manglaku ka sadaya indéks énggal. Éta nyetél distribusi indéks panas, jumlah beling, réplika, jsb. Beurat template ditangtukeun ku pilihan order. Témplat anu beuratna langkung luhur nimpa parameter citakan anu tos aya atanapi tambahkeun anu énggal.
GET_template/standar
{
"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" : { }
}
}
Lajeng nerapkeun pemetaan ka indexes k8s-ingress-* ngagunakeun citakan anu beuratna leuwih luhur.
Saatos nerapkeun sadaya témplat, urang nerapkeun kawijakan ILM sareng mimitian ngawaskeun kahirupan indéks.
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" : { }
}
}
}
}
}
}
Anu jadi masalah
Aya masalah dina tahap setelan sareng debugging.
Fase panas
Pikeun rotasi indéks anu leres, ayana dina tungtung penting index_name-date-000026 angka format 000001. Aya garis dina kode anu pariksa indéks ngagunakeun ekspresi biasa pikeun ayana angka dina tungtungna. Upami teu kitu, bakal aya kasalahan, euweuh kawijakan bakal dilarapkeun ka indéks, sarta eta bakal salawasna dina fase panas.
Fase haneut
ngurangan (cutoff) - ngurangan jumlah shards, sabab urang boga 4 titik dina fase haneut tur tiis Dokuméntasi ngandung garis handap:
Indéksna kedah dibaca wungkul.
Salinan unggal beling dina indéks kedah aya dina titik anu sami.
Status kaséhatan klaster kudu héjo.
Pikeun prune indéks, Elasticsearch mindahkeun sakabéh beling primér kana hiji titik, duplikat indéks truncated kalawan parameter diperlukeun, lajeng ngahapus nu heubeul. Parameter total_shards_per_node kudu sarua atawa leuwih gede ti jumlah shards utama pikeun pas dina hiji titik. Upami teu kitu, bakal aya bewara sareng beling moal ngalih ka titik anu leres.
GET / ngaleutikan-k8s-ingress-2020.06.06-000025/_settings
ngagiblegkeun (freeze) - Urang freeze indéks pikeun ngaoptimalkeun queries on data sajarah.
Pilarian anu dilakukeun dina indéks beku nganggo threadpool leutik, dedicated, search_throttled pikeun ngadalikeun jumlah pamilarian sakaligus anu pencét beling beku dina unggal titik. Ieu ngabatesan jumlah mémori tambahan anu dipikabutuh pikeun struktur data fana anu pakait sareng beling beku, anu akibatna ngajaga titik tina konsumsi mémori anu kaleuleuwihan.
Indéks beku ngan ukur dibaca: anjeun moal tiasa ngindeks kana éta.
Pilarian dina indéks beku diperkirakeun ngajalankeun lalaunan. indéks beku teu dimaksudkeun pikeun beban pilarian tinggi. Ieu mungkin yen pilarian tina indéks beku butuh sababaraha detik atawa menit pikeun réngsé, sanajan pilarian sarua réngsé dina milliseconds nalika indéks teu beku.
hasil
Urang diajar kumaha carana nyiapkeun titik pikeun gawé bareng ILM, nyetél template pikeun ngadistribusikaeun shards diantara titik panas, tur nyetel ILM pikeun indéks kalayan sagala fase kahirupan.