ClickHouse datu bāze cilvēkiem vai citplanētieÅ”u tehnoloÄ£ijām

Aleksejs Lizunovs, MKB Informācijas tehnoloģiju direkcijas Attālināto pakalpojumu kanālu kompetences centra vadītājs

ClickHouse datu bāze cilvēkiem vai citplanētieÅ”u tehnoloÄ£ijām

Kā alternatÄ«vu ELK stekam (ElasticSearch, Logstash, Kibana) mēs veicam pētÄ«jumus par ClickHouse datu bāzes izmantoÅ”anu kā žurnālu datu krātuvi.

Å ajā rakstā vēlamies pastāstÄ«t par mÅ«su pieredzi ClickHouse datu bāzes izmantoÅ”anā un provizoriskajiem pilotoperācijas rezultātiem. Uzreiz jāatzÄ«mē, ka rezultāti bija iespaidÄ«gi.


ClickHouse datu bāze cilvēkiem vai citplanētieÅ”u tehnoloÄ£ijām

Tālāk mēs sÄ«kāk aprakstÄ«sim, kā mÅ«su sistēma ir konfigurēta un no kādiem komponentiem tā sastāv. Bet tagad es gribētu nedaudz parunāt par Å”o datu bāzi kopumā un to, kāpēc ir vērts pievērst uzmanÄ«bu. ClickHouse datu bāze ir augstas veiktspējas analÄ«tiska kolonnu datubāze no Yandex. To izmanto Yandex pakalpojumos, sākotnēji tā ir galvenā Yandex.Metrica datu krātuve. Atvērtā pirmkoda sistēma, bezmaksas. No izstrādātāju viedokļa vienmēr esmu brÄ«nÄ«jies, kā viņi to ieviesuÅ”i, jo ir fantastiski lieli dati. Un pati Metrica lietotāja saskarne ir ļoti elastÄ«ga un ātra. Pirmo reizi iepazÄ«stoties ar Å”o datubāzi, rodas iespaids: ā€œNu beidzot! RadÄ«ts cilvēkiem! Sākot no instalÄ“Å”anas procesa un beidzot ar pieprasÄ«jumu nosÅ«tÄ«Å”anu.

Å ai datubāzei ir ļoti zems ieejas slieksnis. Pat vidēji prasmÄ«gs izstrādātājs dažu minÅ«Å”u laikā var instalēt Å”o datu bāzi un sākt to lietot. Viss darbojas skaidri. Pat cilvēki, kuri ir jauni Linux lietoÅ”anā, var ātri tikt galā ar instalÄ“Å”anu un veikt visvienkārŔākās darbÄ«bas. Ja agrāk ar vārdiem Big Data, Hadoop, Google BigTable, HDFS parastam izstrādātājam radās idejas, ka runa ir par dažiem terabaitiem, petabaitiem, ka Å”o sistēmu iestatÄ«jumos un izstrādē ir iesaistÄ«ti daži pārcilvēki, tad lÄ«dz ar ClickHouse parādÄ«Å”anos. datu bāzē, mēs ieguvām vienkārÅ”u, saprotamu rÄ«ku, ar kuru var atrisināt iepriekÅ” nesasniedzamu uzdevumu loku. InstalÄ“Å”anai nepiecieÅ”ama tikai viena diezgan vidēja maŔīna un piecas minÅ«tes. Tas ir, mēs ieguvām tādu datu bāzi kā, piemēram, MySql, bet tikai miljardu ierakstu glabāŔanai! Noteikts superarhivētājs ar SQL valodu. Tas ir tā, it kā cilvēkiem bÅ«tu nodoti citplanētieÅ”u ieroči.

Par mÅ«su reÄ£istrÄ“Å”anas sistēmu

Informācijas apkopoÅ”anai tiek izmantoti standarta formāta tÄ«mekļa lietojumprogrammu IIS žurnālfaili (paÅ”laik arÄ« parsējam lietojumprogrammu žurnālus, taču galvenais mērÄ·is pilota posmā ir IIS žurnālu apkopoÅ”ana).

Dažādu iemeslu dēļ mēs nevarējām pilnÄ«bā atteikties no ELK steka, un mēs turpinām izmantot LogStash un Filebeat komponentus, kas ir sevi pierādÄ«juÅ”i un darbojas diezgan droÅ”i un paredzami.

Vispārējā reÄ£istrÄ“Å”anas shēma ir parādÄ«ta attēlā zemāk:

ClickHouse datu bāze cilvēkiem vai citplanētieÅ”u tehnoloÄ£ijām

IezÄ«me datu ierakstÄ«Å”anai ClickHouse datu bāzē ir reta (reizi sekundē) ierakstu ievietoÅ”ana lielās partijās. AcÄ«mredzot Ŕī ir ā€œproblemātiskākāā€ daļa, ar kuru jÅ«s saskaraties, pirmo reizi saskaroties ar ClickHouse datu bāzi: shēma kļūst nedaudz sarežģītāka.
Å eit daudz palÄ«dzēja LogStash spraudnis, kas tieÅ”i ievieto datus ClickHouse. Å is komponents ir izvietots tajā paŔā serverÄ«, kur pati datu bāze. Tātad, vispārÄ«gi runājot, to nav ieteicams darÄ«t, bet gan no praktiskā viedokļa, lai neradÄ«tu atseviŔķus serverus, kamēr tas tiek izvietots tajā paŔā serverÄ«. Mēs nenovērojām nekādas kļūmes vai resursu konfliktus ar datu bāzi. Turklāt jāņem vērā, ka kļūdu gadÄ«jumā spraudnim ir atkārtota mēģinājuma mehānisms. Un kļūdu gadÄ«jumā spraudnis ieraksta diskā datu partiju, kuru nevarēja ievietot (faila formāts ir ērts: pēc rediģēŔanas jÅ«s varat viegli ievietot laboto partiju, izmantojot clickhouse-client).

Pilns shēmā izmantotās programmatūras saraksts ir parādīts tabulā:

Izmantotās programmatūras saraksts

Nosaukums

Apraksts

IzplatīŔanas saite

nginx

Apgrieztā starpniekserveris, lai ierobežotu piekļuvi portiem un organizētu autorizāciju

PaÅ”laik shēmā netiek izmantots

https://nginx.org/ru/download.html

https://nginx.org/download/nginx-1.16.0.tar.gz

FileBeat

Failu žurnālu pārsūtīŔana.

https://www.elastic.co/downloads/beats/filebeat (izplatÄ«Å”anas komplekts operētājsistēmai Windows 64bit).

https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.0-windows-x86_64.zip

logstash

Baļķu savācējs.

Izmanto, lai savāktu žurnālus no FileBeat, kā arī lai savāktu žurnālus no RabbitMQ rindas (serveriem, kas atrodas DMZ.)

https://www.elastic.co/products/logstash

https://artifacts.elastic.co/downloads/logstash/logstash-7.0.1.rpm

Logstash-output-clickhouse

Loagstash spraudnis žurnālu pārsūtīŔanai uz ClickHouse datu bāzi partijās

https://github.com/mikechris/logstash-output-clickhouse

/usr/share/logstash/bin/logstash-plugin instalēt logstash-output-clickhouse

/usr/share/logstash/bin/logstash-plugin instalēt logstash-filter-prune

/usr/share/logstash/bin/logstash-plugin instalēt logstash-filter-multiline

NoklikŔķiniet uz Māja

Baļķu uzglabāŔana https://clickhouse.yandex/docs/ru/

https://packagecloud.io/Altinity/clickhouse/packages/el/7/clickhouse-server-19.5.3.8-1.el7.x86_64.rpm

https://packagecloud.io/Altinity/clickhouse/packages/el/7/clickhouse-client-19.5.3.8-1.el7.x86_64.rpm

PiezÄ«me. Sākot ar 2018. gada augustu, Yandex repozitorijā parādÄ«jās ā€œparastāsā€ RHEL apgriezienu versijas, lai jÅ«s varētu mēģināt tās izmantot. InstalÄ“Å”anas laikā mēs izmantojām Altinity izstrādātās pakotnes.

grafana

Žurnāla vizualizācija. Informācijas paneļu iestatīŔana

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos (64 bitu) - jaunākā versija

ClickHouse datu avots Grafana 4.6+

Grafana spraudnis ar ClickHouse datu avotu

https://grafana.com/plugins/vertamedia-clickhouse-datasource

https://grafana.com/api/plugins/vertamedia-clickhouse-datasource/versions/1.8.1/download

logstash

ReÄ£istrējiet marÅ”rutētāju no FileBeat uz RabbitMQ rindu.

PiezÄ«me. Diemžēl FileBeat nav izvades tieÅ”i uz RabbitMQ, tāpēc ir nepiecieÅ”ama starpsaite Logstash formā.

https://www.elastic.co/products/logstash

https://artifacts.elastic.co/downloads/logstash/logstash-7.0.1.rpm

RabbitMQ

ziņojumu rinda. Šis ir žurnāla buferis DMZ

https://www.rabbitmq.com/download.html

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14-1.el7.noarch.rpm

Erlang izpildlaiks (nepiecieŔams RabbitMQ)

Erlang izpildlaiks. NepiecieŔams, lai RabbitMQ darbotos

http://www.erlang.org/download.html

https://www.rabbitmq.com/install-rpm.html#install-erlang http://www.erlang.org/downloads/21.3

Servera konfigurācija ar ClickHouse datu bāzi ir parādīta Ŕajā tabulā:

Nosaukums

Vērtība

Piezīme

Konfigurācija

HDD: 40GB
RAM: 8GB
Procesors: Core 2 2GHz

Ir nepiecieÅ”ams pievērst uzmanÄ«bu padomiem ClickHouse datu bāzes lietoÅ”anai (https://clickhouse.yandex/docs/ru/operations/tips/)

Vispārējā sistēmas programmatūra

OS: Red Hat Enterprise Linux Server (Maipo)

JRE (Java 8)

 

Kā redzat, Ŕī ir parasta darbstacija.

Baļķu glabāŔanas tabulas struktūra ir Ŕāda:

log_web.sql

CREATE TABLE log_web (
  logdate Date,
  logdatetime DateTime CODEC(Delta, LZ4HC),
   
  fld_log_file_name LowCardinality( String ),
  fld_server_name LowCardinality( String ),
  fld_app_name LowCardinality( String ),
  fld_app_module LowCardinality( String ),
  fld_website_name LowCardinality( String ),
 
  serverIP LowCardinality( String ),
  method LowCardinality( String ),
  uriStem String,
  uriQuery String,
  port UInt32,
  username LowCardinality( String ),
  clientIP String,
  clientRealIP String,
  userAgent String,
  referer String,
  response String,
  subresponse String,
  win32response String,
  timetaken UInt64
   
  , uriQuery__utm_medium String
  , uriQuery__utm_source String
  , uriQuery__utm_campaign String
  , uriQuery__utm_term String
  , uriQuery__utm_content String
  , uriQuery__yclid String
  , uriQuery__region String
 
) Engine = MergeTree()
PARTITION BY toYYYYMM(logdate)
ORDER BY (fld_app_name, fld_app_module, logdatetime)
SETTINGS index_granularity = 8192;

Mēs izmantojam noklusējuma sadalÄ«Å”anu (pēc mēneÅ”a) un indeksa precizitāti. Visi lauki praktiski atbilst IIS žurnāla ierakstiem http pieprasÄ«jumu reÄ£istrÄ“Å”anai. AtseviŔķi mēs atzÄ«mējam, ka utm-tagu glabāŔanai ir atseviŔķi lauki (tie tiek parsēti, ievietojot tabulā no vaicājuma virknes lauka).

Tāpat tabulai ir pievienoti vairāki sistēmas lauki, lai saglabātu informāciju par sistēmām, komponentiem, serveriem. Å o lauku aprakstu skatiet tālāk esoÅ”ajā tabulā. Vienā tabulā mēs glabājam žurnālus vairākām sistēmām.

Nosaukums

Apraksts

Piemērs

fld_app_name

Lietojumprogrammas/sistēmas nosaukums
Derīgas vērtības:

  • site1.domain.com Ārējā vietne 1
  • site2.domain.com Ārējā vietne 2
  • internal-site1.domain.local 1. iekŔējā vietne

vietne1.domēns.com

fld_app_module

Sistēmas modulis
Derīgas vērtības:

  • tÄ«mekļa vietne
  • svc ā€” vietnes pakalpojums
  • intgr ā€” integrācijas tÄ«mekļa pakalpojums
  • bo ā€” administrators (BackOffice)

web

fld_website_name

Vietnes nosaukums IIS

Vienā serverī var izvietot vairākas sistēmas vai pat vairākus viena sistēmas moduļa gadījumus

tīmekļa galvenā

fld_servera_nosaukums

Servera nosaukums

web1.domain.com

fld_log_file_name

CeļŔ uz žurnāla failu serverī

C:inetpublogsLogFiles
W3SVC1u_ex190711.log

Tas ļauj efektÄ«vi izveidot grafikus programmā Grafana. Piemēram, skatiet pieprasÄ«jumus no noteiktas sistēmas priekÅ”gala. Tas ir lÄ«dzÄ«gs vietņu skaitÄ«tājam pakalpojumā Yandex.Metrica.

Å eit ir daži statistikas dati par datu bāzes izmantoÅ”anu divu mēneÅ”u laikā.

Ierakstu skaits, kas sadalīts pa sistēmām un to sastāvdaļām

SELECT
    fld_app_name,
    fld_app_module,
    count(fld_app_name) AS rows_count
FROM log_web
GROUP BY
    fld_app_name,
    fld_app_module
    WITH TOTALS
ORDER BY
    fld_app_name ASC,
    rows_count DESC
 
ā”Œā”€fld_app_nameā”€ā”€ā”€ā”€ā”€ā”¬ā”€fld_app_moduleā”€ā”¬ā”€rows_countā”€ā”
ā”‚ site1.domain.ru  ā”‚ web            ā”‚     131441 ā”‚
ā”‚ site2.domain.ru  ā”‚ web            ā”‚    1751081 ā”‚
ā”‚ site3.domain.ru  ā”‚ web            ā”‚  106887543 ā”‚
ā”‚ site3.domain.ru  ā”‚ svc            ā”‚   44908603 ā”‚
ā”‚ site3.domain.ru  ā”‚ intgr          ā”‚    9813911 ā”‚
ā”‚ site4.domain.ru  ā”‚ web            ā”‚     772095 ā”‚
ā”‚ site5.domain.ru  ā”‚ web            ā”‚   17037221 ā”‚
ā”‚ site5.domain.ru  ā”‚ intgr          ā”‚     838559 ā”‚
ā”‚ site5.domain.ru  ā”‚ bo             ā”‚       7404 ā”‚
ā”‚ site6.domain.ru  ā”‚ web            ā”‚     595877 ā”‚
ā”‚ site7.domain.ru  ā”‚ web            ā”‚   27778858 ā”‚
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
 
Totals:
ā”Œā”€fld_app_nameā”€ā”¬ā”€fld_app_moduleā”€ā”¬ā”€rows_countā”€ā”
ā”‚              ā”‚                ā”‚  210522593 ā”‚
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
 
11 rows in set. Elapsed: 4.874 sec. Processed 210.52 million rows, 421.67 MB (43.19 million rows/s., 86.51 MB/s.)

Datu apjoms diskā

SELECT
    formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed,
    formatReadableSize(sum(data_compressed_bytes)) AS compressed,
    sum(rows) AS total_rows
FROM system.parts
WHERE table = 'log_web'
 
ā”Œā”€uncompressedā”€ā”¬ā”€compressedā”€ā”¬ā”€total_rowsā”€ā”
ā”‚ 54.50 GiB    ā”‚ 4.86 GiB   ā”‚  211427094 ā”‚
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
 
1 rows in set. Elapsed: 0.035 sec.

Datu saspieŔanas pakāpe kolonnās

SELECT
    name,
    formatReadableSize(data_uncompressed_bytes) AS uncompressed,
    formatReadableSize(data_compressed_bytes) AS compressed,
    data_uncompressed_bytes / data_compressed_bytes AS compress_ratio
FROM system.columns
WHERE table = 'log_web'
 
ā”Œā”€nameā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€uncompressedā”€ā”¬ā”€compressedā”€ā”¬ā”€ā”€ā”€ā”€ā”€compress_ratioā”€ā”
ā”‚ logdate                ā”‚ 401.53 MiB   ā”‚ 1.80 MiB   ā”‚ 223.16665968777315 ā”‚
ā”‚ logdatetime            ā”‚ 803.06 MiB   ā”‚ 35.91 MiB  ā”‚ 22.363966401202305 ā”‚
ā”‚ fld_log_file_name      ā”‚ 220.66 MiB   ā”‚ 2.60 MiB   ā”‚  84.99905736932571 ā”‚
ā”‚ fld_server_name        ā”‚ 201.54 MiB   ā”‚ 50.63 MiB  ā”‚  3.980924816977078 ā”‚
ā”‚ fld_app_name           ā”‚ 201.17 MiB   ā”‚ 969.17 KiB ā”‚ 212.55518183686877 ā”‚
ā”‚ fld_app_module         ā”‚ 201.17 MiB   ā”‚ 968.60 KiB ā”‚ 212.67805817411906 ā”‚
ā”‚ fld_website_name       ā”‚ 201.54 MiB   ā”‚ 1.24 MiB   ā”‚  162.7204926761546 ā”‚
ā”‚ serverIP               ā”‚ 201.54 MiB   ā”‚ 50.25 MiB  ā”‚  4.010824061219731 ā”‚
ā”‚ method                 ā”‚ 201.53 MiB   ā”‚ 43.64 MiB  ā”‚  4.617721053304486 ā”‚
ā”‚ uriStem                ā”‚ 5.13 GiB     ā”‚ 832.51 MiB ā”‚  6.311522291936919 ā”‚
ā”‚ uriQuery               ā”‚ 2.58 GiB     ā”‚ 501.06 MiB ā”‚  5.269731450124478 ā”‚
ā”‚ port                   ā”‚ 803.06 MiB   ā”‚ 3.98 MiB   ā”‚ 201.91673864241824 ā”‚
ā”‚ username               ā”‚ 318.08 MiB   ā”‚ 26.93 MiB  ā”‚ 11.812513794583598 ā”‚
ā”‚ clientIP               ā”‚ 2.35 GiB     ā”‚ 82.59 MiB  ā”‚ 29.132328640073343 ā”‚
ā”‚ clientRealIP           ā”‚ 2.49 GiB     ā”‚ 465.05 MiB ā”‚  5.478382297052563 ā”‚
ā”‚ userAgent              ā”‚ 18.34 GiB    ā”‚ 764.08 MiB ā”‚  24.57905114484208 ā”‚
ā”‚ referer                ā”‚ 14.71 GiB    ā”‚ 1.37 GiB   ā”‚ 10.736792723669906 ā”‚
ā”‚ response               ā”‚ 803.06 MiB   ā”‚ 83.81 MiB  ā”‚  9.582334090987247 ā”‚
ā”‚ subresponse            ā”‚ 399.87 MiB   ā”‚ 1.83 MiB   ā”‚  218.4831068635027 ā”‚
ā”‚ win32response          ā”‚ 407.86 MiB   ā”‚ 7.41 MiB   ā”‚ 55.050315514606815 ā”‚
ā”‚ timetaken              ā”‚ 1.57 GiB     ā”‚ 402.06 MiB ā”‚ 3.9947395692010637 ā”‚
ā”‚ uriQuery__utm_medium   ā”‚ 208.17 MiB   ā”‚ 12.29 MiB  ā”‚ 16.936148912472955 ā”‚
ā”‚ uriQuery__utm_source   ā”‚ 215.18 MiB   ā”‚ 13.00 MiB  ā”‚ 16.548367623199912 ā”‚
ā”‚ uriQuery__utm_campaign ā”‚ 381.46 MiB   ā”‚ 37.94 MiB  ā”‚ 10.055156353418509 ā”‚
ā”‚ uriQuery__utm_term     ā”‚ 231.82 MiB   ā”‚ 10.78 MiB  ā”‚ 21.502540454070672 ā”‚
ā”‚ uriQuery__utm_content  ā”‚ 441.34 MiB   ā”‚ 87.60 MiB  ā”‚  5.038260760449327 ā”‚
ā”‚ uriQuery__yclid        ā”‚ 216.88 MiB   ā”‚ 16.58 MiB  ā”‚  13.07721335008116 ā”‚
ā”‚ uriQuery__region       ā”‚ 204.35 MiB   ā”‚ 9.49 MiB   ā”‚  21.52661903446796 ā”‚
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
 
28 rows in set. Elapsed: 0.005 sec.

Izmantoto komponentu apraksts

FileBeat. Failu žurnālu pārsūtīŔana

Å is komponents izseko diskā esoÅ”o žurnālfailu izmaiņas un nodod informāciju žurnālam LogStash. Instalēta visos serveros, kur tiek rakstÄ«ti žurnālfaili (parasti IIS). Darbojas astes režīmā (t.i., failā pārsÅ«ta tikai pievienotos ierakstus). Bet atseviŔķi to var konfigurēt, lai pārsÅ«tÄ«tu visus failus. Tas ir noderÄ«gi, ja nepiecieÅ”ams lejupielādēt datus no iepriekŔējiem mēneÅ”iem. VienkārÅ”i ievietojiet žurnālfailu mapē, un tas nolasÄ«s to pilnÄ«bā.

Kad pakalpojums tiek apturēts, dati vairs netiek pārsūtīti tālāk uz krātuvi.

Konfigurācijas piemērs izskatās Ŕādi:

filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - C:/inetpub/logs/LogFiles/W3SVC1/*.log
  exclude_files: ['.gz$','.zip$']
  tail_files: true
  ignore_older: 24h
  fields:
    fld_server_name: "site1.domain.ru"
    fld_app_name: "site1.domain.ru"
    fld_app_module: "web"
    fld_website_name: "web-main"
 
- type: log
  enabled: true
  paths:
    - C:/inetpub/logs/LogFiles/__Import/access_log-*
  exclude_files: ['.gz$','.zip$']
  tail_files: false
  fields:
    fld_server_name: "site2.domain.ru"
    fld_app_name: "site2.domain.ru"
    fld_app_module: "web"
    fld_website_name: "web-main"
    fld_logformat: "logformat__apache"
 
 
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
  reload.period: 2s
 
output.logstash:
  hosts: ["log.domain.com:5044"]
 
  ssl.enabled: true
  ssl.certificate_authorities: ["C:/filebeat/certs/ca.pem", "C:/filebeat/certs/ca-issuing.pem"]
  ssl.certificate: "C:/filebeat/certs/site1.domain.ru.cer"
  ssl.key: "C:/filebeat/certs/site1.domain.ru.key"
 
#================================ Processors =====================================
 
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

logstash. Baļķu savācējs

Å is komponents ir paredzēts žurnāla ierakstu saņemÅ”anai no FileBeat (vai caur RabbitMQ rindu), analizējot un ievietojot partijas ClickHouse datu bāzē.

IevietoÅ”anai ClickHouse tiek izmantots spraudnis Logstash-output-clickhouse. Logstash spraudnim ir pieprasÄ«juma atkārtoÅ”anas mehānisms, taču ar regulāru izslēgÅ”anu labāk ir apturēt paÅ”u pakalpojumu. Apturot, ziņojumi tiks uzkrāti RabbitMQ rindā, tāpēc, ja apstāŔanās ir uz ilgu laiku, labāk ir apturēt Filebeats serveros. Shēmā, kurā netiek izmantots RabbitMQ (lokālajā tÄ«klā Filebeat tieÅ”i nosÅ«ta žurnālus uz Logstash), Filebeats darbojas diezgan pieņemami un droÅ”i, tāpēc viņiem izvades nepieejamÄ«ba paiet bez sekām.

Konfigurācijas piemērs izskatās Ŕādi:

log_web__filebeat_clickhouse.conf

input {
 
    beats {
        port => 5044
        type => 'iis'
        ssl => true
        ssl_certificate_authorities => ["/etc/logstash/certs/ca.cer", "/etc/logstash/certs/ca-issuing.cer"]
        ssl_certificate => "/etc/logstash/certs/server.cer"
        ssl_key => "/etc/logstash/certs/server-pkcs8.key"
        ssl_verify_mode => "peer"
 
            add_field => {
                "fld_server_name" => "%{[fields][fld_server_name]}"
                "fld_app_name" => "%{[fields][fld_app_name]}"
                "fld_app_module" => "%{[fields][fld_app_module]}"
                "fld_website_name" => "%{[fields][fld_website_name]}"
                "fld_log_file_name" => "%{source}"
                "fld_logformat" => "%{[fields][fld_logformat]}"
            }
    }
 
    rabbitmq {
        host => "queue.domain.com"
        port => 5671
        user => "q-reader"
        password => "password"
        queue => "web_log"
        heartbeat => 30
        durable => true
        ssl => true
        #ssl_certificate_path => "/etc/logstash/certs/server.p12"
        #ssl_certificate_password => "password"
 
        add_field => {
            "fld_server_name" => "%{[fields][fld_server_name]}"
            "fld_app_name" => "%{[fields][fld_app_name]}"
            "fld_app_module" => "%{[fields][fld_app_module]}"
            "fld_website_name" => "%{[fields][fld_website_name]}"
            "fld_log_file_name" => "%{source}"
            "fld_logformat" => "%{[fields][fld_logformat]}"
        }
    }
 
}
 
filter { 
 
      if [message] =~ "^#" {
        drop {}
      }
 
      if [fld_logformat] == "logformat__iis_with_xrealip" {
     
          grok {
            match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{IP:serverIP} %{WORD:method} %{NOTSPACE:uriStem} %{NOTSPACE:uriQuery} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientIP} %{NOTSPACE:userAgent} %{NOTSPACE:referer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:win32response} %{NUMBER:timetaken} %{NOTSPACE:xrealIP} %{NOTSPACE:xforwarderfor}"]
          }
      } else {
   
          grok {
             match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{IP:serverIP} %{WORD:method} %{NOTSPACE:uriStem} %{NOTSPACE:uriQuery} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientIP} %{NOTSPACE:userAgent} %{NOTSPACE:referer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:win32response} %{NUMBER:timetaken}"]
          }
 
      }
 
      date {
        match => [ "log_timestamp", "YYYY-MM-dd HH:mm:ss" ]
          timezone => "Etc/UTC"
        remove_field => [ "log_timestamp", "@timestamp" ]
        target => [ "log_timestamp2" ]
      }
 
        ruby {
            code => "tstamp = event.get('log_timestamp2').to_i
                        event.set('logdatetime', Time.at(tstamp).strftime('%Y-%m-%d %H:%M:%S'))
                        event.set('logdate', Time.at(tstamp).strftime('%Y-%m-%d'))"
        }
 
      if [bytesSent] {
        ruby {
          code => "event['kilobytesSent'] = event['bytesSent'].to_i / 1024.0"
        }
      }
 
 
      if [bytesReceived] {
        ruby {
          code => "event['kilobytesReceived'] = event['bytesReceived'].to_i / 1024.0"
        }
      }
 
   
        ruby {
            code => "event.set('clientRealIP', event.get('clientIP'))"
        }
        if [xrealIP] {
            ruby {
                code => "event.set('clientRealIP', event.get('xrealIP'))"
            }
        }
        if [xforwarderfor] {
            ruby {
                code => "event.set('clientRealIP', event.get('xforwarderfor'))"
            }
        }
 
      mutate {
        convert => ["bytesSent", "integer"]
        convert => ["bytesReceived", "integer"]
        convert => ["timetaken", "integer"] 
        convert => ["port", "integer"]
 
        add_field => {
            "clientHostname" => "%{clientIP}"
        }
      }
 
        useragent {
            source=> "useragent"
            prefix=> "browser"
        }
 
        kv {
            source => "uriQuery"
            prefix => "uriQuery__"
            allow_duplicate_values => false
            field_split => "&"
            include_keys => [ "utm_medium", "utm_source", "utm_campaign", "utm_term", "utm_content", "yclid", "region" ]
        }
 
        mutate {
            join => { "uriQuery__utm_source" => "," }
            join => { "uriQuery__utm_medium" => "," }
            join => { "uriQuery__utm_campaign" => "," }
            join => { "uriQuery__utm_term" => "," }
            join => { "uriQuery__utm_content" => "," }
            join => { "uriQuery__yclid" => "," }
            join => { "uriQuery__region" => "," }
        }
 
}
 
output { 
  #stdout {codec => rubydebug}
    clickhouse {
      headers => ["Authorization", "Basic abcdsfks..."]
      http_hosts => ["http://127.0.0.1:8123"]
      save_dir => "/etc/logstash/tmp"
      table => "log_web"
      request_tolerance => 1
      flush_size => 10000
      idle_flush_time => 1
        mutations => {
            "fld_log_file_name" => "fld_log_file_name"
            "fld_server_name" => "fld_server_name"
            "fld_app_name" => "fld_app_name"
            "fld_app_module" => "fld_app_module"
            "fld_website_name" => "fld_website_name"
 
            "logdatetime" => "logdatetime"
            "logdate" => "logdate"
            "serverIP" => "serverIP"
            "method" => "method"
            "uriStem" => "uriStem"
            "uriQuery" => "uriQuery"
            "port" => "port"
            "username" => "username"
            "clientIP" => "clientIP"
            "clientRealIP" => "clientRealIP"
            "userAgent" => "userAgent"
            "referer" => "referer"
            "response" => "response"
            "subresponse" => "subresponse"
            "win32response" => "win32response"
            "timetaken" => "timetaken"
             
            "uriQuery__utm_medium" => "uriQuery__utm_medium"
            "uriQuery__utm_source" => "uriQuery__utm_source"
            "uriQuery__utm_campaign" => "uriQuery__utm_campaign"
            "uriQuery__utm_term" => "uriQuery__utm_term"
            "uriQuery__utm_content" => "uriQuery__utm_content"
            "uriQuery__yclid" => "uriQuery__yclid"
            "uriQuery__region" => "uriQuery__region"
        }
    }
 
}

cauruļvadi.yml

# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
#   https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
 
- pipeline.id: log_web__filebeat_clickhouse
  path.config: "/etc/logstash/log_web__filebeat_clickhouse.conf"

Clickhouse. Baļķu uzglabāŔana

Visu sistēmu žurnāli tiek glabāti vienā tabulā (skatiet raksta sākumā). Tas ir paredzēts, lai saglabātu informāciju par pieprasÄ«jumiem: visi parametri ir lÄ«dzÄ«gi dažādiem formātiem, piemēram, IIS žurnāliem, apache un nginx žurnāliem. Lietojumprogrammu žurnāliem, kuros, piemēram, tiek fiksētas kļūdas, informatÄ«vie ziņojumi, brÄ«dinājumi, tiks nodroÅ”ināta atseviŔķa tabula ar atbilstoÅ”u struktÅ«ru (Å”obrÄ«d projektÄ“Å”anas stadijā).

Veidojot tabulu, ir ļoti svarÄ«gi izlemt par primāro atslēgu (pēc kuras dati tiks kārtoti uzglabāŔanas laikā). No tā ir atkarÄ«ga datu saspieÅ”anas pakāpe un vaicājuma ātrums. MÅ«su piemērā galvenais ir
ORDER BY (fld_app_name, fld_app_module, logdatetime)
Tas ir, pēc sistēmas nosaukuma, sistēmas komponenta nosaukuma un notikuma datuma. Sākotnēji pirmajā vietā bija notikuma datums. Pārvietojot to uz pēdējo vietu, vaicājumi sāka darboties apmēram divreiz ātrāk. Lai mainÄ«tu primāro atslēgu, bÅ«s atkārtoti jāizveido tabula un jāielādē dati, lai ClickHouse atkārtoti kārtotu datus diskā. Å Ä« ir smaga darbÄ«ba, tāpēc ir lietderÄ«gi daudz domāt par to, kas jāiekļauj kārtoÅ”anas atslēgā.

Jāpiebilst arÄ«, ka LowCardinality datu tips ir salÄ«dzinoÅ”i parādÄ«jies jaunākajās versijās. Izmantojot to, saspiesto datu lielums tiek krasi samazināts tiem laukiem, kuriem ir zema kardinalitāte (maz iespēju).

PaÅ”laik tiek izmantota versija 19.6, un mēs plānojam mēģināt atjaunināt uz jaunāko versiju. Tām ir tādas brÄ«niŔķīgas funkcijas kā, piemēram, Adaptive Granularity, Skipping indeksi un DoubleDelta kodeks.

Pēc noklusējuma instalÄ“Å”anas laikā reÄ£istrÄ“Å”anas lÄ«menis ir iestatÄ«ts uz izsekoÅ”anu konfigurācijā. Žurnāli tiek pagriezti un arhivēti, bet tajā paŔā laikā tie paplaÅ”inās lÄ«dz gigabaitam. Ja nav vajadzÄ«bas, tad var iestatÄ«t brÄ«dinājuma lÄ«meni, tad baļķa izmērs tiek krasi samazināts. ReÄ£istrācijas iestatÄ«jums ir iestatÄ«ts failā config.xml:

<!-- Possible levels: https://github.com/pocoproject/poco/blob/develop/Foundation/include/Poco/Logger. h#L105 -->
<level>warning</level>

Dažas noderīgas komandas

ŠŸŠ¾ŃŠŗŠ¾Š»ŃŒŠŗу Š¾Ń€ŠøŠ³ŠøŠ½Š°Š»ŃŒŠ½Ń‹Šµ ŠæŠ°ŠŗŠµŃ‚Ń‹ устŠ°Š½Š¾Š²ŠŗŠø сŠ¾Š±ŠøрŠ°ŃŽŃ‚ся ŠæŠ¾ Debian, тŠ¾ Š“Š»Ń Š“руŠ³Šøх Š²ŠµŃ€ŃŠøŠ¹ Linux Š½ŠµŠ¾Š±Ń…Š¾Š“ŠøŠ¼Š¾ ŠøсŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ ŠæŠ°ŠŗŠµŃ‚Ń‹ сŠ¾Š±Ń€Š°Š½Š½Ń‹Šµ ŠŗŠ¾Š¼ŠæŠ°Š½ŠøŠµŠ¹ Altinity.
 
Š’Š¾Ń‚ ŠæŠ¾ этŠ¾Š¹ ссыŠ»ŠŗŠµ ŠµŃŃ‚ŃŒ ŠøŠ½ŃŃ‚Ń€ŃƒŠŗцŠøŠø с ссыŠ»ŠŗŠ°Š¼Šø Š½Š° Šøх рŠµŠæŠ¾Š·ŠøтŠ¾Ń€ŠøŠ¹: https://www.altinity.com/blog/2017/12/18/logstash-with-clickhouse
sudo yum search clickhouse-server
sudo yum install clickhouse-server.noarch
  
1. ŠæрŠ¾Š²ŠµŃ€ŠŗŠ° стŠ°Ń‚ŃƒŃŠ°
sudo systemctl status clickhouse-server
 
2. Š¾ŃŃ‚Š°Š½Š¾Š²ŠŗŠ° сŠµŃ€Š²ŠµŃ€Š°
sudo systemctl stop clickhouse-server
 
3. Š·Š°ŠæусŠŗ сŠµŃ€Š²ŠµŃ€Š°
sudo systemctl start clickhouse-server
 
Š—Š°ŠæусŠŗ Š“Š»Ń Š²Ń‹ŠæŠ¾Š»Š½ŠµŠ½Šøя Š·Š°ŠæрŠ¾ŃŠ¾Š² Š² Š¼Š½Š¾Š³Š¾ŃŃ‚Ń€Š¾Ń‡Š½Š¾Š¼ рŠµŠ¶ŠøŠ¼Šµ (Š²Ń‹ŠæŠ¾Š»Š½ŠµŠ½ŠøŠµ ŠæŠ¾ŃŠ»Šµ Š·Š½Š°ŠŗŠ° ";")
clickhouse-client --multiline
clickhouse-client --multiline --host 127.0.0.1 --password pa55w0rd
clickhouse-client --multiline --host 127.0.0.1 --port 9440 --secure --user default --password pa55w0rd
 
ŠŸŠ»Š°Š³ŠøŠ½ ŠŗŠ»ŠøŠŗŠ»Š°ŃƒŠ·Š° Š“Š»Ń Š»Š¾Š³ŃŃ‚ŠµŃˆ Š² сŠ»ŃƒŃ‡Š°Šµ Š¾ŃˆŠøŠ±ŠŗŠø Š² Š¾Š“Š½Š¾Š¹ стрŠ¾ŠŗŠµ сŠ¾Ń…Ń€Š°Š½ŃŠµŃ‚ Š²ŃŃŽ ŠæŠ°Ń‡Šŗу Š² фŠ°Š¹Š» /tmp/log_web_failed.json
ŠœŠ¾Š¶Š½Š¾ Š²Ń€ŃƒŃ‡Š½ŃƒŃŽ ŠøсŠæрŠ°Š²Šøть этŠ¾Ń‚ фŠ°Š¹Š» Šø ŠæŠ¾ŠæрŠ¾Š±Š¾Š²Š°Ń‚ŃŒ Š·Š°Š»Šøть ŠµŠ³Š¾ Š² Š‘Š” Š²Ń€ŃƒŃ‡Š½ŃƒŃŽ:
clickhouse-client --host 127.0.0.1 --password password --query="INSERT INTO log_web FORMAT JSONEachRow" < /tmp/log_web_failed__fixed.json
 
sudo mv /etc/logstash/tmp/log_web_failed.json /etc/logstash/tmp/log_web_failed__fixed.json
sudo chown user_dev /etc/logstash/tmp/log_web_failed__fixed.json
sudo clickhouse-client --host 127.0.0.1 --password password --query="INSERT INTO log_web FORMAT JSONEachRow" < /etc/logstash/tmp/log_web_failed__fixed.json
sudo mv /etc/logstash/tmp/log_web_failed__fixed.json /etc/logstash/tmp/log_web_failed__fixed_.json
 
Š²Ń‹Ń…Š¾Š“ ŠøŠ· ŠŗŠ¾Š¼Š°Š½Š“Š½Š¾Š¹ стрŠ¾ŠŗŠø
quit;
## ŠŠ°ŃŃ‚Ń€Š¾Š¹ŠŗŠ° TLS
https://www.altinity.com/blog/2019/3/5/clickhouse-networking-part-2
 
openssl s_client -connect log.domain.com:9440 < /dev/null

logstash. ReÄ£istrējiet marÅ”rutētāju no FileBeat uz RabbitMQ rindu

Å is komponents tiek izmantots, lai marÅ”rutētu žurnālus, kas nāk no FileBeat uz RabbitMQ rindu. Å eit ir divi punkti:

  1. Diemžēl FileBeat nav izvades spraudņa, lai rakstÄ«tu tieÅ”i uz RabbitMQ. Un Ŕāda funkcionalitāte, spriežot pēc problēmas viņu githubā, nav paredzēta ievieÅ”anai. Kafkai ir spraudnis, taču kaut kādu iemeslu dēļ mēs to nevaram izmantot mājās.
  2. DMZ ir noteiktas prasÄ«bas baļķu savākÅ”anai. Pamatojoties uz tiem, žurnāli vispirms jāpievieno rindai un pēc tam LogStash nolasa ierakstus no rindas no ārpuses.

Tāpēc gadÄ«jumā, ja serveri atrodas DMZ, ir jāizmanto Ŕāda nedaudz sarežģīta shēma. Konfigurācijas piemērs izskatās Ŕādi:

iis_w3c_logs__filebeat_rabbitmq.conf

input {
 
    beats {
        port => 5044
        type => 'iis'
        ssl => true
        ssl_certificate_authorities => ["/etc/pki/tls/certs/app/ca.pem", "/etc/pki/tls/certs/app/ca-issuing.pem"]
        ssl_certificate => "/etc/pki/tls/certs/app/queue.domain.com.cer"
        ssl_key => "/etc/pki/tls/certs/app/queue.domain.com-pkcs8.key"
        ssl_verify_mode => "peer"
    }
 
}
 
output { 
  #stdout {codec => rubydebug}
 
    rabbitmq {
        host => "127.0.0.1"
        port => 5672
        exchange => "monitor.direct"
        exchange_type => "direct"
        key => "%{[fields][fld_app_name]}"
        user => "q-writer"
        password => "password"
        ssl => false
    }
}

RabbitMQ. ziņojumu rinda

Å is komponents tiek izmantots, lai buferētu žurnāla ierakstus DMZ. IerakstÄ«Å”ana tiek veikta, izmantojot virkni Filebeat ā†’ LogStash. LasÄ«Å”ana tiek veikta ārpus DMZ, izmantojot LogStash. Darbojoties ar RabboitMQ, tiek apstrādāti aptuveni 4 tÅ«kstoÅ”i ziņojumu sekundē.

Ziņojumu marÅ”rutÄ“Å”ana tiek konfigurēta pēc sistēmas nosaukuma, t.i., pamatojoties uz FileBeat konfigurācijas datiem. Visi ziņojumi nonāk vienā rindā. Ja kāda iemesla dēļ rindas pakalpojums tiek apturēts, tas neizraisÄ«s ziņojumu zudumu: FileBeats saņems savienojuma kļūdas un uz laiku aptur sÅ«tÄ«Å”anu. Un LogStash, kas nolasa no rindas, arÄ« saņems tÄ«kla kļūdas un gaidÄ«s, kad savienojums tiks atjaunots. Å ajā gadÄ«jumā dati, protams, vairs netiks ierakstÄ«ti datu bāzē.

Lai izveidotu un konfigurētu rindas, tiek izmantoti Ŕādi norādÄ«jumi:

sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin declare exchange --vhost=/ name=monitor.direct type=direct sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin declare queue --vhost=/ name=web_log durable=true
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin --vhost="/" declare binding source="monitor.direct" destination_type="queue" destination="web_log" routing_key="site1.domain.ru"
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin --vhost="/" declare binding source="monitor.direct" destination_type="queue" destination="web_log" routing_key="site2.domain.ru"

Grafana. Informācijas paneļi

Šo komponentu izmanto, lai vizualizētu uzraudzības datus. Šajā gadījumā jums jāinstalē ClickHouse datu avots Grafana 4.6+ spraudnim. Mums tas bija nedaudz jāpielāgo, lai uzlabotu SQL filtru apstrādes efektivitāti informācijas panelī.

Piemēram, mēs izmantojam mainÄ«gos, un, ja tie nav iestatÄ«ti filtra laukā, mēs vēlamies, lai tas neÄ£enerētu nosacÄ«jumu formas WHERE ( uriStem = Ā» UN uriStem != Ā» ). Å ajā gadÄ«jumā ClickHouse nolasÄ«s kolonnu uriStem. Kopumā mēs izmēģinājām dažādas iespējas un galu galā izlabojām spraudni (makro $valueIfEmpty), lai tukÅ”as vērtÄ«bas gadÄ«jumā tas atgrieztu 1, neminot paÅ”u kolonnu.

Un tagad jūs varat izmantot Ŕo vaicājumu diagrammai

$columns(response, count(*) c) from $table where $adhoc
and $valueIfEmpty($fld_app_name, 1, fld_app_name = '$fld_app_name')
and $valueIfEmpty($fld_app_module, 1, fld_app_module = '$fld_app_module') and $valueIfEmpty($fld_server_name, 1, fld_server_name = '$fld_server_name') and $valueIfEmpty($uriStem, 1, uriStem like '%$uriStem%')
and $valueIfEmpty($clientRealIP, 1, clientRealIP = '$clientRealIP')

kas nozÄ«mē Å”o SQL (ņemiet vērā, ka tukÅ”ie uriStem lauki ir pārveidoti tikai par 1)

SELECT
t,
groupArray((response, c)) AS groupArr
FROM (
SELECT
(intDiv(toUInt32(logdatetime), 60) * 60) * 1000 AS t, response,
count(*) AS c FROM default.log_web
WHERE (logdate >= toDate(1565061982)) AND (logdatetime >= toDateTime(1565061982)) AND 1 AND (fld_app_name = 'site1.domain.ru') AND (fld_app_module = 'web') AND 1 AND 1 AND 1
GROUP BY
t, response
ORDER BY
t ASC,
response ASC
)
GROUP BY t ORDER BY t ASC

Secinājums

ClickHouse datu bāzes parādÄ«Å”anās ir kļuvusi par nozÄ«mÄ«gu notikumu tirgÅ«. Bija grÅ«ti iedomāties, ka pilnÄ«gi bez maksas vienā mirklÄ« bijām bruņoti ar jaudÄ«gu un praktisku rÄ«ku darbam ar lielajiem datiem. Protams, pieaugot vajadzÄ«bām (piemēram, sadalÄ«Å”ana un replikācija uz vairākiem serveriem), shēma kļūs sarežģītāka. Bet pēc pirmajiem iespaidiem darbs ar Å”o datubāzi ir ļoti patÄ«kams. Var redzēt, ka produkts ir radÄ«ts "cilvēkiem".

SalÄ«dzinot ar ElasticSearch, tiek lēsts, ka žurnālu glabāŔanas un apstrādes izmaksas samazināsies piecas lÄ«dz desmit reizes. Proti, ja pie paÅ”reizējā datu apjoma mums bÅ«tu jāizveido vairāku maŔīnu klasteris, tad, izmantojot ClickHouse, mums pietiek ar vienu mazjaudas maŔīnu. Jā, protams, ElasticSearch ir arÄ« diska datu saspieÅ”anas mehānismi un citas iespējas, kas var bÅ«tiski samazināt resursu patēriņu, taču, salÄ«dzinot ar ClickHouse, tas izmaksās dārgāk.

Bez Ä«paÅ”as optimizācijas no mÅ«su puses, pēc noklusējuma iestatÄ«jumiem datu ielāde un atlase no datu bāzes darbojas pārsteidzoŔā ātrumā. Mums vēl nav daudz datu (apmēram 200 miljoni ierakstu), bet pats serveris ir vājÅ”. Å o rÄ«ku nākotnē varēsim izmantot citiem mērÄ·iem, kas nav saistÄ«ti ar žurnālu glabāŔanu. Piemēram, pilnÄ«gai analÄ«zei droŔības jomā, maŔīnmācÄ«bai.

Nobeigumā nedaudz par plusiem un mīnusiem.

MÄ«nusi

  1. Ierakstu ielāde lielās partijās. No vienas puses, tā ir funkcija, taču ierakstu buferÄ“Å”anai joprojām ir jāizmanto papildu komponenti. Å is uzdevums ne vienmēr ir viegls, bet tomēr atrisināms. Un es gribētu vienkārÅ”ot shēmu.
  2. Dažas eksotiskas funkcijas vai jaunas funkcijas bieži sabojājas jaunās versijās. Tas rada bažas, samazinot vēlmi jaunināt uz jaunu versiju. Piemēram, Kafka tabulas dzinējs ir ļoti noderÄ«ga funkcija, kas ļauj tieÅ”i lasÄ«t notikumus no Kafka, neievieÅ”ot patērētājus. Bet, spriežot pēc github problēmu skaita, mēs joprojām esam uzmanÄ«gi, lai neizmantotu Å”o dzinēju ražoÅ”anā. Taču, ja neveicat pēkŔņus žestus uz sāniem un izmantojat galveno funkcionalitāti, tad tas darbojas stabili.

Plusi

  1. Nebremzē.
  2. Zems ieejas slieksnis.
  3. Atvērtais avots.
  4. Bezmaksas.
  5. Labi mērogojas (sadalÄ«Å”ana/replicÄ“Å”ana no iepakojuma)
  6. Iekļauts Sakaru ministrijas ieteiktajā Krievijas programmatūras reģistrā.
  7. Oficiālā atbalsta klātbūtne no Yandex.

Avots: www.habr.com

Pievieno komentāru