Fluentd: Għaliex huwa importanti li jiġi kkonfigurat il-buffer tal-output
Illum il-ġurnata, huwa impossibbli li wieħed jimmaġina proġett ibbażat fuq Kubernetes mingħajr il-munzell ELK, li jiffranka zkuk kemm tal-applikazzjonijiet kif ukoll tal-komponenti tas-sistema tal-cluster. Fil-prattika tagħna, nużaw il-munzell EFK ma 'Fluentd minflok Logstash.
Fluentd huwa kollettur ta 'zkuk modern u universali li qed jikseb aktar u aktar popolarità u ngħaqad mal-Cloud Native Computing Foundation, u huwa għalhekk li l-vettur tal-iżvilupp tiegħu huwa ffukat fuq l-użu flimkien ma' Kubernetes.
Il-fatt li tuża Fluentd minflok Logstash ma jbiddilx l-essenza ġenerali tal-pakkett tas-softwer, madankollu, Fluentd huwa kkaratterizzat minn sfumaturi speċifiċi tiegħu stess li jirriżultaw mill-versatilità tiegħu.
Pereżempju, meta bdejna nużaw l-EFK fi proġett impenjattiv b'intensità għolja ta 'logging, konna ffaċċjati bil-fatt li f'Kibana xi messaġġi ġew murija ripetutament diversi drabi. F'dan l-artikolu aħna ngħidulek għaliex dan il-fenomenu jseħħ u kif issolvi l-problema.
Il-problema tad-duplikazzjoni tad-dokumenti
Fil-proġetti tagħna, Fluentd huwa skjerat bħala DaemonSet (imniedi awtomatikament f'istanza waħda fuq kull nodu tal-cluster Kubernetes) u jimmonitorja z-zkuk tal-kontenituri stdout f'/var/log/containers. Wara l-ġbir u l-ipproċessar, ir-zkuk fil-forma ta 'dokumenti JSON jintbagħtu lil ElasticSearch, imqajma f'forma ta' cluster jew waħedha, skont l-iskala tal-proġett u r-rekwiżiti għall-prestazzjoni u t-tolleranza tal-ħsarat. Kibana jintuża bħala l-interface grafika.
Meta użaw Fluentd ma 'plugin tal-buffering tal-output, iltqajna ma' sitwazzjoni fejn xi dokumenti f'ElasticSearch kellhom eżattament l-istess kontenut u kienu differenti biss fl-identifikatur. Tista 'tivverifika li din hija ripetizzjoni ta' messaġġ billi tuża l-log Nginx bħala eżempju. Fil-log file, dan il-messaġġ jeżisti f'kopja waħda:
Barra minn hekk, jista 'jkun hemm aktar minn żewġ repetizzjonijiet.
Waqt li tirranġa din il-problema fir-reġistri Fluentd, tista' tara numru kbir ta' twissijiet bil-kontenut li ġej:
2020-01-16 01:46:46 +0000 [warn]: [test-prod] failed to flush the buffer. retry_time=4 next_retry_seconds=2020-01-16 01:46:53 +0000 chunk="59c37fc3fb320608692c352802b973ce" error_class=Fluent::Plugin::ElasticsearchOutput::RecoverableRequestFailure error="could not push logs to Elasticsearch cluster ({:host=>"elasticsearch", :port=>9200, :scheme=>"http", :user=>"elastic", :password=>"obfuscated"}): read timeout reached"
Dawn it-twissijiet iseħħu meta ElasticSearch ma jistax jirritorna tweġiba għal talba fiż-żmien speċifikat mill-parametru request_timeout, u huwa għalhekk li l-framment tal-buffer mibgħut ma jistax jiġi kklerjat. Wara dan, Fluentd jipprova jibgħat il-framment tal-buffer lil ElasticSearch għal darb'oħra u wara numru arbitrarju ta' tentattivi, l-operazzjoni titlesta b'suċċess:
Madankollu, ElasticSearch jittratta kull wieħed mill-frammenti tal-buffer trasferiti bħala uniku u jassenjahom valuri tal-qasam _id uniċi waqt l-indiċjar. Hekk jidhru kopji tal-messaġġi.
F'Kibana jidher bħal dan:
Is-soluzzjoni
Hemm diversi għażliet biex issolvi din il-problema. Wieħed minnhom huwa l-mekkaniżmu mibni fil-plugin fluent-plugin-elasticsearch biex jiġġenera hash uniku għal kull dokument. Jekk tuża dan il-mekkaniżmu, ElasticSearch jirrikonoxxi repetizzjonijiet fl-istadju ta' trażmissjoni u jipprevjeni dokumenti duplikati. Iżda rridu nqisu li dan il-metodu ta 'soluzzjoni tal-problema tissielet mal-investigazzjoni u ma jeliminax l-iżball b'nuqqas ta' timeout, għalhekk abbandunajna l-użu tiegħu.
Aħna nużaw plugin buffering fuq l-output Fluentd biex nipprevjenu t-telf ta 'log fil-każ ta' problemi tan-netwerk għal żmien qasir jew żieda fl-intensità tal-qtugħ. Jekk għal xi raġuni ElasticSearch ma jistax jikteb dokument istantanjament fl-indiċi, id-dokument jitqiegħed fil-kju u jinħażen fuq disk. Għalhekk, fil-każ tagħna, sabiex jiġi eliminat is-sors tal-problema li jwassal għall-iżball deskritt hawn fuq, huwa meħtieġ li jiġu stabbiliti l-valuri korretti għall-parametri tal-buffering, li fihom il-buffer tal-ħruġ Fluentd ikun ta 'daqs suffiċjenti u fl-istess ħin jirnexxielhom jiġu kklerjati fil-ħin allokat.
Ta 'min jinnota li l-valuri tal-parametri diskussi hawn taħt huma individwali f'kull każ speċifiku ta' użu ta 'buffering fil-plugins tal-output, peress li jiddependu minn ħafna fatturi: l-intensità tal-kitba ta' messaġġi fil-log permezz ta 'servizzi, prestazzjoni tas-sistema tad-disk, netwerk. tagħbija tal-kanal u bandwidth tagħha. Għalhekk, sabiex tikseb settings tal-buffer li huma adattati għal kull każ individwali, iżda mhux żejda, tevita tfittxijiet twal bl-addoċċ, tista 'tuża l-informazzjoni ta' debugging li Fluentd jikteb fil-log tiegħu waqt it-tħaddim u relattivament malajr tikseb il-valuri korretti.
Fiż-żmien li ġiet irreġistrata l-problema, il-konfigurazzjoni kienet tidher bħal din:
Meta ssolviet il-problema, il-valuri tal-parametri li ġejjin ġew magħżula manwalment:
chunk_limit_size — id-daqs tal-biċċiet li fihom huma maqsuma l-messaġġi fil-buffer.
flush_interval — intervall ta' ħin li warajh il-buffer jitneħħa.
queue_limit_length — in-numru massimu ta' biċċiet fil-kju.
request_timeout huwa l-ħin li għalih tiġi stabbilita l-konnessjoni bejn Fluentd u ElasticSearch.
Id-daqs totali tal-buffer jista 'jiġi kkalkulat billi jiġu mmultiplikati l-parametri queue_limit_length u chunk_limit_size, li jistgħu jiġu interpretati bħala "in-numru massimu ta' biċċiet fil-kju, li kull wieħed minnhom għandu daqs partikolari." Jekk id-daqs tal-buffer ma jkunx biżżejjed, it-twissija li ġejja tidher fir-reġistru:
2020-01-21 10:22:57 +0000 [warn]: [test-prod] failed to write data into buffer by buffer overflow action=:block
Ifisser li l-buffer m'għandux ħin biex jiġi kklerjat fiż-żmien allokat u d-dejta li tidħol fil-buffer sħiħ hija mblukkata, li twassal għat-telf ta 'parti mir-zkuk.
Tista 'żżid il-buffer b'żewġ modi: billi żżid jew id-daqs ta' kull biċċa fil-kju, jew in-numru ta 'biċċiet li jistgħu jkunu fil-kju.
Jekk issettja d-daqs tal-biċċa chunk_limit_size għal aktar minn 32 megabytes, allura ElasticSeacrh ma jaċċettahx, peress li l-pakkett li jkun dieħel ikun kbir wisq. Għalhekk, jekk għandek bżonn iżżid aktar il-buffer, huwa aħjar li żżid it-tul massimu tal-kju queue_limit_length.
Meta l-buffer jieqaf ifur u jibqa' biss il-messaġġ ta' timeout insuffiċjenti, tista' tibda żżid il-parametru request_timeout. Madankollu, jekk issettja l-valur għal aktar minn 20 sekonda, it-twissijiet li ġejjin jibdew jidhru fir-reġistri Fluentd:
2020-01-21 09:55:33 +0000 [warn]: [test-dev] buffer flush took longer time than slow_flush_log_threshold: elapsed_time=20.85753920301795 slow_flush_log_threshold=20.0 plugin_id="postgresql-dev"
Dan il-messaġġ ma jaffettwa l-operat tas-sistema bl-ebda mod u jfisser li l-ħin tal-flushing tal-buffer ħa aktar minn dak stabbilit mill-parametru slow_flush_log_threshold. Din hija informazzjoni ta' debugging u nużawha meta nagħżlu l-valur tal-parametru request_timeout.
L-algoritmu tal-għażla ġeneralizzat huwa kif ġej:
Issettja request_timeout għal valur garantit li jkun akbar milli meħtieġ (mijiet ta' sekondi). Matul is-setup, il-kriterju ewlieni għall-issettjar korrett ta 'dan il-parametru se jkun l-għajbien ta' twissijiet għal nuqqas ta 'timeout.
Stenna għal messaġġi dwar il-qbiż tal-limitu slow_flush_log_threshold. It-test ta' twissija fil-qasam elapsed_time se juri l-ħin reali li fih il-buffer ġie mneħħi.
Issettja request_timeout għal valur akbar mill-valur massimu elapsed_time miksub matul il-perjodu ta' osservazzjoni. Aħna nikkalkulaw il-valur request_timeout bħala elapsed_time + 50%.
Biex tneħħi t-twissijiet dwar il-buffer flushes twal mil-log, tista 'tgħolli l-valur ta' slow_flush_log_threshold. Aħna nikkalkulaw dan il-valur bħala elapsed_time + 25%.
Il-valuri finali ta 'dawn il-parametri, kif innutat qabel, jinkisbu individwalment għal kull każ. Billi ssegwi l-algoritmu ta 'hawn fuq, aħna ggarantiti li neliminaw l-iżball li jwassal għal messaġġi ripetuti.
It-tabella hawn taħt turi kif in-numru ta 'żbalji kuljum, li jwassal għal duplikazzjoni ta' messaġġi, jinbidel fil-proċess tal-għażla tal-valuri tal-parametri deskritti hawn fuq:
nodu-1
nodu-2
nodu-3
nodu-4
Qabel wara
Qabel wara
Qabel wara
Qabel wara
naqas milli jiflaħ il-buffer
1749/2
694/2
47/0
1121/2
ipprova mill-ġdid irnexxielu
410/2
205/1
24/0
241/2
Ta 'min jinnota wkoll li s-settings li jirriżultaw jistgħu jitilfu r-rilevanza tagħhom hekk kif il-proġett jikber u, għaldaqstant, in-numru ta' zkuk jiżdied. Is-sinjal primarju ta' timeout insuffiċjenti huwa r-ritorn ta' messaġġi dwar buffer flush twil fil-log Fluentd, jiġifieri, jaqbeż il-limitu slow_flush_log_threshold. Minn dan il-punt 'il quddiem, għad hemm marġni żgħir qabel ma jinqabeż il-parametru request_timeout, għalhekk huwa meħtieġ li tirrispondi għal dawn il-messaġġi fil-ħin u rrepeti l-proċess tal-għażla tal-aħjar settings deskritti hawn fuq.
Konklużjoni
L-irfinar tal-buffer tal-ħruġ Fluentd huwa wieħed mill-istadji ewlenin tal-konfigurazzjoni tal-munzell EFK, li jiddetermina l-istabbiltà tat-tħaddim tiegħu u t-tqegħid korrett tad-dokumenti fl-indiċi. Ibbażat fuq l-algoritmu ta 'konfigurazzjoni deskritt, tista' tkun ċert li r-zkuk kollha se jinkitbu fl-indiċi ElasticSearch fl-ordni korretta, mingħajr ripetizzjonijiet jew telf.