Fluentd: Poukisa li enpòtan pou konfigirasyon tanpon pwodiksyon an

Fluentd: Poukisa li enpòtan pou konfigirasyon tanpon pwodiksyon an

Sèjousi, li enposib imajine yon pwojè ki baze sou Kubernetes san pil ELK la, ki sove mòso bwa tou de aplikasyon ak eleman sistèm nan gwoup la. Nan pratik nou an, nou itilize pile EFK a ak Fluentd olye pou yo Logstash.

Fluentd se yon pèseptè modèn, inivèsèl ki vin pi plis popilarite e ki te rantre nan Cloud Native Computing Foundation, se poutèt sa vektè devlopman li konsantre sou itilizasyon an konjonksyon avèk Kubernetes.

Reyalite lè l sèvi avèk Fluentd olye pou yo Logstash pa chanje sans jeneral nan pake lojisyèl an, sepandan, Fluentd karakterize pa pwòp nuans espesifik li yo ki soti nan adaptabilite li yo.

Pou egzanp, lè nou te kòmanse itilize EFK nan yon pwojè okipe ak yon gwo entansite nan antre, nou te fè fas ak lefèt ke nan Kibana kèk mesaj yo te parèt repete plizyè fwa. Nan atik sa a nou pral di w poukisa fenomèn sa a rive ak ki jan yo rezoud pwoblèm nan.

Pwoblèm nan duplication dokiman

Nan pwojè nou yo, Fluentd deplwaye kòm yon DaemonSet (otomatikman te lanse nan yon sèl egzanp sou chak ne nan gwoup Kubernetes) epi kontwole mòso bwa veso stdout nan /var/log/containers. Apre koleksyon ak pwosesis, mòso bwa yo nan fòm dokiman JSON yo voye bay ElasticSearch, leve soti nan gwoup oswa fòm otonòm, tou depann de echèl la nan pwojè a ak kondisyon yo pou pèfòmans ak tolerans fay. Kibana yo itilize kòm koòdone grafik la.

Lè w ap itilize Fluentd ak yon plugin buffering pwodiksyon, nou te rankontre yon sitiyasyon kote kèk dokiman nan ElasticSearch te gen egzakteman menm kontni ak diferan sèlman nan idantifyan an. Ou ka verifye ke sa a se yon repetisyon mesaj lè l sèvi avèk boutèy la Nginx kòm yon egzanp. Nan dosye log la, mesaj sa a egziste nan yon sèl kopi:

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

Sepandan, gen plizyè dokiman nan ElasticSearch ki gen mesaj sa a:

{
  "_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"
  }
}

Anplis, ka gen plis pase de repetisyon.

Pandan w ap repare pwoblèm sa a nan mòso Fluentd yo, ou ka wè yon gwo kantite avètisman ak kontni sa a:

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"

Avètisman sa yo rive lè ElasticSearch pa ka retounen yon repons a yon demann nan tan ki espesifye nan paramèt request_timeout la, se poutèt sa fragman tanpon voye a pa ka efase. Apre sa, Fluentd eseye voye fragman tanpon an bay ElasticSearch ankò epi apre yon kantite tantativ abitrè, operasyon an fini avèk siksè:

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"

Sepandan, ElasticSearch trete chak fragman tanpon transfere yo kòm inik epi li ba yo valè jaden _id inik pandan endèks la. Men ki jan kopi mesaj parèt.

Nan Kibana li sanble sa a:

Fluentd: Poukisa li enpòtan pou konfigirasyon tanpon pwodiksyon an

Solisyon an

Gen plizyè opsyon pou rezoud pwoblèm sa a. Youn nan yo se mekanis ki bati nan Plugin Fluent-plugin-elasticsearch pou jenere yon hash inik pou chak dokiman. Si w itilize mekanis sa a, ElasticSearch pral rekonèt repetisyon nan etap transmisyon an epi anpeche dokiman kopi. Men, nou dwe pran an kont ke metòd sa a pou rezoud pwoblèm nan lit ak ankèt la epi li pa elimine erè a ak yon mank de timeout, kidonk nou abandone itilizasyon li yo.

Nou itilize yon plugin tanpon sou pwodiksyon Fluentd pou anpeche pèt boutèy demi lit nan ka ta gen pwoblèm rezo a kout tèm oswa ogmante entansite anrejistreman. Si pou kèk rezon ElasticSearch pa kapab imedyatman ekri yon dokiman nan endèks la, dokiman an mete nan keu epi estoke sou disk. Se poutèt sa, nan ka nou an, yo nan lòd yo elimine sous la nan pwoblèm nan ki mennen nan erè ki dekri pi wo a, li nesesè yo mete valè ki kòrèk yo pou paramèt tanpon yo, nan ki tanpon pwodiksyon Fluentd la pral gen ase gwosè ak. an menm tan an jere yo dwe otorize nan tan an.

Li se vo anyen ke valè yo nan paramèt yo diskite anba a yo endividyèl nan chak ka espesifik nan lè l sèvi avèk tanpon nan grefon pwodiksyon, paske yo depann de anpil faktè: entansite nan ekri mesaj nan boutèy la pa sèvis, pèfòmans sistèm ki gen kapasite, rezo. chaj chanèl ak Pleasant li yo. Se poutèt sa, yo nan lòd yo jwenn anviwònman tanpon ki apwopriye pou chak ka endividyèl, men ki pa redondants, evite rechèch long je fèmen, ou ka itilize enfòmasyon debogaj ke Fluentd ekri nan boutèy li yo pandan operasyon an epi relativman byen vit jwenn valè ki kòrèk yo.

Nan moman an te anrejistre pwoblèm nan, konfigirasyon an te sanble sa a:

 <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>

Lè rezoud pwoblèm nan, valè paramèt sa yo te chwazi manyèlman:
chunk_limit_size — gwosè moso yo nan ki mesaj nan tanpon an divize.

  • flush_interval — entèval tan apre yo fin netwaye tanpon an.
  • queue_limit_length — kantite maksimòm moso nan keu la.
  • request_timeout se tan pou koneksyon ant Fluentd ak ElasticSearch etabli.

Gwosè total tanpon an ka kalkile nan miltipliye paramèt queue_limit_length ak chunk_limit_size, ki ka entèprete kòm "kantite maksimòm moso nan keu la, chak nan yo ki gen yon gwosè bay." Si gwosè tanpon an pa ase, avètisman sa a ap parèt nan mòso bwa yo:

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

Sa vle di ke tanpon an pa gen tan yo dwe netwaye nan tan an epi done yo ki antre nan tanpon konplè a bloke, ki pral mennen nan pèt la nan yon pati nan mòso bwa yo.

Ou ka ogmante tanpon an nan de fason: lè w ogmante swa gwosè chak moso nan keu a, oswa kantite moso ki ka nan keu a.

Si ou mete gwosè moso chunk_limit_size a plis pase 32 megabyte, Lè sa a, ElasticSeacrh pa pral aksepte li, paske pake k ap vini an pral twò gwo. Se poutèt sa, si ou bezwen ogmante tanpon an plis, li pi bon pou ogmante longè maksimòm keue_limit_length la.

Lè tanpon an sispann debòde epi sèlman mesaj timeout ensifizan rete, ou ka kòmanse ogmante paramèt request_timeout la. Sepandan, si ou mete valè a plis pase 20 segonn, avètisman sa yo ap kòmanse parèt nan mòso Fluentd yo:

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" 

Mesaj sa a pa afekte operasyon sistèm lan nan okenn fason epi li vle di tan tanpon kole a te pran plis tan pase paramèt slow_flush_log_threshold la fikse. Sa a se enfòmasyon debogaj epi nou itilize li lè w ap chwazi valè paramèt request_timeout la.

Algorithm seleksyon jeneralize a se jan sa a:

  1. Mete request_timeout sou yon valè ki garanti pi gran pase sa nesesè (dè santèn de segonn). Pandan konfigirasyon, kritè prensipal la pou anviwònman ki kòrèk la nan paramèt sa a pral disparisyon nan avètisman pou yon mank de timeout.
  2. Tann mesaj sou depase papòt slow_flush_log_threshold la. Tèks avètisman an nan jaden elapsed_time la pral montre tan reyèl la te netwaye tanpon an.
  3. Mete request_timeout sou yon valè ki pi gran pase valè maksimòm elapsed_time yo jwenn pandan peryòd obsèvasyon an. Nou kalkile valè request_timeout kòm elapsed_time + 50%.
  4. Pou retire avètisman sou tanpon flòch ki long nan boutèy demi lit la, ou ka ogmante valè slow_flush_log_threshold. Nou kalkile valè sa a kòm elapsed_time + 25%.

Valè final yo nan paramèt sa yo, jan yo note pi bonè, yo jwenn endividyèlman pou chak ka. Lè nou swiv algorithm ki anwo a, nou garanti pou elimine erè ki mennen nan mesaj repete.

Tablo ki anba a montre kouman kantite erè chak jou, ki mennen ale nan kopi mesaj, chanje nan pwosesis pou chwazi valè paramèt ki dekri pi wo a:

ne-1
ne-2
ne-3
ne-4

Avan aprè
Avan aprè
Avan aprè
Avan aprè

echwe pou pou vide tanpon an
1749/2
694/2
47/0
1121/2

reesye reyisi
410/2
205/1
24/0
241/2

Anplis de sa, li ta dwe remake ke anviwònman ki kapab lakòz yo ka pèdi enpòtans yo kòm pwojè a ap grandi epi, kòmsadwa, kantite mòso bwa ogmante. Siy prensipal ensifizan delè a se retounen nan mesaj sou yon tanpon flòch long nan jounal Fluentd la, sa vle di, depase papòt slow_flush_log_threshold la. Soti nan pwen sa a, gen toujou yon ti maj anvan paramèt request_timeout la depase, kidonk li nesesè pou reponn mesaj sa yo nan yon fason apwopriye epi repete pwosesis pou chwazi paramèt optimal ki dekri pi wo a.

Konklizyon

Amelyore tanpon pwodiksyon Fluentd la se youn nan etap prensipal yo nan konfigirasyon pil EFK a, detèmine estabilite nan operasyon li yo ak plasman kòrèk dokiman yo nan endèks. Dapre algorithm konfigirasyon ki dekri a, ou ka asire w ke tout mòso bwa yo pral ekri nan endèks ElasticSearch nan lòd ki kòrèk la, san repetisyon oswa pèt.

Epitou li lòt atik sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè