ClickHouse Databåze pro lidi, nebo technologie mimozemƥƄanƯ

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

ClickHouse Databåze pro lidi, nebo technologie mimozemƥƄanƯ

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Ă©.


ClickHouse Databåze pro lidi, nebo technologie mimozemƥƄanƯ

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:

ClickHouse Databåze pro lidi, nebo technologie mimozemƥƄanƯ

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

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

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

FileBeat

PƙenĂĄĆĄenĂ­ souborovĂœch logĆŻ.

https://www.elastic.co/downloads/beats/filebeat (distribuční balíček pro Windows 64bit).

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

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

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

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

Logstash-output-clickhouse

Plugin Logstash pro pƙenos logƯ do databáze ClickHouse v dávkách

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

/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ĆŻ 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

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

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos (64 Bit) – poslední verze

ClickHouse datasource for Grafana 4.6+

Plugin pro Grafanu se zdrojem dat ClickHouse

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

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

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

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

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

RabbitMQ

Fronta zprĂĄv. To je buffer zĂĄpisĆŻ logĆŻ v 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 Runtime (PotƙebnĂ© pro RabbitMQ)

Erlang prostƙedĂ­. Je poĆŸadovĂĄno pro fungovĂĄnĂ­ RabbitMQ

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

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

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 (https://clickhouse.yandex/docs/ru/operations/tips/)

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:


warn

Ně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/null

LogStash. 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:

  1. 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.
  2. 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 ASC

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

  1. 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.
  2. 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

  1. Nespomaluje.
  2. NĂ­zkĂœ vstupnĂ­ prĂĄh.
  3. Open-source.
  4. Zdarma.
  5. Dobƙe se ĆĄkĂĄluje (sharding/replikace «z krabice»)
  6. Je zahrnuta v registru ruskĂ©ho softwaru doporučenĂ©ho Ministerstvem komunikacĂ­.
  7. OficiĂĄlnĂ­ podpora od Yandexu.

Zdroj: habr.com

Koupit spolehlivĂœ hosting pro webovĂ© strĂĄnky s ochranou proti DDoS, VPS VDS servery đŸ”„ Koupit spolehlivĂœ hosting pro webovĂ© strĂĄnky s ochranou proti DDoS, VPS VDS servery | ProHoster