ClickHouse Database għall-Bnedmin, jew Teknoloġiji Aljeni

Aleksey Lizunov, Kap taċ-Ċentru ta' Kompetenza għall-Kanali ta' Servizz mill-Bogħod tad-Direttorat tat-Teknoloġija tal-Informazzjoni tal-MKB

ClickHouse Database għall-Bnedmin, jew Teknoloġiji Aljeni

Bħala alternattiva għall-munzell ELK (ElasticSearch, Logstash, Kibana), qed nagħmlu riċerka dwar l-użu tad-database ClickHouse bħala maħżen tad-dejta għal zkuk.

F'dan l-artikolu, nixtiequ nitkellmu dwar l-esperjenza tagħna tal-użu tad-database ClickHouse u r-riżultati preliminari tal-operazzjoni pilota. Għandu jiġi nnutat mill-ewwel li r-riżultati kienu impressjonanti.


ClickHouse Database għall-Bnedmin, jew Teknoloġiji Aljeni

Sussegwentement, se niddeskrivu f'aktar dettall kif is-sistema tagħna hija kkonfigurata, u f'liema komponenti tikkonsisti. Imma issa nixtieq nitkellem ftit dwar din id-database kollha kemm hi, u għaliex ta 'min joqgħod attent għaliha. Id-database ClickHouse hija database ta 'kolonni analitiċi ta' prestazzjoni għolja minn Yandex. Jintuża fis-servizzi Yandex, inizjalment huwa l-ħażna tad-dejta ewlenija għal Yandex.Metrica. Sistema ta’ sors miftuħ, b’xejn. Mill-aspett ta 'żviluppatur, jien dejjem staqsejt kif implimentawha, minħabba li hemm data fantastically kbira. U l-interface tal-utent ta 'Metrica innifsu huwa flessibbli ħafna u veloċi. Fl-ewwel familjarità ma 'din id-database, l-impressjoni hija: "Well, finalment! Magħmul għall-poplu! Tibda mill-proċess ta 'installazzjoni u tispiċċa bit-trażmissjoni tat-talbiet.

Din id-database għandha limitu ta' dħul baxx ħafna. Anke żviluppatur b'ħiliet medji jista 'jinstalla din id-database fi ftit minuti u jibda jużaha. Kollox jaħdem b'mod ċar. Anke nies li huma ġodda għal Linux jistgħu malajr jimmaniġġjaw l-installazzjoni u jagħmlu l-aktar operazzjonijiet sempliċi. Jekk qabel, bil-kliem Big Data, Hadoop, Google BigTable, HDFS, żviluppatur ordinarju kellu ideat li kien dwar xi terabytes, petabytes, li xi superumani huma involuti f'settings u żvilupp għal dawn is-sistemi, imbagħad bil-miġja tal-ClickHouse database, sirna għodda sempliċi u li tinftiehem li biha tista’ ssolvi firxa ta’ kompiti li qabel ma tistax tintlaħaq. Tieħu biss magna waħda pjuttost medja u ħames minuti biex tinstalla. Jiġifieri, aħna ltqajna database bħal, pereżempju, MySql, iżda biss għall-ħażna ta 'biljuni ta' rekords! Ċertu super-arkivju bil-lingwa SQL. Qisu n-nies ingħataw l-armi tal-aljeni.

Dwar is-sistema ta' qtugħ tagħna

Biex tiġbor l-informazzjoni, jintużaw fajls log IIS ta 'applikazzjonijiet tal-web b'format standard (bħalissa qegħdin ukoll inparsjaw zkuk tal-applikazzjonijiet, iżda l-għan ewlieni fl-istadju pilota huwa li niġbru zkuk tal-IIS).

Għal diversi raġunijiet, ma stajniex nabbandunaw kompletament il-munzell ELK, u nkomplu nużaw il-komponenti LogStash u Filebeat, li wrew ruħhom tajjeb u jaħdmu b'mod pjuttost affidabbli u prevedibbli.

L-iskema ġenerali tas-siġar tidher fil-figura hawn taħt:

ClickHouse Database għall-Bnedmin, jew Teknoloġiji Aljeni

Karatteristika tal-kitba tad-data fid-database ClickHouse hija inserzjoni mhux frekwenti (darba kull sekonda) ta 'rekords f'lottijiet kbar. Din, apparentement, hija l-aktar parti "problematika" li tiltaqa 'ma' l-ewwel esperjenza ta' xogħol mad-database ClickHouse: l-iskema ssir ftit aktar ikkumplikata.
Il-plugin għal LogStash, li jdaħħal id-dejta direttament fi ClickHouse, għen ħafna hawn. Dan il-komponent huwa skjerat fuq l-istess server bħad-database innifsu. Għalhekk, b'mod ġenerali, mhux irrakkomandat li tagħmel dan, iżda mill-aspett prattiku, sabiex ma tipproduċix servers separati waqt li tkun skjerata fuq l-istess server. Aħna ma osservajna l-ebda fallimenti jew kunflitti tar-riżorsi mad-database. Barra minn hekk, għandu jiġi nnutat li l-plugin għandu mekkaniżmu mill-ġdid f'każ ta 'żbalji. U f'każ ta 'żbalji, il-plugin jikteb fuq disk lott ta' dejta li ma setgħetx tiddaħħal (il-format tal-fajl huwa konvenjenti: wara l-editjar, tista 'faċilment daħħal il-lott ikkoreġut billi tuża clickhouse-client).

Lista kompleta tas-softwer użat fl-iskema hija ppreżentata fit-tabella:

Lista tas-softwer użat

Isem

Deskrizzjoni

Rabta tad-distribuzzjoni

NGINX

Reverse-proxy biex tirrestrinġi l-aċċess mill-portijiet u torganizza l-awtorizzazzjoni

Bħalissa mhux użat fl-iskema

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

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

FileBeat

Trasferiment ta' zkuk tal-fajls.

https://www.elastic.co/downloads/beats/filebeat (kit tad-distribuzzjoni għall-Windows 64bit).

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

logstash

Kollettur taz-zkuk.

Użati biex jiġbru zkuk minn FileBeat, kif ukoll biex jiġbru zkuk mill-kju RabbitMQ (għal servers li huma fid-DMZ.)

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

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

Logstash-output-clickhouse

Plugin Loagstash għat-trasferiment taz-zkuk għad-database ClickHouse f'lottijiet

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

IkklikkjaHouse

Ħażna taz-zkuk 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

Nota. Minn Awwissu 2018, il-bini ta 'rpm "normali" għal RHEL deher fir-repożitorju Yandex, sabiex tkun tista' tipprova tużahom. Fiż-żmien tal-installazzjoni, konna nużaw pakketti mibnija minn Altinity.

grafana

Log viżwalizzazzjoni. It-twaqqif ta' dashboards

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos (64 Bit) - l-aħħar verżjoni

Is-sors tad-dejta ClickHouse għal Grafana 4.6+

Plugin għal Grafana bis-sors tad-dejta ClickHouse

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

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

logstash

Log router minn FileBeat għal kju RabbitMQ.

Nota. Sfortunatament FileBeat ma joħroġx direttament lil RabbitMQ, għalhekk hija meħtieġa link intermedju fil-forma ta' Logstash

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

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

Fenek MQ

kju tal-messaġġi. Dan huwa l-buffer tal-ġurnal fid-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 (Meħtieġa għal RabbitMQ)

Erlang runtime. Meħtieġa biex RabbitMQ jaħdem

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

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

Il-konfigurazzjoni tas-server mad-database ClickHouse hija ppreżentata fit-tabella li ġejja:

Isem

Valur

Innota

Konfigurazzjoni

HDD: 40GB
RAM: 8GB
Proċessur: Core 2 2Ghz

Huwa meħtieġ li tingħata attenzjoni għall-pariri għat-tħaddim tad-database ClickHouse (https://clickhouse.yandex/docs/ru/operations/tips/)

Softwer tas-sistema ġenerali

OS: Red Hat Enterprise Linux Server (Maipo)

JRE (Java 8)

 

Kif tistgħu taraw, din hija workstation ordinarja.

L-istruttura tat-tabella għall-ħażna taz-zkuk hija kif ġej:

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;

Aħna nużaw il-qsim default (b'xahar) u l-granularità tal-indiċi. L-oqsma kollha prattikament jikkorrispondu għall-entrati log IIS għall-illoggjar talbiet http. Separatament, ninnotaw li hemm oqsma separati għall-ħażna ta 'utm-tags (huma parsed fl-istadju ta' inserzjoni fit-tabella mill-qasam string mistoqsija).

Ukoll, diversi oqsma tas-sistema ġew miżjuda mat-tabella biex jaħżnu informazzjoni dwar sistemi, komponenti, servers. Ara t-tabella hawn taħt għal deskrizzjoni ta' dawn l-oqsma. F'tabella waħda, aħna naħżnu zkuk għal diversi sistemi.

Isem

Deskrizzjoni

Eżempju

fld_app_name

Applikazzjoni/isem tas-sistema
Valuri validi:

  • site1.domain.com Sit estern 1
  • site2.domain.com Sit estern 2
  • internal-site1.domain.local Sit intern 1

site1.domain.com

fld_app_module

Modulu tas-sistema
Valuri validi:

  • web - Websajt
  • svc - Servizz ta' websajt
  • intgr - Servizz tal-Web ta' Integrazzjoni
  • bo - Amministratur (BackOffice)

-web

fld_website_name

Isem tas-sit fl-IIS

Diversi sistemi jistgħu jiġu skjerati fuq server wieħed, jew saħansitra diversi każijiet ta 'modulu tas-sistema waħda

web main

fld_server_name

Isem tas-server

web1.domain.com

fld_log_file_name

Mogħdija lejn il-fajl log fuq is-server

C:inetpublogsLogFiles
W3SVC1u_ex190711.log

Dan jippermettilek tibni graffs b'mod effiċjenti fi Grafana. Pereżempju, ara t-talbiet mill-frontend ta' sistema partikolari. Dan huwa simili għall-counter tas-sit f'Yandex.Metrica.

Hawn xi statistika dwar l-użu tad-database għal xahrejn.

Numru ta' rekords imqassma skond is-sistemi u l-komponenti tagħhom

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

L-ammont ta 'data fuq id-diska

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.

Grad ta' kompressjoni tad-data f'kolonni

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.

Deskrizzjoni tal-komponenti użati

FileBeat. It-trasferiment ta' zkuk tal-fajls

Dan il-komponent isegwi l-bidliet fil-fajls log fuq disk u jgħaddi l-informazzjoni lil LogStash. Installat fuq is-servers kollha fejn jinkitbu log files (ġeneralment IIS). Jaħdem fil-modalità denb (jiġifieri jittrasferixxi biss ir-rekords miżjuda fil-fajl). Iżda separatament jista 'jiġi kkonfigurat biex jittrasferixxi fajls sħaħ. Dan huwa utli meta jkollok bżonn tniżżel dejta mix-xhur preċedenti. Poġġi biss il-fajl tal-ġurnal f'folder u taqrah fl-intier tiegħu.

Meta s-servizz jitwaqqaf, id-dejta ma tibqax trasferita aktar lejn il-ħażna.

Eżempju ta' konfigurazzjoni tidher bħal din:

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. Kollettur taz-zkuk

Dan il-komponent huwa ddisinjat biex jirċievi l-entrati fil-log minn FileBeat (jew permezz tal-kju RabbitMQ), jeżamina u jdaħħal lottijiet fid-database ClickHouse.

Għall-inserzjoni fi ClickHouse, jintuża l-plugin Logstash-output-clickhouse. Il-plugin Logstash għandu mekkaniżmu ta' mistoqsija mill-ġdid, iżda b'għeluq regolari, huwa aħjar li twaqqaf is-servizz innifsu. Meta jitwaqqaf, il-messaġġi se jiġu akkumulati fil-kju RabbitMQ, għalhekk jekk il-waqfien huwa għal żmien twil, allura huwa aħjar li twaqqaf Filebeats fuq is-servers. Fi skema fejn RabbitMQ ma jintużax (fuq in-netwerk lokali, Filebeat jibgħat direttament zkuk lil Logstash), Filebeats jaħdmu pjuttost aċċettabbli u mingħajr periklu, għalhekk in-nuqqas ta 'disponibbiltà tal-output jgħaddi mingħajr konsegwenzi.

Eżempju ta' konfigurazzjoni tidher bħal din:

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. Ħażna taz-zkuk

Zkuk għas-sistemi kollha huma maħżuna f'tabella waħda (ara fil-bidu tal-artikolu). Huwa maħsub biex jaħżen informazzjoni dwar talbiet: il-parametri kollha huma simili għal formati differenti, bħal zkuk IIS, zkuk apache u nginx. Għar-reġistri tal-applikazzjoni, li fihom, pereżempju, jiġu rreġistrati żbalji, messaġġi ta 'informazzjoni, twissijiet, se tiġi pprovduta tabella separata bl-istruttura xierqa (bħalissa fl-istadju tad-disinn).

Meta tfassal tabella, huwa importanti ħafna li tiddeċiedi fuq iċ-ċavetta primarja (li biha d-dejta tiġi magħżula waqt il-ħażna). Il-grad ta 'kompressjoni tad-data u l-veloċità tal-mistoqsija jiddependu minn dan. Fl-eżempju tagħna, iċ-ċavetta hija
ORDNI MINN (fld_app_name, fld_app_module, logdatetime)
Jiġifieri, bl-isem tas-sistema, l-isem tal-komponent tas-sistema u d-data tal-avveniment. Inizjalment, id-data tal-avveniment ġiet l-ewwel. Wara li ċċaqlaqha fl-aħħar post, il-mistoqsijiet bdew jaħdmu madwar darbtejn aktar malajr. Il-bidla taċ-ċavetta primarja teħtieġ li terġa 'tagħmel it-tabella u li terġa' tgħabbi d-dejta sabiex ClickHouse terġa' tissortja d-dejta fuq id-diska. Din hija operazzjoni tqila, għalhekk hija idea tajba li taħseb ħafna dwar x'għandu jiġi inkluż fiċ-ċavetta tas-sort.

Għandu jiġi nnutat ukoll li t-tip ta 'dejta LowCardinality deher f'verżjonijiet relattivament reċenti. Meta tużaha, id-daqs tad-dejta kkompressata jitnaqqas drastikament għal dawk l-oqsma li għandhom kardinalità baxxa (ftit għażliet).

Il-verżjoni 19.6 bħalissa qed tintuża u qed nippjanaw li nippruvaw naġġornaw għall-aħħar verżjoni. Huma għandhom karatteristiċi meraviljużi bħal Granularità Adattiva, Indiċijiet ta 'Qbiż u l-codec DoubleDelta, per eżempju.

B'mod awtomatiku, waqt l-installazzjoni, il-livell tal-qtugħ huwa ssettjat biex jittraċċa. Iċ-zkuk huma mdawra u arkivjati, iżda fl-istess ħin jespandu sa gigabyte. Jekk ma jkunx hemm bżonn, allura tista 'tissettja l-livell ta' twissija, allura d-daqs tal-ġurnal jitnaqqas drastikament. L-issettjar tal-illoggjar huwa stabbilit fil-fajl config.xml:

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

Xi kmandi utli

Поскольку оригинальные пакеты установки собираются по 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. Log router minn FileBeat għal kju RabbitMQ

Dan il-komponent jintuża biex jingħadda zkuk li ġejjin minn FileBeat għall-kju RabbitMQ. Hemm żewġ punti hawn:

  1. Sfortunatament, FileBeat m'għandux plugin output biex jikteb direttament lil RabbitMQ. U tali funzjonalità, meta wieħed jiġġudika mill-kwistjoni fuq il-github tagħhom, mhix ippjanata għall-implimentazzjoni. Hemm plugin għal Kafka, iżda għal xi raġuni ma nistgħux nużawh id-dar.
  2. Hemm rekwiżiti għall-ġbir taz-zkuk fid-DMZ. Ibbażat fuqhom, ir-zkuk għandhom l-ewwel jiżdiedu mal-kju u mbagħad LogStash jaqra l-entrati mill-kju minn barra.

Għalhekk, huwa għall-każ fejn is-servers jinsabu fid-DMZ li wieħed irid juża tali skema kemmxejn ikkumplikata. Eżempju ta' konfigurazzjoni tidher bħal din:

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. kju tal-messaġġi

Dan il-komponent jintuża biex jibferja l-entrati fil-log fid-DMZ. Ir-reġistrazzjoni ssir permezz ta 'mazz ta' Filebeat → LogStash. Il-qari jsir minn barra d-DMZ permezz ta' LogStash. Meta topera permezz ta 'RabboitMQ, jiġu pproċessati madwar 4 elf messaġġ kull sekonda.

Ir-routing tal-messaġġi huwa kkonfigurat bl-isem tas-sistema, jiġifieri bbażat fuq id-dejta tal-konfigurazzjoni tal-FileBeat. Il-messaġġi kollha jmorru f'kju wieħed. Jekk għal xi raġuni s-servizz tal-kju jitwaqqaf, allura dan mhux se jwassal għat-telf ta 'messaġġi: FileBeats jirċievi żbalji ta' konnessjoni u jissospendi temporanjament it-trażmissjoni. U LogStash li jaqra mill-kju se jirċievi wkoll żbalji tan-netwerk u stenna li l-konnessjoni tiġi restawrata. F'dan il-każ, id-data, ovvjament, ma tibqax miktuba fid-database.

L-istruzzjonijiet li ġejjin jintużaw biex jinħolqu u jiġu kkonfigurati kjuwijiet:

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

Dan il-komponent jintuża biex jivviżwalizza d-dejta tal-monitoraġġ. F'dan il-każ, għandek bżonn tinstalla d-datasource ClickHouse għall-plugin Grafana 4.6+. Kellna tweak ftit biex intejbu l-effiċjenza tal-ipproċessar tal-filtri SQL fuq id-dashboard.

Pereżempju, nużaw varjabbli, u jekk ma jkunux stabbiliti fil-qasam tal-filtru, allura nixtiequ li ma tiġġenerax kundizzjoni fil-FEJN tal-formola ( uriStem = » AND uriStem != » ). F'dan il-każ, ClickHouse se jaqra l-kolonna uriStem. B'mod ġenerali, ippruvajna għażliet differenti u eventwalment ikkoreġejna l-plugin (il-makro $valueIfEmpty) sabiex fil-każ ta 'valur vojt jirritorna 1, mingħajr ma ssemmi l-kolonna nnifisha.

U issa tista 'tuża din il-mistoqsija għall-graff

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

li jittraduċi għal dan l-SQL (innota li l-oqsma vojta uriStem ġew konvertiti għal 1 biss)

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

Konklużjoni

Id-dehra tad-database ClickHouse saret avveniment importanti fis-suq. Kien diffiċli li wieħed jimmaġina li, kompletament mingħajr ħlas, f'mument imqabbad konna armati b'għodda qawwija u prattika biex naħdmu mal-big data. Naturalment, bi bżonnijiet dejjem jiżdiedu (per eżempju, sharding u replikazzjoni għal servers multipli), l-iskema se ssir aktar ikkumplikata. Iżda fuq l-ewwel impressjonijiet, ix-xogħol ma 'din id-database huwa pjaċevoli ħafna. Wieħed jista 'jara li l-prodott huwa magħmul "għal nies."

Meta mqabbel ma 'ElasticSearch, l-ispiża tal-ħażna u l-ipproċessar ta' zkuk hija stmata li titnaqqas b'ħames sa għaxar darbiet. Fi kliem ieħor, jekk għall-ammont attwali ta 'dejta jkollna nwaqqfu raggruppament ta' diversi magni, allura meta tuża ClickHouse, magna waħda b'enerġija baxxa hija biżżejjed għalina. Iva, ovvjament, ElasticSearch għandu wkoll mekkaniżmi ta 'kompressjoni tad-dejta fuq id-disk u karatteristiċi oħra li jistgħu jnaqqsu b'mod sinifikanti l-konsum tar-riżorsi, iżda meta mqabbel ma' ClickHouse, dan ikun aktar għali.

Mingħajr l-ebda ottimizzazzjonijiet speċjali min-naħa tagħna, fuq is-settings default, it-tagħbija tad-dejta u l-għażla mid-database taħdem b'veloċità aqwa. Għadna m'għandniex ħafna dejta (madwar 200 miljun rekord), iżda s-server innifsu huwa dgħajjef. Nistgħu nużaw din l-għodda fil-futur għal skopijiet oħra mhux relatati mal-ħażna ta 'zkuk. Pereżempju, għall-analiżi tarf sa tarf, fil-qasam tas-sigurtà, it-tagħlim tal-magni.

Fl-aħħar, ftit dwar il-vantaġġi u l-iżvantaġġi.

Cons

  1. Tagħbija ta' rekords f'lottijiet kbar. Min-naħa waħda, din hija karatteristika, iżda xorta trid tuża komponenti addizzjonali għall-buffering tar-rekords. Dan il-kompitu mhux dejjem huwa faċli, iżda xorta jista 'jsolvi. U nixtieq nissimplifika l-iskema.
  2. Xi funzjonalità eżotika jew karatteristiċi ġodda spiss jinkisru f'verżjonijiet ġodda. Dan jikkawża tħassib, u jnaqqas ix-xewqa li jaġġornaw għal verżjoni ġdida. Pereżempju, il-magna tal-mejda Kafka hija karatteristika utli ħafna li tippermettilek taqra direttament avvenimenti minn Kafka, mingħajr ma timplimenta l-konsumaturi. Iżda meta wieħed jiġġudika min-numru ta 'Kwistjonijiet fuq il-github, għadna noqogħdu attenti li ma nużawx din il-magna fil-produzzjoni. Madankollu, jekk ma tagħmilx ġesti għall-għarrieda lejn il-ġenb u tuża l-funzjonalità prinċipali, allura taħdem b'mod stabbli.

Pros

  1. Ma jonqosx.
  2. Limitu baxx tad-dħul.
  3. Sors miftuħ.
  4. B'xejn.
  5. Tiskala sew (sharding/replikazzjoni barra mill-kaxxa)
  6. Inkluż fir-reġistru tas-softwer Russu rakkomandat mill-Ministeru tal-Komunikazzjoni.
  7. Il-preżenza ta 'appoġġ uffiċjali minn Yandex.

Sors: www.habr.com

Żid kumment