Líofa: Cén fáth a bhfuil sé tábhachtach an maolán aschuir a chumrú

Líofa: Cén fáth a bhfuil sé tábhachtach an maolán aschuir a chumrú

Sa lá atá inniu ann, tá sé dodhéanta tionscadal Kubernetes-bhunaithe a shamhlú gan stack ELK, rud a shábhálann logaí feidhmchlár agus comhpháirteanna córais an bhraisle. Inár gcleachtas, úsáidimid an stack EFK le Fluentd in ionad Logstash.

Is bailitheoir logaí uilíoch nua-aimseartha é Fluentd atá ag éirí níos mó agus níos mó tóir agus tá sé tar éis dul isteach sa Cloud Native Computing Foundation, agus is é sin an fáth go bhfuil a veicteoir forbartha dírithe ar úsáid i gcomhar le Kubernetes.

Ní athraíonn an bhfíric úsáid Fluentd in ionad Logstash an bunúsach ginearálta an phacáiste bogearraí, áfach, tá Fluentd tréithrithe ag a nuances sonracha féin mar thoradh ar a solúbthacht.

Mar shampla, nuair a thosaigh muid ag baint úsáide as EFK i dtionscadal gnóthach a raibh ard-déine logáil isteach, bhí orainn aghaidh a thabhairt ar an bhfíric go raibh roinnt teachtaireachtaí ar taispeáint arís agus arís eile i Kibana arís agus arís eile. San Airteagal seo inseoimid duit cén fáth a tharlaíonn an bhfeiniméan seo agus conas an fhadhb a réiteach.

An fhadhb a bhaineann le dúbailt doiciméad

Inár dtionscadail, déantar Fluentd a imscaradh mar DaemonSet (seolta go huathoibríoch i gcás amháin ar gach nód de bhraisle Kubernetes) agus déanann sé monatóireacht ar logaí coimeádán stdout in /var/log/containers. Tar éis a bhailiú agus a phróiseáil, seoltar na logaí i bhfoirm dhoiciméid JSON chuig ElasticSearch, ardaithe i bhfoirm bhraisle nó neamhspleách, ag brath ar scála an tionscadail agus na ceanglais maidir le feidhmíocht agus lamháltas lochtanna. Úsáidtear Kibana mar chomhéadan grafach.

Nuair a bhaineamar úsáid as Fluentd le breiseán maolánaithe aschuir, thángamar ar chás ina raibh an t-ábhar díreach céanna ag roinnt doiciméad in ElasticSearch agus ina raibh difríocht idir iad san aitheantóir amháin. Is féidir leat a fhíorú gur athrá teachtaireacht é seo ag baint úsáide as logáil Nginx mar shampla. Sa logchomhad, tá an teachtaireacht seo ann i gcóip amháin:

127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00 +0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0" -

Mar sin féin, tá roinnt doiciméad in ElasticSearch ina bhfuil an teachtaireacht seo:

{
  "_index": "test-custom-prod-example-2020.01.02",
  "_type": "_doc",
  "_id": "HgGl_nIBR8C-2_33RlQV",
  "_version": 1,
  "_score": 0,
  "_source": {
    "service": "test-custom-prod-example",
    "container_name": "nginx",
    "namespace": "test-prod",
    "@timestamp": "2020-01-14T05:29:47.599052886 00:00",
    "log": "127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00  0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0" -",
    "tag": "custom-log"
  }
}

{
  "_index": "test-custom-prod-example-2020.01.02",
  "_type": "_doc",
  "_id": "IgGm_nIBR8C-2_33e2ST",
  "_version": 1,
  "_score": 0,
  "_source": {
    "service": "test-custom-prod-example",
    "container_name": "nginx",
    "namespace": "test-prod",
    "@timestamp": "2020-01-14T05:29:47.599052886 00:00",
    "log": "127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00  0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0" -",
    "tag": "custom-log"
  }
}

Thairis sin, is féidir níos mó ná dhá athrá a dhéanamh.

Agus an fhadhb seo á réiteach sna logaí Fluentd, is féidir leat líon mór rabhadh a fheiceáil leis an ábhar seo a leanas:

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"

Tarlaíonn na rabhaidh seo nuair nach féidir le ElasticSearch freagra a thabhairt ar ais ar iarratas laistigh den am atá sonraithe ag an bparaiméadar request_timeout, agus is é sin an fáth nach féidir an blúire maolánach a cuireadh ar aghaidh a ghlanadh. Ina dhiaidh sin, déanann Fluentd iarracht an blúire maolánach a sheoladh chuig ElasticSearch arís agus tar éis roinnt iarrachtaí treallach, cuirtear an oibríocht i gcrích go rathúil:

2020-01-16 01:47:05 +0000 [warn]: [test-prod] retry succeeded. chunk_id="59c37fc3fb320608692c352802b973ce" 
2020-01-16 01:47:05 +0000 [warn]: [test-prod] retry succeeded. chunk_id="59c37fad241ab300518b936e27200747" 
2020-01-16 01:47:05 +0000 [warn]: [test-dev] retry succeeded. chunk_id="59c37fc11f7ab707ca5de72a88321cc2" 
2020-01-16 01:47:05 +0000 [warn]: [test-dev] retry succeeded. chunk_id="59c37fb5adb70c06e649d8c108318c9b" 
2020-01-16 01:47:15 +0000 [warn]: [kube-system] retry succeeded. chunk_id="59c37f63a9046e6dff7e9987729be66f"

Mar sin féin, déileálann ElasticSearch le gach ceann de na blúirí maoláin aistrithe mar uathúil agus sannann sé luachanna réimse uathúla _id dóibh le linn innéacsaithe. Seo mar a fheictear cóipeanna de theachtaireachtaí.

Breathnaíonn sé mar seo i Kibana:

Líofa: Cén fáth a bhfuil sé tábhachtach an maolán aschuir a chumrú

An réiteach

Tá go leor roghanna ann chun an fhadhb seo a réiteach. Ceann acu is ea an mheicníocht atá ionsuite sa breiseán cuardaigh líofa-breiseán-elastic chun hash uathúil a ghiniúint do gach doiciméad. Má úsáideann tú an mheicníocht seo, aithneoidh ElasticSearch athrá ag an gcéim seolta ar aghaidh agus seachnóidh sé doiciméid dhúblacha. Ach ní mór dúinn a chur san áireamh go bhfuil an modh seo chun an fhadhb a réiteach ag streachailt leis an imscrúdú agus nach gcuireann sé deireadh leis an earráid le heaspa teorainn ama, agus mar sin thréigeamar é a úsáid.

Bainimid úsáid as breiseán maoláin ar an aschur Fluentd chun caillteanas loga a chosc i gcás fadhbanna líonra gearrthéarmacha nó déine logála méadaithe. Más rud é ar chúis éigin nach bhfuil ElasticSearch in ann doiciméad a scríobh láithreach chuig an innéacs, cuirtear an doiciméad i scuaine agus stóráiltear é ar diosca. Dá bhrí sin, inár gcás, chun deireadh a chur le foinse na faidhbe as a dtagann an earráid a thuairiscítear thuas, is gá na luachanna cearta a shocrú do na paraiméadair mhaoláin, ag a mbeidh an maolán aschuir Fluentd sách mór agus ag an am céanna a bhainistiú a bheith glanta san am Leithroinnte.

Is fiú a thabhairt faoi deara go bhfuil luachanna na bparaiméadar a phléitear thíos aonair i ngach cás ar leith maidir le maolán a úsáid i breiseán aschuir, toisc go mbraitheann siad ar go leor fachtóirí: déine na teachtaireachtaí a scríobh chuig an logáil ag seirbhísí, feidhmíocht an chórais diosca, líonra. ualach cainéal agus a bandaleithead. Dá bhrí sin, chun socruithe maoláin a fháil atá oiriúnach do gach cás ar leith, ach nach bhfuil iomarcach, chun cuardaigh fhada a sheachaint go dall, is féidir leat an fhaisnéis dífhabhtaithe a scríobhann Fluentd chuig a logáil le linn oibriú a úsáid agus na luachanna cearta a fháil go réasúnta tapa.

Nuair a taifeadadh an fhadhb, bhí cuma mar seo ar an gcumraíocht:

 <buffer>
        @type file
        path /var/log/fluentd-buffers/kubernetes.test.buffer
        flush_mode interval
        retry_type exponential_backoff
        flush_thread_count 2
        flush_interval 5s
        retry_forever
        retry_max_interval 30
        chunk_limit_size 8M
        queue_limit_length 8
        overflow_action block
      </buffer>

Agus an fhadhb á réiteach, roghnaíodh luachanna na bparaiméadar seo a leanas de láimh:
chunk_limit_size — méid na smután ina bhfuil teachtaireachtaí sa mhaolán roinnte.

  • flush_interval — eatramh ama ina dhiaidh sin glantar an maolán.
  • queue_limit_length — uaslíon na smután sa scuaine.
  • Is é request_timeout an t-am a bhunaítear an nasc idir Fluentd agus ElasticSearch.

Is féidir méid iomlán na maolán a ríomh trí na paraiméadair queue_limit_length agus chunk_limit_size a iolrú, ar féidir iad a léirmhíniú mar “líon uasta na smután sa scuaine, a bhfuil méid tugtha ag gach ceann acu.” Mura leor an méid maoláin, beidh an rabhadh seo a leanas le feiceáil sna logaí:

2020-01-21 10:22:57 +0000 [warn]: [test-prod] failed to write data into buffer by buffer overflow action=:block

Ciallaíonn sé nach bhfuil am ag an maolán a ghlanadh san am leithroinnte agus go gcuirtear bac ar na sonraí a théann isteach sa mhaolán iomlán, rud a fhágann go gcaillfear cuid de na logaí.

Is féidir leat an maolán a mhéadú ar dhá bhealach: trí mhéid gach smután sa scuaine a mhéadú, nó líon na smután is féidir a bheith sa scuaine.

Má shocraíonn tú an méid smután chunk_limit_size go dtí níos mó ná 32 meigibheart, ansin ní ghlacfaidh ElasticSeacrh leis, mar go mbeidh an paicéad isteach ró-mhór. Dá bhrí sin, más gá duit an maolán a mhéadú tuilleadh, is fearr an fad scuaine uasta a mhéadú queue_limit_length.

Nuair a stopann an maolán ag cur thar maoil agus nach bhfuil ach an teachtaireacht neamhleor an t-am istigh fágtha, is féidir leat tosú ar an bparaiméadar request_timeout a mhéadú. Mar sin féin, má shocraíonn tú an luach go dtí níos mó ná 20 soicind, tosóidh na rabhaidh seo a leanas le feiceáil sna logaí 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" 

Ní chuireann an teachtaireacht seo isteach ar oibriú an chórais ar aon bhealach agus ciallaíonn sé gur thóg an t-am maoláin shruthlaithe níos faide ná mar a shocraítear leis an bparaiméadar slow_flush_log_threshold. Is faisnéis dífhabhtaithe é seo agus úsáidimid é nuair a roghnaítear luach an pharaiméadar request_timeout.

Seo a leanas an t-algartam roghnúcháin ginearálaithe:

  1. Socraigh request_timeout go luach a ráthaítear a bheith níos airde ná mar is gá (na céadta soicind). Le linn an tsocraithe, is é an príomhchritéar chun an paraiméadar seo a shocrú i gceart ná go n-imeoidh rabhaidh faoi easpa ama istigh.
  2. Fan le teachtaireachtaí a sháraíonn an tairseach slow_flush_log_threshold. Léireoidh an téacs rabhaidh sa réimse elapsed_time an t-am fíor-ama a glanadh an maolán.
  3. Socraigh request_timeout go luach níos mó ná an t-uasluach ama caite a fuarthas le linn na tréimhse breathnadóireachta. Ríomhaimid an luach request_timeout mar elapsed_time + 50%.
  4. Chun rabhaidh maidir le sruthanna maolánacha fada a bhaint den loga, is féidir leat luach slow_flush_log_threshold a ardú. Ríomhaimid an luach seo mar elapsed_time + 25%.

Faightear luachanna deiridh na bparaiméadar seo, mar a luadh níos luaithe, ina n-aonar do gach cás. Tríd an algartam thuas a leanúint, tá ráthaíocht againn go gcuirfear deireadh leis an earráid as a dtagann teachtaireachtaí arís agus arís eile.

Léiríonn an tábla thíos conas a líon na n-earráidí in aghaidh an lae, as a dtiocfaidh dúbailt na teachtaireachtaí, athruithe sa phróiseas roghnú na luachanna na paraiméadair cur síos orthu thuas:

nód-1
nód-2
nód-3
nód-4

Roimh tar éis
Roimh tar éis
Roimh tar éis
Roimh tar éis

theip ar an maolán a shruthlú
1749/2
694/2
47/0
1121/2

d'éirigh le triail eile
410/2
205/1
24/0
241/2

Is fiú a thabhairt faoi deara freisin go bhféadfadh go gcaillfidh na socruithe dá bharr a n-ábharthacht de réir mar a fhásann an tionscadal agus, dá réir sin, go dtiocfaidh méadú ar líon na logaí. Is é an príomhchomhartha nach bhfuil dóthain teorainn ama ann ná go gcuirtear teachtaireachtaí ar ais faoi shruthlú maolánach fada chuig an logchomhad Fluentd, is é sin, a sháraíonn an tairseach slow_flush_log_threshold. Ón bpointe seo ar aghaidh, tá corrlach beag fós ann sula sáraítear an paraiméadar request_timeout, mar sin ní mór freagra a thabhairt ar na teachtaireachtaí seo go tráthúil agus an próiseas a athdhéanamh chun na socruithe is fearr a bhfuil cur síos orthu thuas a roghnú.

Conclúid

Tá mionchoigeartú ar an maolán aschuir Fluentd ar cheann de na príomhchéimeanna a bhaineann le stack EFK a chumrú, cobhsaíocht a oibríochta a chinneadh agus socrú ceart doiciméad in innéacsanna. Bunaithe ar an algartam cumraíochta a thuairiscítear, is féidir leat a bheith cinnte go scríobhfar na logaí go léir chuig an innéacs ElasticSearch san ord ceart, gan athrá nó caillteanais.

Léigh ailt eile ar ár mblag freisin:

Foinse: will.com

Add a comment