Aleksejs Lizunovs, MKB InformÄcijas tehnoloÄ£iju direkcijas AttÄlinÄto pakalpojumu kanÄlu kompetences centra vadÄ«tÄjs
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.
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:
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
FileBeat
Failu žurnÄlu pÄrsÅ«tÄ«Å”ana.
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.)
Logstash-output-clickhouse
Loagstash spraudnis žurnÄlu pÄrsÅ«tÄ«Å”anai uz ClickHouse datu bÄzi partijÄs
/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
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
Redhat & Centos (64 bitu) - jaunÄkÄ versija
ClickHouse datu avots Grafana 4.6+
Grafana spraudnis ar ClickHouse datu avotu
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Ä.
RabbitMQ
ziÅojumu rinda. Å is ir žurnÄla buferis DMZ
Erlang izpildlaiks (nepiecieŔams RabbitMQ)
Erlang izpildlaiks. NepiecieŔams, lai RabbitMQ darbotos
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 (
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:
- 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.
- 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
- 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.
- 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
- NebremzÄ.
- Zems ieejas slieksnis.
- AtvÄrtais avots.
- Bezmaksas.
- Labi mÄrogojas (sadalÄ«Å”ana/replicÄÅ”ana no iepakojuma)
- Iekļauts Sakaru ministrijas ieteiktajÄ Krievijas programmatÅ«ras reÄ£istrÄ.
- OficiÄlÄ atbalsta klÄtbÅ«tne no Yandex.
Avots: www.habr.com