ClickHouse andmed inimestele, vÔi vÀlismaalaste tehnoloogiad

Aleksei Lizunov, kompetentsikeskuse juhataja MKB infosĂŒsteemide suunanud kaugteenuste osakonnas

ClickHouse andmed inimestele, vÔi vÀlismaalaste tehnoloogiad

ELK (ElasticSearch, Logstash, Kibana) tehnoloogia kÔrval uurime ClickHouse andmebaasi kasutamist logide salvestamiseks.

Selles artiklis soovime jagada oma kogemusi ClickHouse andmebaasi kasutamisest ja esialgsetest tulemustest pilootprojekti lÔppedes. Oluline on mÀrkida, et tulemused on olnud muljetavaldavad.


ClickHouse andmed inimestele, vÔi vÀlismaalaste tehnoloogiad

Allpool kirjeldame lĂ€hemalt, kuidas meie sĂŒsteem on seadistatud ja millistest komponentidest see koosneb. Kuid praegu sooviksime rÀÀkida natuke sellest andmebaasist tervikuna ja miks sellele tĂ€helepanu pöörata. ClickHouse andmebaas on Yandexi kĂ”rge jĂ”udlusega analĂŒĂŒtiline veergude andmebaas. Seda kasutatakse Yandexi teenustes, alustades sellest, et see on peamine andmete salvestuskoht Yandex.Metrica jaoks. SĂŒsteem on avatud lĂ€htekoodiga ja tasuta. Arendajana on mind alati huvitanud, kuidas nad seda rakendavad, kuna seal on fantastiliselt suured andmed. Ja Yandex.Metrica kasutajaliides on vĂ€ga paindlik ja töötab kiiresti. Esimese kokkupuute ajal selle andmebaasiga jÀÀb mulje: „Noh, lĂ”puks! See on tehtud „inimeste jaoks”! Alustades installimisprotsessist ja lĂ”petades pĂ€ringute saatmisega.”

Selle andmebaasi sisenemiskĂŒnnis on vĂ€ga madal. Isegi keskmise oskustasemega arendaja vĂ”ib selle andmebaasi mĂ”ne minutiga paigaldada ja alustada kasutamist. KĂ”ik töötab sujuvalt. Ieven inimesed, kes ei tunne Linuxit kuigi hĂ€sti, saavad paigaldamisega kiiresti hakkama ja teevad lihtsamaid toiminguid. Kui varem, sĂ”na Big Data, Hadoop, Google BigTable, HDFS, tekitas tavalistes arendajates ettekujutusi, et seal rÀÀgitakse teraaipkaartest, petabaitidest ning sarnaste sĂŒsteemide seadistamisest ja arendamisest tegelevad mingid superinimesed, siis andmebaasi ClickHouse tulekuga saime me lihtsa ja arusaadava tööriista, millega lahendada varem kĂ€ttesaamatuks jÀÀneid ĂŒlesandeid. Piisab vaid keskmise tasemega arvutist ja viis minutist paigaldamiseks. See tĂ€hendab, et saime andmebaasi nagu MySQL, kuid miljardite kirje salvestamiseks! Üks superarhivator SQL-i keele abil. See on nagu inimesed oleks saanud varustuse tulnukate poolt.

Meie logide kogumise sĂŒsteemist

Teabe kogumiseks kasutatakse IIS veebirakenduste standardformaadi logifailide kogumist (hetkel tegeleme ka rakenduste logide parsinud, kuid meie peamine eesmÀrk piloodikasutuse etapis on IIS logide kogumine).

Kogu ELK virnaga loobuda ei Ônnestunud mitmete pÔhjuste tÔttu ning jÀtkame usaldusvÀÀrsete ja prognoositavate LogStashi ja Filebeati komponentide kasutamist.

Kogumise ĂŒldskeem on esitatud alloleval joonisel:

ClickHouse andmed inimestele, vÔi vÀlismaalaste tehnoloogiad

Andmete salvestamise eripĂ€ra ClickHouse andmebaasis on mitte sageli (ĂŒhe korra sekundis) suurte partii-de salvestamine. See tundub olevat kĂ”ige „problemaatilisem“ osa, millega esmakordsel ClickHouse'iga töötamisel silmitsi seista: skeem muutub veidi keerulisemaks.
Siin aitas tugevalt LogStashi plugin, mis sisestab andmeid otse ClickHouse'i. See komponent kĂ€ivitatakse samal serveril, kus on ka andmebaas. Üldiselt ei soovitata seda teha, kuid praktiliselt, et mitte luua eraldi servereid, seni kuni see on paigaldatud samale serverile. Me ei ole tĂ€heldanud ei tĂ”rkeid ega ressursikonflikte andmebaasiga. Lisaks peab mĂ€rkima, et plugin on varustatud retry mehhanismiga vigade korral. Vigade korral kirjutab plugin kettale andmepaki, mida ei Ă”nnestunud sisestada (failiformaat on mugav: pĂ€rast parandamist saab parandatud paki hĂ”lpsasti sisestada clickhouse-client abil).

Terve tarkvara nimekiri, mida skeemis kasutatakse, on esitatud tabelis:

Kasutatava tarkvara loend

Nimi

Kirjeldus

Link distributsioonile

NGINX

Reverse-proxy juurdepÀÀsu piiramiseks portide kaudu ja autoriseerimise korraldamiseks

Praegu skeemis ei kasutata

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

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

FileBeat

Faililogide edastamine.

https://www.elastic.co/downloads/beats/filebeat (64bit Windows'ile mÔeldud distributsioon).

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

LogStash

Logide kogumine.

Kasutatakse FileBeat'i logide kogumiseks, samuti RabbitMQ jÀrjekorrast logide kogumiseks (DMZ'is asuvate serverite jaoks).

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

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

Logstash-output-clickhouse

Loagstash plugin logide edastamiseks ClickHouse'i andmebaasi partii kaupa

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

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

MĂ€rkus. Alates augustist 2018 on Yandeksi all oleva hoidla jaoks saadaval „tavapĂ€rased” rpm-paketid RHELi jaoks, seega on vĂ”imalik neid proovida. Paigaldamise hetkel kasutasime Altinity poolt loodud pakette.

Grafana

Logide visualiseerimine. Juhtpaneelide seadistamine

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos (64 Bit) – viimane versioon

ClickHouse andmeallikas Grafana 4.6+ jaoks

Grafana plugin ClickHouse andmeallikaga

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

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

LogStash

FileBeati logide marsruuter RabbitMQ jÀrjekorda.

MÀrkus. Kahjuks ei ole FileBeat'il otse vÀljundit RabbitMQ-sse, seega on vajalik vahepealne komponent nagu Logstash

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

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

RabbitMQ

SÔnumijÀrjekord. See on logide kirje vahemÀlu DMZ-is

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

Erlangi kÀitusaeg (vajalik RabbitMQ jaoks)

Erlangi kÀituskeskkond. NÔutav RabbitMQ tööks

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

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

ClickHouse'i andmebaasi serveri konfiguratsioon on esitatud jÀrgmises tabelis:

Nimi

VÀÀrtus

MĂ€rkus

Konfiguratsioon

HDD: 40GB
RAM: 8GB
Protsessor: Core 2 2Ghz

Oluline on arvestada ClickHouse'i andmebaasi haldamise soovitustega (https://clickhouse.yandex/docs/ru/operations/tips/)

Üldine tarkvara

OS: Red Hat Enterprise Linux Server (Maipo)

JRE (Java 8)

 

Kuidas nÀha, on see tavaline tööjaam.

Logide hoidmise tabeli struktuur on jÀrgmine:

log_web.sql

LOO RAKENDUS log_web (
  logdate KuupÀev,
  logdatetime KuupÀevAeg CODEC(Delta, LZ4HC),
   
  fld_log_file_name AstdKardinaalsus( String ),
  fld_server_name AstdKardinaalsus( String ),
  fld_app_name AstdKardinaalsus( String ),
  fld_app_module AstdKardinaalsus( String ),
  fld_website_name AstdKardinaalsus( String ),
 
  serverIP AstdKardinaalsus( String ),
  method AstdKardinaalsus( String ),
  uriStem String,
  uriQuery String,
  port UInt32,
  username AstdKardinaalsus( 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
 
) Mootor = MergeTree()
PARTITION BY toYYYYMM(logdate)
ORDER BY (fld_app_name, fld_app_module, logdatetime)
SEADED indeks_granulaarsus = 8192;

Kasutame vaikimisi parameetreid partitsioneerimiseks (kuude kaupa) ja indeksi granulaarsuseks. KÔik vÀljad vastavad peaaegu IIS logikirjadele http-pÀringute registreerimiseks. Eraldi toome vÀlja vÀljad utm-mÀrkmete salvestamiseks (need parsitakse tabelisse sisestamise etapis pÀringu vÀljalt).

Samuti on tabelis lisatud mitu sĂŒsteemi vĂ€lja, et salvestada teavet sĂŒsteemide, komponentide, serverite kohta. Nende vĂ€ljade kirjelduse leiate allolevast tabelist. Ühes tabelis salvestame logisid mitmete sĂŒsteemide kohta.

Nimi

Kirjeldus

NĂ€ide

fld_app_name

Rakenduse/sĂŒsteemi nimi
Lubatud vÀÀrtused:

  • site1.domain.com VĂ€line sait 1
  • site2.domain.com VĂ€line sait 2
  • internal-site1.domain.local Sise sait 1

site1.domain.com

fld_app_module

SĂŒsteemimoodul
Lubatud vÀÀrtused:

  • web — Veebisait
  • svc — Veebiteenus
  • intgr — Integreerimise veebiteenus
  • bo — Admin paneel (BackOffice)

web

fld_website_name

Saidinimi IIS-is

Ühel serveril vĂ”ib olla mitu sĂŒsteemi vĂ”i isegi mitu eksemplari samast sĂŒsteemimoodulist

web-main

fld_server_name

Serveri nimi

web1.domain.com

fld_log_file_name

Logifaili tee serveris

C:inetpublogsLogFiles
W3SVC1u_ex190711.log

See vĂ”imaldab tĂ”husalt koostada graafikuid Grafanas. NĂ€iteks vaadata esifrontilt konkreetse sĂŒsteemi pĂ€ringuid. See on sarnane saidilogi Yandex.Metrikas.

Siin on mÔningane andmebaasi kasutamise statistika kahe kuu jooksul.

Kirjete arv sĂŒsteemide ja nende komponentide kaupa

VALI
    fld_app_name,
    fld_app_module,
    count(fld_app_name) AS rows_count
FROM log_web
RÜHMITSE:
    fld_app_name,
    fld_app_module
    KOKKU
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 │
└──────────────────┮────────────────┮────────────┘
 
Kokku:
┌─fld_app_name─┬─fld_app_module─┬─rows_count─┐
│              │                │  210522593 │
└──────────────┮────────────────┮────────────┘
 
11 rida komplekti. Kulunud: 4.874 sek. Töödeldud 210,52 miljonit rida, 421,67 MB (43,19 miljonit rida/s., 86,51 MB/s.)

Andmete maht kettal

VALI
    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 rida tulemuses. Aeg: 0,035 sec.

Kihi andmete tihendamine veergudes

VALI
    nimi,
    formatReadableSize(data_uncompressed_bytes) AS dekompressitud,
    formatReadableSize(data_compressed_bytes) AS kompressitud,
    data_uncompressed_bytes / data_compressed_bytes AS kompressiooni_suhe
FROM system.columns
WHERE table = 'log_web'
 
┌─nimi─────────────────────┬─dekompressitud─┬─kompressitud─┬─────kompressiooni_suhe─┐
│ 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 rida komplektis. Aeg: 0.005 sek.

Kasutatud komponentide kirjeldus

FileBeat. Faililogide edastamine

See komponent jĂ€lgib logifailides toimuvaid muudatusi ja edastab teabe LogStashi. Paigaldatakse kĂ”ikidele serveritele, kus kirjutatakse logifaile (tavaliselt IIS-i puhul). Töötab 'tail' reĆŸiimis (st edastab ainult failile lisatud kirjed). Kuid eraldi saab seadistada ka failide tĂ€ielikku edastamist. See on mugav, kui on vaja ĂŒles laadida varasemaid kuude andmeid. Lihtsalt pane logifail kausta ja see loeb selle automaatselt lĂ€bi.

Teenuse peatamise korral lakkab andmete edastamine edaspidiseks salvestamiseks.

Konfiguratsiooni nÀidis nÀeb vÀlja jÀrgmiselt:

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.ee"
    fld_app_name: "site1.domain.ee"
    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.ee"
    fld_app_name: "site2.domain.ee"
    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.ee.cer"
  ssl.key: "C:/filebeat/certs/site1.domain.ee.key"

#================================ Processors =====================================

processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

LogStash. Logide kogumise tööriist

See komponent on ette nÀhtud logikirjete vastuvÔtmiseks FileBeat'ilt (kas otse vÔi lÀbi RabbitMQ jÀrjekorra), parsimiseks ja jooksva partii sisestamiseks ClickHouse andmebaasi.

ClickHouse'i jaoks kasutatakse Logstash-output-clickhouse pluginat. Logstash'i pluginal on pÀringute uuesti proovimise mehhanism, kuid korraliku peatamise korral on parem ikka teenus ise peatada. Peatamise ajal kogunevad sÔnumid RabbitMQ jÀrjekorda, seega kui peatamine kestab pikka aega, on parem peatada serverites ka Filebeat'id. Skeemis, kus RabbitMQ't ei kasutata (Filebeat saadab logid otse Logstash'i kohaliku vÔrgu kaudu), töötavad Filebeat'id tÀiesti vastuvÔetavalt ja ohutult, seega nende jaoks ei too output'i kÀttesaamatus kaasa tagajÀrgi.

Konfiguratsiooni nÀidis nÀeb vÀlja jÀrgmiselt:

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. Logide hoidmine

KĂ”ik sĂŒsteemide logid salvestatakse ĂŒhte tabelisse (vt artikli algust). See on mĂ”eldud pĂ€ringute andmete hoidmiseks: kĂ”ik parameetrid on erinevate formaatide, nĂ€iteks IIS, Apache ja Nginx logide jaoks sarnased. Rakenduste logide jaoks, kuhu registreeritakse nĂ€iteks vead, informatiivsed sĂ”numid, hoiatusteateid, on ette nĂ€htud eraldi tabel, millel on vastav struktuur (hetkel projekteerimise etapis).

Tabeli projekteerimisel on vÀga oluline mÀÀrata esmase vÔtmena (mille jÀrgi andmed salvestamisel sorteeritakse). Sellega sÔltub andmete kokkusurumise tase ja pÀringute kiirus. Meie nÀites on vÔtmena
ORDER BY (fld_app_name, fld_app_module, logdatetime)
See, vastab sĂŒsteemi nime, sĂŒsteemi komponendi nime ja sĂŒndmuse kuupĂ€eva. Alguses oli sĂŒndmuse kuupĂ€ev esimesel kohal. PĂ€rast selle viimasele kohale nihutamist hakkasid pĂ€ringud umbes kaks korda kiiremini töötama. AlusvĂ”tme muutmine nĂ”uab tabeli uuesti loomist ja andmete ĂŒleslaadimist, et ClickHouse saaks andmed kettale ĂŒmber jĂ€rjestada. See on keeruline protsess, seega on soovitatav hĂ€sti ette mĂ”elda, mis peaks jĂ€rjestamisvĂ”tmesse kuuluma.

Samuti on oluline mĂ€rkida, et viimastes versioonides on ilmnenud andmetĂŒĂŒp LowCardinality. Selle kasutamine vĂ€hendab mĂ€rgatavalt tihendatud andmete suurust madala kardinatsiooni (vĂ€he valikuid) korral.

Praegu on kasutuses versioon 19.6 ja plaanime proovida uuendada versiooni kÔige uuemale. Nendes on selliseid suurepÀraseid funktsioone nagu Adaptive Granularity, Skipping indices ja kodek DoubleDelta, nÀiteks.

Vaikimisi on installimise kÀigus logimise tasemeks trace. Logid pööratakse ja arhiveeritakse, kuid need ulatuvad gigabaidini. Kui pole vajadust, vÔib seada taseme warning, mis vÀhendab logi suurust oluliselt. Logimise seadistamine mÀÀratakse failis config.xml:


warning

MÔned kasulikud kÀsud

Kuna originaalsed paigalduspaketid on kokku pandud Debian'i poolt, tuleb teiste Linuxi versioonide jaoks kasutada Altinity ettevÔtte koostatud pakette.

Siit leiate juhised koos linkidega nende hoidlatele: https://www.altinity.com/blog/2017/12/18/logstash-with-clickhouse
sudo yum search clickhouse-server
sudo yum install clickhouse-server.noarch

1. staatuse kontroll
sudo systemctl status clickhouse-server

2. serveri peatamine
sudo systemctl stop clickhouse-server

3. serveri kÀivitamine
sudo systemctl start clickhouse-server

KĂ€ivitamine mitmereĆŸiimilises reĆŸiimis (tĂ€itmine pĂ€rast tĂ€hte ";")
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

Logstashi klikkause plugin salvestab ĂŒhe reas esineva vea korral kogu partii faili /tmp/log_web_failed.json
Seda faili saab kÀsitsi parandada ja proovida seda andmebaasi kÀsitsi laadida:
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

command line'ist vÀljumine
quit;
## TLS seadistamine
https://www.altinity.com/blog/2019/3/5/clickhouse-networking-part-2

openssl s_client -connect log.domain.com:9440 < /dev/null

LogStash. Logide rÀndsuunaja FileBeat'ilt RabbitMQ jÀrjekorda

See komponent on mÔeldud logide suunamiseks FileBeat'ilt RabbitMQ jÀrjekorda. Siin on kaks aspekti:

  1. Kahjuks ei ole FileBeat'il olemas output pluginat otseseks kirjutamiseks RabbitMQ'sse. Ja nÀib, et seda funktsionaalsust, vastavalt nende GitHubi probleemile, ei plaanita rakendada. On olemas plugin Kafka jaoks, kuid teatud pÔhjustel ei saa me seda kasutada.
  2. On nÔuded logide kogumiseks DMZ-s. Nende pÔhjal peavad logid esmalt kogunema jÀrjekorda ja seejÀrel LogStash read jÀrjekorrast vÀljastpoolt.

SeetÔttu tuleb DMZ-s paiknevate serverite puhul kasutada sellist veidi keerukamat skeemi. NÀide konfiguratsioonist on jÀrgmine:

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. SÔnumite jÀrjekord

See komponent kasutatakse logi kirjeid DMZ-sse vahemĂ€lu salvestamiseks. Salvestamine toimub vaheĂŒhendusega Filebeat → LogStash. Lugemine toimub vĂ€ljastpoolt DMZ-d LogStashi kaudu. RabboitMQ kaudu kasutamisel töödeldakse umbes 4000 sĂ”numit sekundis.

SĂ”numite suunamine on seadistatud sĂŒsteemi nime pĂ”hjal, st FileBeati konfiguratsiooniandmete alusel. KĂ”ik sĂ”numid jĂ”uavad ĂŒhte jĂ€rjekorda. Kui mingil pĂ”hjusel jĂ€rjekonna teenus peatatakse, ei tĂ€henda see sĂ”numite kaotust: FileBeat'ide ĂŒhendusvead viivad vĂ”rguĂŒhenduse ajutise peatamiseni. LogStash, mis loeb jĂ€rjekonnast, saab samuti vĂ”rguveateateid ja ootab, kuni ĂŒhendus taastub. Sel ajal ei toimu andmete kirjutamist andmebaasi.

JÀrgnevaid juhiseid kasutatakse jÀrjekondade loomiseks ja seadistamiseks:

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

See komponent kasutatakse jÀlgimisandmete visualiseerimiseks. Selleks on vajalik installeerida ClickHouse andmeallika plug-in Grafana 4.6+ jaoks. Me pidime seda veidi kohandama, et parandada SQL-filterite töötlemise efektiivsust juhtpaneelil.

NĂ€iteks kasutame muutujaid ning kui need ei ole filtreerimisvĂ€ljas mÀÀratud, tahaksime, et see ei genereeriks WHERE tingimusi nagu ( uriStem = » AND uriStem != » ). Sellisel juhul loeb ClickHouse veergu uriStem. Üldiselt oleme proovinud erinevaid variante ja lĂ”puks olime sunnitud plugina (makro $valueIfEmpty) parandama, et tĂŒhi vÀÀrtus tagastaks 1, ilma et veergu ise mainitaks.

Ja nĂŒĂŒd saab kasutada sellist pĂ€ringut diagrammi jaoks

$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')

mis muudetakse selliseks SQL-iks (pane tĂ€hele, et tĂŒhjad uriStem vĂ€ljad muudetakse lihtsalt 1-ks)

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

KokkuvÔte

ClickHouse'i ilmumine oli turul mĂ€rgiline sĂŒndmus. Raske oli ette kujutada, et tĂ€iesti tasuta saame hetkega kĂ€epideme tugevale ja praktilisele tööriistale suurteandmete töötlemiseks. Muidugi, nĂ”udmiste suurenedes (nĂ€iteks shardimine ja replikatsioon mitmele serverile) muutub skeem keerulisemaks. Kuid esialgsete muljete jĂ€rgi on selle andmebaasiga vĂ€ga meeldiv töötada. On selgelt nĂ€ha, et toode on loodud 'inimeste jaoks'.

VĂ”rreldes ElasticSearchiga, vĂ€henevad esialgsete hinnangute kohaselt kulud logide salvestamisele ja töötlemisele viie kuni kĂŒmne korra. TeisisĂ”nu, kui praeguse andmehulgaga peaksime seadistama kluster mitmest masinast, siis ClickHouse'i kasutamisel piisab meile ĂŒhest nĂ”rgast masinast. Jah, ElasticSearchil on ka andmete tihendamise mehhanismid kettas ja muid funktsioone, mis vĂ”imaldavad mĂ€rgatavalt vĂ€hendada ressursikasutust, kuid vĂ”rreldes ClickHouse'iga nĂ”uab see suuremaid kulutusi.

Ilma erilise optimeerimiseta oma poolt, vaike seadistustes, andmete laadimine ja valikud andmebaasist toimivad uskumatult kiiresti. Andmeid on meil praegu vĂ€he (umbes 200 miljonit kirjet), kuid server ise on nĂ”rk. Seda tööriista saame tulevikus kasutada ka muudel eesmĂ€rkidel, mis ei ole seotud logide salvestamisega. NĂ€iteks tervikliku analĂŒĂŒtika, turvalisuse ja masinĂ”ppe valdkonnas.

LÔpetuseks veidi plussidest ja miinustest.

Miinused

  1. Kirjade laadimine suurte partiidena. See on ĂŒheaegselt omadus, kuid siiski tuleb kasutada tĂ€iendavaid komponente kirjade vahemĂ€lestamiseks. See ĂŒlesanne ei ole alati lihtne, kuid siiski lahendatav. Ja sooviksime skeemi lihtsustada.
  2. MĂ”ned eksootilised funktsioonid vĂ”i uued omadused pikema aja jooksul sageli uutes versioonides riknevad. See tekitab muret ja vĂ€hendab soovitust uuendada. NĂ€iteks Kafka tabelimootor - vĂ€ga kasulik funktsioon, mis vĂ”imaldab otse lugeda sĂŒndmuseid Kafka's, ilma tarbijate rakendamiseta. Aga arvestades probleemide arvu GitHubis, oleme hetkel ettevaatlikud selle mootori kasutamisel tootmises. Siiski, kui mitte teha Ă€kilisi liigutusi ja kasutada pĂ”hifunktsioone, siis see töötab stabiilselt.

Plussid

  1. Ei sega.
  2. Madala sisenemisbarjÀÀriga.
  3. Avaallikas.
  4. Tasuta.
  5. Hea skaleeritavus (shardimine/replikeerimine "kastist vÀlja")
  6. Sisaldub Venemaa soovitatud tarkvara registris, mis on soovitatud MinComMug.
  7. Yandexi ametliku toe olemasolu.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster