Alexej Lizunov, vedoucĂ oddÄlenĂ centra kompetencĂ pro vzdĂĄlenĂ© sluĆŸby informaÄnĂch technologiĂ MKB

Jako alternativu k technologickĂ©mu stacku ELK (ElasticSearch, Logstash, Kibana) provĂĄdĂme vĂœzkumnĂ© prĂĄce na vyuĆŸitĂ databĂĄze ClickHouse jako datovĂ©ho ĂșloĆŸiĆĄtÄ pro logy.
V tomto ÄlĂĄnku bychom chtÄli sdĂlet naĆĄe zkuĆĄenosti s pouĆŸĂvĂĄnĂm databĂĄze ClickHouse a pĆedbÄĆŸnĂ© vĂœsledky z pilotnĂho provozu. Je nutnĂ© hned ĆĂci, ĆŸe vĂœsledky byly pĆŻsobivĂ©.

DĂĄle podrobnÄ popĂĆĄeme, jak mĂĄme systĂ©m nastavenĂœ a z jakĂœch komponentĆŻ se sklĂĄdĂĄ. Ale nynĂ bych chtÄl trochu hovoĆit o tĂ©to databĂĄzi obecnÄ a proÄ na ni stojĂ za to se zamÄĆit. DatabĂĄze ClickHouse je vysoce vĂœkonnĂĄ analytickĂĄ sloupcovĂĄ databĂĄze od Yandexu. PouĆŸĂvĂĄ se v sluĆŸbĂĄch Yandexu a pĆŻvodnÄ to bylo hlavnĂ datovĂ© ĂșloĆŸiĆĄtÄ pro Yandex.Metrika. Je to open-source, zdarma. Z pohledu vĂœvojĂĄĆe mÄ vĆŸdy zajĂmalo, jak to majĂ realizovanĂ©, jelikoĆŸ pracujĂ s fantasticky velkĂœmi daty. A uĆŸivatelskĂ© rozhranĂ Metriky je velmi flexibilnĂ a rychlĂ©. PĆi prvnĂm setkĂĄnĂ s touto databĂĄzĂ je dojem: 'KoneÄnÄ! UdÄlĂĄno "pro lidi"! Od procesu instalace aĆŸ po odesĂlĂĄnĂ dotazĆŻ.'
Tato databĂĄze mĂĄ velmi nĂzkou vstupnĂ bariĂ©ru. I prĆŻmÄrnÄ kvalifikovanĂœ vĂœvojĂĄĆ mĆŻĆŸe za pĂĄr minut tuto databĂĄzi nainstalovat a zaÄĂt ji pouĆŸĂvat. VĆĄechno funguje hladce. Dokonce i lidĂ©, kteĆĂ nejsou dobĆe obeznĂĄmeni s Linuxem, mohou pomÄrnÄ rychle zvlĂĄdnout instalaci a provĂĄdÄt zĂĄkladnĂ operace. Pokud dĆĂve pĆi slovÄ Big Data, Hadoop, Google BigTable, HDFS, mÄl obyÄejnĂœ vĂœvojĂĄĆ pĆedstavy, ĆŸe jde o nÄjakĂ© terabajty, petabajty, ĆŸe konfiguracĂ a vĂœvojem pro tyto systĂ©my se zabĂœvajĂ nÄjacĂ nadlidĂ©, s pĆĂchodem databĂĄze ClickHouse jsme zĂskali jednoduchĂœ, srozumitelnĂœ nĂĄstroj, se kterĂœm mĆŻĆŸeme ĆeĆĄit dosud nedosaĆŸitelnĂ© Ășkoly. StaÄĂ prĆŻmÄrnĂœ stroj a pÄt minut na instalaci. Tedy dostali jsme databĂĄzi jako MySQL, ale pouze pro uklĂĄdĂĄnĂ miliard zĂĄznamĆŻ! NÄco jako superarchivĂĄtor s jazykem SQL. Je to, jako by lidem pĆedali zbraĆ mimozemĆĄĆ„anĆŻ.
O naĆĄem systĂ©mu sbÄru logĆŻ
Pro sbÄr informacĂ se pouĆŸĂvajĂ soubory logĆŻ IIS webovĂœch aplikacĂ ve standardnĂm formĂĄtu (v souÄasnosti takĂ© provĂĄdĂme analĂœzu logĆŻ aplikacĂ, ale hlavnĂm cĂlem v pilotnĂ fĂĄzi je sbÄr logĆŻ IIS).
Zcela se vzdĂĄt stacku ELK se nĂĄm z rĆŻznĂœch dĆŻvodĆŻ nepodaĆilo, pokraÄujeme v pouĆŸĂvĂĄnĂ komponent LogStash a Filebeat, kterĂ© se osvÄdÄily jako spolehlivĂ© a pĆedvĂdatelnĂ©.
CelkovĂĄ schĂ©ma logovĂĄnĂ je znĂĄzornÄna na obrĂĄzku nĂĆŸe:

Specifikou zĂĄpisu dat do databĂĄze ClickHouse je rĆŻznÄ ÄastĂĄ (jednou za sekundu) insertace zĂĄznamĆŻ ve velkĂœch dĂĄvkĂĄch. To je zĆejmÄ nejproblematiÄtÄjĆĄĂ ÄĂĄst, se kterou se setkĂĄte pĆi prvnĂm pouĆŸitĂ databĂĄze ClickHouse: schĂ©ma je trochu komplikovanĂ©.
Tady vĂœraznÄ pomohl plugin pro LogStash, kterĂœ pĆĂmo vklĂĄdĂĄ data do ClickHouse. Tento komponent je nasazen na stejnĂ©m serveru jako samotnĂĄ databĂĄze. To se obecnÄ nedoporuÄuje, ale z praktickĂ©ho hlediska, abychom nemuseli vytvĂĄĆet dalĆĄĂ servery, dokud je nasazen na stejnĂ©m serveru. Nebyly pozorovĂĄny ĆŸĂĄdnĂ© vĂœpadky ani konflikty zdrojĆŻ s databĂĄzĂ. Je takĂ© tĆeba poznamenat, ĆŸe plugin mĂĄ mechanismus retry v pĆĂpadÄ chyb. A v pĆĂpadÄ chyb plugin zapisuje na disk dĂĄvku dat, kterĂĄ nebyla vloĆŸena (formĂĄt souboru je pohodlnĂœ: po ĂșpravÄ lze snadno znovu vloĆŸit opravenou dĂĄvku pomocĂ clickhouse-client).
ĂplnĂœ seznam softwaru, kterĂœ se pouĆŸĂvĂĄ v schĂ©matu, je uveden v tabulce:
Seznam pouĆŸĂvanĂ©ho softwaru
NĂĄzev
Popis
Odkaz na distribuÄnĂ balĂÄek
NGINX
Reverse-proxy pro omezenĂ pĆĂstupu podle portĆŻ a organizaci autorizace
V souÄasnosti se v schĂ©matu nepouĆŸĂvĂĄ
FileBeat
PĆenĂĄĆĄenĂ souborovĂœch logĆŻ.
(distribuÄnĂ balĂÄek pro Windows 64bit).
LogStash
SbÄraÄ logĆŻ.
PouĆŸĂvĂĄ se pro sbÄr logĆŻ od FileBeat, a takĂ© pro sbÄr logĆŻ z fronty RabbitMQ (pro servery, kterĂ© se nachĂĄzejĂ v DMZ.)
Logstash-output-clickhouse
Plugin Logstash pro pĆenos logĆŻ do databĂĄze ClickHouse v dĂĄvkĂĄch
/usr/share/logstash/bin/logstash-plugin install logstash-output-clickhouse
/usr/share/logstash/bin/logstash-plugin install logstash-filter-prune
/usr/share/logstash/bin/logstash-plugin install logstash-filter-multiline
ClickHouse
ĂloĆŸiĆĄtÄ logĆŻ
PoznĂĄmka. Od srpna 2018 existujĂ v repozitĂĄĆi Yandexu "normĂĄlnĂ" sestavenĂ rpm pro RHEL, takĆŸe je moĆŸnĂ© je zkusit pouĆŸĂt. V dobÄ instalace jsme pouĆŸĂvali balĂÄky sestavenĂ© Altinity.
Grafana
Vizualizace logĆŻ. NastavenĂ dashboardĆŻ
Redhat & Centos (64 Bit) â poslednĂ verze
ClickHouse datasource for Grafana 4.6+
Plugin pro Grafanu se zdrojem dat ClickHouse
LogStash
Router logĆŻ od FileBeat do fronty RabbitMQ.
PoznĂĄmka. BohuĆŸel FileBeat nemĂĄ output pĆĂmo do RabbitMQ, proto je zapotĆebĂ meziÄlĂĄnek v podobÄ Logstash
RabbitMQ
Fronta zprĂĄv. To je buffer zĂĄpisĆŻ logĆŻ v DMZ
Erlang Runtime (PotĆebnĂ© pro RabbitMQ)
Erlang prostĆedĂ. Je poĆŸadovĂĄno pro fungovĂĄnĂ RabbitMQ
Konfigurace serveru s databĂĄzĂ ClickHouse je uvedena v nĂĄsledujĂcĂ tabulce:
NĂĄzev
Hodnota
PoznĂĄmka
Konfigurace
HDD: 40GB
RAM: 8GB
Procesor: Core 2 2Ghz
Je nutnĂ© vÄnovat pozornost radĂĄm pro provoz databĂĄze ClickHouse ()
SystĂ©movĂœ software
OS: Red Hat Enterprise Linux Server (Maipo)
JRE (Java 8)
Â
Jak je vidÄt, toto je bÄĆŸnĂĄ pracovnĂ stanice.
Struktura tabulky pro uklĂĄdĂĄnĂ logĆŻ vypadĂĄ nĂĄsledovnÄ:
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;PouĆŸĂvĂĄme vĂœchozĂ hodnoty pro partitioning (podle mÄsĂcĆŻ) a granularitu indexu. VĆĄechna pole jsou prakticky odpovĂdajĂcĂ zĂĄznamĆŻm logu IIS pro zaznamenĂĄvĂĄnĂ http-ĆŸĂĄdostĂ. ZvlĂĄĆĄĆ„ upozornĂme na jednotlivĂ© pole pro uklĂĄdĂĄnĂ utm-ĆĄtĂtkĆŻ (ty jsou parsovĂĄny v rĂĄmci fĂĄze vklĂĄdĂĄnĂ do tabulky z pole dotazu).
Do tabulky byly takĂ© pĆidĂĄny nÄkterĂ© systĂ©movĂ© pole pro uklĂĄdĂĄnĂ informacĂ o systĂ©mech, komponentĂĄch, serverech. Popis tÄchto polĂ najdete nĂĆŸe v tabulce. V jednĂ© tabulce uchovĂĄvĂĄme logy pro nÄkolik systĂ©mĆŻ.
NĂĄzev
Popis
PĆĂklad
fld_app_name
Nåzev aplikace/systému
Povolené hodnoty:
- site1.domain.com VnÄjĆĄĂ web 1
- site2.domain.com VnÄjĆĄĂ web 2
- internal-site1.domain.local InternĂ web 1
site1.domain.com
fld_app_module
Modul systému
Povolené hodnoty:
- web â WebovĂĄ strĂĄnka
- svc â WebovĂĄ sluĆŸba webu
- intgr â WebovĂĄ integraÄnĂ sluĆŸba
- bo â AdministraÄnĂ rozhranĂ (BackOffice)
web
fld_website_name
NĂĄzev webu v IIS
Na jednom serveru mĆŻĆŸe bĂœt nasazeno vĂce systĂ©mĆŻ, nebo dokonce vĂce instance jednoho modulu systĂ©mu
web-main
fld_server_name
NĂĄzev serveru
web1.domain.com
fld_log_file_name
Cesta k souboru logu na serveru
C:inetpublogsLogFiles
W3SVC1u_ex190711.log
To umoĆŸĆuje efektivnÄ vytvĂĄĆet grafy v Grafana. NapĆĂklad pro sledovĂĄnĂ dotazĆŻ z frontendu konkrĂ©tnĂho systĂ©mu. Je to podobnĂ© jako poÄĂtadlo nĂĄvĆĄtÄvnosti v Yandex.Metrice.
Zde jsou nÄkterĂ© statistiky o pouĆŸĂvĂĄnĂ databĂĄze za dva mÄsĂce.
PoÄet zĂĄznamĆŻ podle systĂ©mĆŻ a jejich komponentĆŻ
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.)Objem dat na disku
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.MĂra komprese dat ve sloupcĂch
VYBERTE
nĂĄzev,
formatReadableSize(data_uncompressed_bytes) JAKO nepotlaÄenĂ©,
formatReadableSize(data_compressed_bytes) JAKO stlaÄenĂ©,
data_uncompressed_bytes / data_compressed_bytes JAKO pomÄr_stlaÄenĂ
Z TABULKY system.columns
KDE tabulka = 'log_web'
âânĂĄzevââââââââââââââââââââŹânepotlaÄenĂ©ââŹâstlaÄenĂ©ââŹâââââpomÄr_stlaÄenĂââ
â 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 ĆĂĄdkĆŻ v setu. UplynulĂœ Äas: 0.005 sekundy.Popis pouĆŸitĂœch komponentĆŻ
FileBeat. PĆenos souborovĂœch logĆŻ
Tato komponenta sleduje zmÄny v souborovĂœch logech na disku a pĆenĂĄĆĄĂ informace do LogStash. Je nainstalovĂĄna na vĆĄech serverech, kde se zapisujĂ soubory s logy (obvykle IIS). Pracuje v reĆŸimu tail (tj. pĆenĂĄĆĄĂ pouze novĂ© zĂĄznamy do souboru). Lze ji ale nastavit takĂ© na pĆenos celĂœch souborĆŻ. To je uĆŸiteÄnĂ©, kdyĆŸ potĆebujete nahrĂĄt data za pĆedchozĂ mÄsĂce. StaÄĂ umĂstit soubor s logem do sloĆŸky a ona ho pĆeÄte celĂœ.
PĆi zastavenĂ sluĆŸby se data pĆestanou pĆenĂĄĆĄet do ĂșloĆŸiĆĄtÄ.
PĆĂklad konfigurace vypadĂĄ nĂĄsledujĂcĂm zpĆŻsobem:
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. SbÄraÄ logĆŻ
Tato komponenta je urÄena pro pĆĂjem zĂĄznamĆŻ logĆŻ od FileBeat (buÄ pĆes frontu RabbitMQ), parsovĂĄnĂ a hromadnĂ© vklĂĄdĂĄnĂ do databĂĄze ClickHouse.
Pro vklĂĄdĂĄnĂ do ClickHouse se pouĆŸĂvĂĄ plug-in Logstash-output-clickhouse. Plug-in Logstash mĂĄ mechanismus pro opakovĂĄnĂ poĆŸadavkĆŻ, ale pĆi bÄĆŸnĂ©m zastavenĂ je nejlepĆĄĂ zastavit i samotnou sluĆŸbu. PĆi zastavenĂ se budou hromadit zprĂĄvy ve fronÄ RabbitMQ, takĆŸe pokud se zastavenĂ protĂĄhne, je lepĆĄĂ zastavit Filebeat na serverech. V scĂ©nĂĄĆi, kde se RabbitMQ nepouĆŸĂvĂĄ (v lokĂĄlnĂ sĂti Filebeat pĆĂmo posĂlĂĄ logy do Logstash), fungujĂ Filebeat dostateÄnÄ a bezpeÄnÄ, takĆŸe nedostupnost vĂœstupu pro nÄ probĂhĂĄ bez nĂĄsledkĆŻ.
PĆĂklad konfigurace vypadĂĄ nĂĄsledujĂcĂm zpĆŻsobem:
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"
}
}
}pipelines.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. ĂloĆŸiĆĄtÄ protokolĆŻ
Logy ze vĆĄech systĂ©mĆŻ jsou uklĂĄdĂĄny do jednĂ© tabulky (viz zaÄĂĄtek ÄlĂĄnku). Je urÄena pro uchovĂĄvĂĄnĂ informacĂ o poĆŸadavcĂch: vĆĄechny parametry jsou podobnĂ© pro rĆŻznĂ© formĂĄty, napĆĂklad logy IIS, logy apache a nginx. Pro logy aplikacĂ, ve kterĂœch jsou zaznamenĂĄvĂĄny napĆĂklad chyby, informaÄnĂ zprĂĄvy a varovĂĄnĂ, bude k dispozici samostatnĂĄ tabulka s odpovĂdajĂcĂ strukturou (nynĂ ve fĂĄzi nĂĄvrhu).
PĆi nĂĄvrhu tabulky je velmi dĆŻleĆŸitĂ© urÄit primĂĄrnĂ klĂÄ (podle kterĂ©ho budou data tĆĂdÄna pĆi uklĂĄdĂĄnĂ). Od toho zĂĄvisĂ mĂra komprese dat a rychlost dotazĆŻ. V naĆĄem pĆĂkladu je klĂÄem
ORDER BY (fld_app_name, fld_app_module, logdatetime)
T. j. podle nĂĄzvu systĂ©mu, nĂĄzvu komponenty systĂ©mu a data udĂĄlosti. PĆŻvodnÄ byla data udĂĄlosti na prvnĂm mĂstÄ. Po pĆesunutĂ na poslednĂ mĂsto se dotazy zaÄaly provĂĄdÄt zhruba dvakrĂĄt rychleji. ZmÄna primĂĄrnĂho klĂÄe vyĆŸaduje pĆestavbu tabulky a opÄtovnĂ© nahrĂĄnĂ dat, aby ClickHouse pĆeĆadil data na disku. To je nĂĄroÄnĂĄ operace, takĆŸe je ĆŸĂĄdoucĂ dopĆedu dobĆe promyslet, co by mÄlo bĂœt zahrnuto do klĂÄe pro tĆĂdÄnĂ.
Je takĂ© tĆeba poznamenat, ĆŸe v poslednĂch verzĂch se objevil typ dat LowCardinality. Jeho pouĆŸitĂ vĂœraznÄ zmenĆĄuje velikost komprimovanĂœch dat pro ta pole, kterĂĄ majĂ nĂzkou kardinalitu (mĂĄlo variant).
AktuĂĄlnÄ pouĆŸĂvĂĄme verzi 19.6 a plĂĄnujeme vyzkouĆĄet aktualizaci na nejnovÄjĆĄĂ verzi. Ty obsahujĂ vynikajĂcĂ funkce, jako jsou Adaptive Granularity, Skipping indices a kodek DoubleDelta.
PĆi instalaci je v konfiguraci vĂœchozĂ ĂșroveĆ protokolovĂĄnĂ nastavena na trace. Logy jsou rotovĂĄny a archivovĂĄny, ale zĂĄroveĆ se rozĆĄiĆujĂ na gigabyte. Pokud nenĂ potĆeba, lze nastavit ĂșroveĆ warning, ÄĂmĆŸ se velikost logu vĂœraznÄ snĂĆŸĂ. NastavenĂ protokolovĂĄnĂ se urÄuje v souboru config.xml:
warnNÄkterĂ© uĆŸiteÄnĂ© pĆĂkazy
ProtoĆŸe se pĆŻvodnĂ instalaÄnĂ balĂÄky sestavujĂ pro Debian, je nutnĂ© pro jinĂ© verze Linuxu pouĆŸĂvat balĂÄky sestavenĂ© spoleÄnostĂ Altinity.
Zde je odkaz s instrukcemi a odkazy na jejich repozitĂĄĆ: https://www.altinity.com/blog/2017/12/18/logstash-with-clickhouse
sudo yum search clickhouse-server
sudo yum install clickhouse-server.noarch
1. kontrola stavu
sudo systemctl status clickhouse-server
2. zastavenĂ serveru
sudo systemctl stop clickhouse-server
3. spuĆĄtÄnĂ serveru
sudo systemctl start clickhouse-server
SpuĆĄtÄnĂ pro provĂĄdÄnĂ dotazĆŻ v multiline reĆŸimu (provĂĄdÄjte po znaku ";")
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
Plugin ClickHouse pro LogStash v pĆĂpadÄ chyby v jednom ĆĂĄdku uloĆŸĂ celĂœ balĂk do souboru /tmp/log_web_failed.json
Tento soubor mĆŻĆŸete ruÄnÄ opravit a zkusit nahrĂĄt do DB ruÄnÄ:
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
vĂœstup z pĆĂkazovĂ©ho ĆĂĄdku
quit;
## NastavenĂ TLS
https://www.altinity.com/blog/2019/3/5/clickhouse-networking-part-2
openssl s_client -connect log.domain.com:9440 < /dev/nullLogStash. Router logĆŻ od FileBeat do fronty RabbitMQ
Tento komponent se pouĆŸĂvĂĄ pro smÄrovĂĄnĂ logĆŻ pochĂĄzejĂcĂch od FileBeat do fronty RabbitMQ. Zde jsou dva aspekty:
- BohuĆŸel, FileBeat nemĂĄ output plugin pro pĆĂmĂ© zĂĄpisy do RabbitMQ. A podle problĂ©mĆŻ na jejich GitHubu, se tento funkÄnĂ prvek neplĂĄnuje zavĂ©st. Existuje plugin pro Kafka, ale z urÄitĂœch dĆŻvodĆŻ jej nemĆŻĆŸeme u nĂĄs pouĆŸĂt.
- ExistujĂ poĆŸadavky na shromaĆŸÄovĂĄnĂ logĆŻ v DMZ. Na zĂĄkladÄ nich musĂ bĂœt logy nejprve uloĆŸeny do fronty a potĂ© je LogStash Äte externÄ z fronty.
Proto je pro pĆĂpad umĂstÄnĂ serverĆŻ v DMZ nutnĂ© pouĆŸĂt takto mĂrnÄ komplikovanou schĂ©matiku. PĆĂklad konfigurace vypadĂĄ nĂĄsledovnÄ:
iis_w3c_logs__filebeat_rabbitmq.conf
vstup {
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"
}
}
vĂœstup {
#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. Fronta zprĂĄv
Tento komponent je pouĆŸĂvĂĄn pro vyrovnĂĄvĂĄnĂ logĆŻ v DMZ. ZĂĄznamy se provĂĄdÄjĂ prostĆednictvĂm spojenĂ Filebeat â LogStash. ÄtenĂ se provĂĄdĂ z venku DMZ pĆes LogStash. PĆi pouĆŸitĂ pĆes RabbitMQ se zpracovĂĄvĂĄ pĆibliĆŸnÄ 4 tisĂce zprĂĄv za sekundu.
SmÄrovĂĄnĂ zprĂĄv je nastaveno podle nĂĄzvu systĂ©mu, t.j. na zĂĄkladÄ dat z konfigurace FileBeat. VĆĄechny zprĂĄvy smÄĆujĂ do jednĂ© fronty. Pokud je z nÄjakĂ©ho dĆŻvodu sluĆŸba front zastavena, nedojde k ĆŸĂĄdnĂ© ztrĂĄtÄ zprĂĄv: FileBeat obdrĆŸĂ chyby pĆipojenĂ a doÄasnÄ pozastavĂ odesĂlĂĄnĂ. A LogStash, kterĂœ Äte z fronty, takĂ© obdrĆŸĂ sĂĆ„ovĂ© chyby a poÄkĂĄ, aĆŸ se pĆipojenĂ obnovĂ. Data samozĆejmÄ pĆestanou bĂœt zapisovĂĄna do DB.
NĂĄsledujĂcĂ pokyny slouĆŸĂ k vytvoĆenĂ a nastavenĂ front:
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. Dashboardy
Tento komponent se pouĆŸĂvĂĄ pro vizualizaci monitorovacĂch dat. Je tĆeba nainstalovat plugin ClickHouse datasource for Grafana 4.6+. Museli jsme ho trochu upravit, aby se zvĂœĆĄila ĂșÄinnost zpracovĂĄnĂ SQL filtrĆŻ na dashboardu.
NapĆĂklad pouĆŸĂvĂĄme promÄnnĂ©, a pokud nejsou zadĂĄny v poli filtru, chtÄli bychom, aby nevytvĂĄĆel podmĂnku v WHERE ve tvaru ( uriStem = » AND uriStem != » ). V takovĂ©m pĆĂpadÄ ClickHouse bude ÄĂst sloupec uriStem. CelkovÄ jsme zkouĆĄeli rĆŻznĂ© varianty a nakonec jsme plugin (makro $valueIfEmpty) upravili tak, aby v pĆĂpadÄ prĂĄzdnĂ© hodnoty vrĂĄtil 1, bez zmiĆovĂĄnĂ samotnĂ©ho sloupce.
A teÄ lze pouĆŸĂt takovĂœ dotaz pro graf.
$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')kterĂœ se pĆetvĂĄĆĂ na tento SQL (vĆĄimnÄte si, ĆŸe prĂĄzdnĂĄ pole uriStem byla pĆevedena na 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 ASCZĂĄvÄr
Vznik databĂĄze ClickHouse byl vĂœznamnou udĂĄlostĂ na trhu. Bylo tÄĆŸkĂ© si pĆedstavit, ĆŸe bychom bÄhem okamĆŸiku bezplatnÄ zĂskali mocnĂœ a praktickĂœ nĂĄstroj na prĂĄci s velkĂœmi daty. SamozĆejmÄ se schĂ©ma pĆi zvyĆĄovĂĄnĂ potĆeb (napĆ. shardovĂĄnĂ a replikace na nÄkolik serverĆŻ) komplikuje. Ale z prvnĂch dojmĆŻ, prĂĄce s touto databĂĄzĂ je velmi pĆĂjemnĂĄ. Je vidÄt, ĆŸe produkt byl vyroben âpro lidiâ.
Ve srovnĂĄnĂ s ElasticSearch se nĂĄklady na uklĂĄdĂĄnĂ a zpracovĂĄnĂ logĆŻ podle prvnĂch odhadĆŻ sniĆŸujĂ od pÄti do deseti nĂĄsobku. JinĂœmi slovy, zatĂmco pro aktuĂĄlnĂ objem dat bychom museli nastavovat klastr nÄkolika strojĆŻ, s pouĆŸitĂm ClickHouse nĂĄm staÄĂ jedna slabĆĄĂ maĆĄina. Ano, samozĆejmÄ, i v ElasticSearch existujĂ mechanismy pro kompresi dat na disku a dalĆĄĂ funkce, kterĂ© umoĆŸĆujĂ vĂœraznÄ snĂĆŸit spotĆebu zdrojĆŻ, ale ve srovnĂĄnĂ s ClickHouse to vyĆŸaduje vÄtĆĄĂ nĂĄklady.
Bez jakĂœchkoliv speciĂĄlnĂch optimalizacĂ z naĆĄĂ strany, s vĂœchozĂmi nastavenĂmi, je naÄĂtĂĄnĂ dat a vĂœbÄry z databĂĄze velmi rychlĂ©. ZatĂm mĂĄme mĂĄlo dat (asi 200 milionĆŻ zĂĄznamĆŻ), ale server je slabĂœ. Tento nĂĄstroj mĆŻĆŸeme v budoucnu vyuĆŸĂvat i k dalĆĄĂm ĂșÄelĆŻm, kterĂ© nesouvisejĂ s uklĂĄdĂĄnĂm logĆŻ. NapĆĂklad pro komplexnĂ analĂœzu, v oblasti bezpeÄnosti, strojovĂ©m uÄenĂ.
Na zĂĄvÄr nÄco o vĂœhodĂĄch a nevĂœhodĂĄch.
NevĂœhody
- NaÄĂtĂĄnĂ zĂĄznamĆŻ ve velkĂœch dĂĄvkĂĄch. Z jednĂ© strany je to funkce, ale pĆesto je tĆeba pouĆŸĂvat dalĆĄĂ komponenty pro vyrovnĂĄvĂĄnĂ zĂĄznamĆŻ. Tato Ășloha nenĂ vĆŸdy jednoduchĂĄ, ale dĂĄ se vyĆeĆĄit. A rĂĄdi bychom zjednoduĆĄili schĂ©ma.
- NÄkterĂ© exotickĂ© funkce nebo novĂ© vlastnosti se Äasto v novĂœch verzĂch rozbĂjejĂ. To vyvolĂĄvĂĄ obavy a sniĆŸuje chuĆ„ pĆejĂt na novou verzi. NapĆĂklad motor tabulek Kafka â velmi uĆŸiteÄnĂĄ funkce, kterĂĄ umoĆŸĆuje pĆĂmo ÄĂst udĂĄlosti z Kafky, bez implementace consumerĆŻ. Ale podle poÄtu problĂ©mĆŻ na GitHubu se zatĂm obĂĄvĂĄme pouĆŸĂvat tento motor v produkÄnĂm prostĆedĂ. NicmĂ©nÄ, pokud se nebudeme hĂœbat pĆĂliĆĄ daleko a vyuĆŸijeme zĂĄkladnĂ funkce, funguje stabilnÄ.
VĂœhody
- Nespomaluje.
- NĂzkĂœ vstupnĂ prĂĄh.
- Open-source.
- Zdarma.
- DobĆe se ĆĄkĂĄluje (sharding/replikace «z krabice»)
- Je zahrnuta v registru ruskĂ©ho softwaru doporuÄenĂ©ho Ministerstvem komunikacĂ.
- OficiĂĄlnĂ podpora od Yandexu.
Zdroj: habr.com
