Cronfa Ddata ClickHouse ar gyfer Bodau Dynol, neu Dechnolegau Estron

Aleksey Lizunov, Pennaeth Canolfan Cymhwysedd Sianeli Gwasanaeth o Bell Cyfarwyddiaeth Technolegau Gwybodaeth y MKB

Cronfa Ddata ClickHouse ar gyfer Bodau Dynol, neu Dechnolegau Estron

Fel dewis arall i stac ELK (ElasticSearch, Logstash, Kibana), rydym yn gwneud ymchwil ar ddefnyddio cronfa ddata ClickHouse fel storfa ddata ar gyfer logiau.

Yn yr erthygl hon, hoffem siarad am ein profiad o ddefnyddio cronfa ddata ClickHouse a chanlyniadau rhagarweiniol y gweithrediad peilot. Dylid nodi ar unwaith bod y canlyniadau yn drawiadol.


Cronfa Ddata ClickHouse ar gyfer Bodau Dynol, neu Dechnolegau Estron

Nesaf, byddwn yn disgrifio'n fanylach sut mae ein system wedi'i ffurfweddu, a pha gydrannau y mae'n eu cynnwys. Ond nawr hoffwn siarad ychydig am y gronfa ddata hon yn ei chyfanrwydd, a pham ei bod yn werth talu sylw iddi. Mae cronfa ddata ClickHouse yn gronfa ddata golofnog ddadansoddol perfformiad uchel gan Yandex. Fe'i defnyddir mewn gwasanaethau Yandex, i ddechrau dyma'r prif storfa ddata ar gyfer Yandex.Metrica. System ffynhonnell agored, am ddim. O safbwynt datblygwr, rwyf bob amser wedi meddwl sut y gwnaethant ei weithredu, oherwydd mae data rhyfeddol o fawr. Ac mae rhyngwyneb defnyddiwr Metrica ei hun yn hyblyg ac yn gyflym iawn. Ar yr adnabyddiaeth gyntaf â'r gronfa ddata hon, yr argraff yw: “Wel, o'r diwedd! Wedi'i wneud ar gyfer y bobl! Gan ddechrau o'r broses osod a gorffen gydag anfon ceisiadau.

Mae gan y gronfa ddata hon drothwy mynediad isel iawn. Gall hyd yn oed datblygwr medrus ar gyfartaledd osod y gronfa ddata hon mewn ychydig funudau a dechrau ei defnyddio. Mae popeth yn gweithio'n glir. Gall hyd yn oed pobl sy'n newydd i Linux drin y gosodiad yn gyflym a gwneud y gweithrediadau symlaf. Os yn gynharach, gyda'r geiriau Big Data, Hadoop, Google BigTable, HDFS, roedd gan ddatblygwr cyffredin syniadau ei bod yn ymwneud â rhai terabytes, petabytes, bod rhai superhumans yn cymryd rhan mewn gosodiadau a datblygiad ar gyfer y systemau hyn, yna gyda dyfodiad y ClickHouse cronfa ddata, cawsom arf syml, dealladwy y gallwch ei ddefnyddio i ddatrys ystod anghyraeddadwy o'r blaen o dasgau. Dim ond un peiriant gweddol gyffredin y mae'n ei gymryd a phum munud i'w osod. Hynny yw, cawsom gronfa ddata o'r fath fel, er enghraifft, MySql, ond dim ond ar gyfer storio biliynau o gofnodion! Archifwr penodol gyda'r iaith SQL. Mae fel bod pobl wedi cael arfau estroniaid.

Am ein system logio

I gasglu gwybodaeth, defnyddir ffeiliau log IIS o gymwysiadau gwe fformat safonol (rydym hefyd ar hyn o bryd yn dosrannu logiau cais, ond y prif nod yn y cam peilot yw casglu logiau IIS).

Am wahanol resymau, ni allem roi'r gorau i'r pentwr ELK yn llwyr, ac rydym yn parhau i ddefnyddio'r cydrannau LogStash a Filebeat, sydd wedi profi eu hunain yn dda ac yn gweithio'n eithaf dibynadwy a rhagweladwy.

Dangosir y cynllun logio cyffredinol yn y ffigur isod:

Cronfa Ddata ClickHouse ar gyfer Bodau Dynol, neu Dechnolegau Estron

Nodwedd o ysgrifennu data i gronfa ddata ClickHouse yw mewnosod cofnodion mewn sypiau mawr yn anaml (unwaith yr eiliad). Mae'n debyg mai hon yw'r rhan fwyaf "problemus" y byddwch chi'n dod ar ei thraws pan fyddwch chi'n cael profiad cyntaf o weithio gyda chronfa ddata ClickHouse: mae'r cynllun yn mynd ychydig yn fwy cymhleth.
Roedd yr ategyn ar gyfer LogStash, sy'n mewnosod data yn uniongyrchol i ClickHouse, wedi helpu llawer yma. Mae'r gydran hon yn cael ei defnyddio ar yr un gweinydd â'r gronfa ddata ei hun. Felly, yn gyffredinol, ni argymhellir ei wneud, ond o safbwynt ymarferol, er mwyn peidio â chynhyrchu gweinyddwyr ar wahân tra ei fod yn cael ei ddefnyddio ar yr un gweinydd. Ni welsom unrhyw fethiannau neu wrthdaro o ran adnoddau â'r gronfa ddata. Yn ogystal, dylid nodi bod gan yr ategyn fecanwaith ailgynnig rhag ofn y bydd gwallau. Ac mewn achos o wallau, mae'r ategyn yn ysgrifennu swp o ddata na ellid ei fewnosod ar ddisg (mae fformat y ffeil yn gyfleus: ar ôl ei olygu, gallwch chi fewnosod y swp wedi'i gywiro yn hawdd gan ddefnyddio clickhouse-client).

Mae rhestr gyflawn o'r meddalwedd a ddefnyddir yn y cynllun wedi'i chyflwyno yn y tabl:

Rhestr o'r meddalwedd a ddefnyddiwyd

Enw

Disgrifiad

Dolen ddosbarthu

NGINX

Gwrthdroi-dirprwy i gyfyngu mynediad gan borthladdoedd a threfnu awdurdodiad

Heb ei ddefnyddio yn y cynllun ar hyn o bryd

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

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

FfeilBeat

Trosglwyddo logiau ffeil.

https://www.elastic.co/downloads/beats/filebeat (pecyn dosbarthu ar gyfer Windows 64bit).

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

boncyff

Casglwr logiau.

Fe'i defnyddir i gasglu logiau o FileBeat, yn ogystal â chasglu logiau o'r ciw RabbitMQ (ar gyfer gweinyddwyr sydd yn y DMZ.)

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

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

Logstash-allbwn-clickhouse

Ategyn Loagstash ar gyfer trosglwyddo logiau i gronfa ddata ClickHouse mewn sypiau

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

/usr/share/logstash/bin/logstash-plugin gosod logstash-output-clickhouse

/usr/share/logstash/bin/logstash-plugin gosod logstash-filter-prune

/usr/share/logstash/bin/logstash-plugin gosod logstash-filter-multiline

CliciwchHouse

Storio logiau 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

Nodyn. Gan ddechrau o fis Awst 2018, ymddangosodd adeiladau rpm “normal” ar gyfer RHEL yn ystorfa Yandex, felly gallwch geisio eu defnyddio. Ar adeg gosod, roeddem yn defnyddio pecynnau a adeiladwyd gan Altinity.

Grafana

Delweddu log. Sefydlu dangosfyrddau

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos (64 Bit) - fersiwn diweddaraf

Ffynhonnell data ClickHouse ar gyfer Grafana 4.6+

Ategyn ar gyfer Grafana gyda ffynhonnell ddata ClickHouse

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

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

boncyff

Logio llwybrydd o FileBeat i giw RabbitMQ.

Nodyn. Yn anffodus, nid oes gan FileBeat allbwn yn uniongyrchol i RabbitMQ, felly mae angen cyswllt canolradd ar ffurf Logstash

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

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

RabbitMQ

ciw neges. Dyma'r byffer boncyff yn y 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 (Angenrheidiol ar gyfer RabbitMQ)

Erlang amser rhedeg. Yn ofynnol er mwyn i RabbitMQ weithio

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

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

Cyflwynir cyfluniad y gweinydd gyda chronfa ddata ClickHouse yn y tabl canlynol:

Enw

Gwerth

Nodyn

Ffurfweddiad

HDD: 40GB
RAM: 8GB
Prosesydd: Craidd 2 2Ghz

Mae angen rhoi sylw i'r awgrymiadau ar gyfer gweithredu cronfa ddata ClickHouse (https://clickhouse.yandex/docs/ru/operations/tips/)

Meddalwedd system gyffredinol

OS: Gweinydd Linux Red Hat Enterprise (Maipo)

JRE (Java 8)

 

Fel y gwelwch, gweithfan arferol yw hon.

Mae strwythur y bwrdd ar gyfer storio boncyffion fel a ganlyn:

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;

Rydym yn defnyddio rhaniad diofyn (fesul mis) a gronynnedd mynegai. Mae pob maes yn cyfateb yn ymarferol i gofnodion log IIS ar gyfer logio ceisiadau http. Ar wahân, rydym yn nodi bod meysydd ar wahân ar gyfer storio utm-tags (maent yn cael eu dosrannu ar y cam o fewnosod yn y tabl o faes llinyn ymholiad).

Hefyd, mae sawl maes system wedi'u hychwanegu at y tabl i storio gwybodaeth am systemau, cydrannau, gweinyddwyr. Gweler y tabl isod am ddisgrifiad o'r meysydd hyn. Mewn un tabl, rydym yn storio logiau ar gyfer sawl system.

Enw

Disgrifiad

Enghraifft

fld_app_name

Enw'r cais/system
Gwerthoedd dilys:

  • site1.domain.com Safle allanol 1
  • site2.domain.com Safle allanol 2
  • safle mewnol1.domain.local Safle mewnol 1

safle1.domain.com

fld_app_modiwl

Modiwl system
Gwerthoedd dilys:

  • gwe - Gwefan
  • svc - Gwasanaeth gwefan
  • intgr - Gwasanaeth Gwe Integreiddio
  • bo - Gweinyddol (Swyddfa Gefn)

we

fld_gwefan_enw

Enw'r safle yn IIS

Gellir defnyddio sawl system ar un gweinydd, neu hyd yn oed sawl enghraifft o un modiwl system

prif we

fld_server_name

Enw gweinydd

gwe1.domain.com

fld_log_file_name

Llwybr i'r ffeil log ar y gweinydd

C:inetpublogsLogFiles
W3SVC1u_ex190711.log

Mae hyn yn caniatáu ichi adeiladu graffiau yn Grafana yn effeithlon. Er enghraifft, gweld ceisiadau o flaen system benodol. Mae hyn yn debyg i gownter y safle yn Yandex.Metrica.

Dyma rai ystadegau ar y defnydd o'r gronfa ddata am ddau fis.

Nifer y cofnodion wedi'u dadansoddi yn ôl systemau a'u cydrannau

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

Swm y data ar y ddisg

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.

Graddau cywasgu data mewn colofnau

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.

Disgrifiad o'r cydrannau a ddefnyddir

FfeilBeat. Trosglwyddo logiau ffeil

Mae'r gydran hon yn olrhain newidiadau i ffeiliau log ar ddisg ac yn trosglwyddo'r wybodaeth i LogStash. Wedi'i osod ar bob gweinydd lle mae ffeiliau log yn cael eu hysgrifennu (IIS fel arfer). Yn gweithio yn y modd cynffon (h.y. yn trosglwyddo'r cofnodion ychwanegol i'r ffeil yn unig). Ond ar wahân gellir ei ffurfweddu i drosglwyddo ffeiliau cyfan. Mae hyn yn ddefnyddiol pan fydd angen i chi lawrlwytho data o fisoedd blaenorol. Rhowch y ffeil log mewn ffolder a bydd yn ei ddarllen yn ei gyfanrwydd.

Pan fydd y gwasanaeth yn cael ei stopio, nid yw'r data bellach yn cael ei drosglwyddo ymhellach i'r storfa.

Mae ffurfweddiad enghreifftiol yn edrych fel hyn:

ffeilbeat.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: ~

boncyff. Casglwr Logiau

Mae'r gydran hon wedi'i chynllunio i dderbyn cofnodion log gan FileBeat (neu drwy'r ciw RabbitMQ), gan ddosrannu a mewnosod sypiau i gronfa ddata ClickHouse.

I'w fewnosod yn ClickHouse, defnyddir yr ategyn Logstash-allbwn-clickhouse. Mae gan yr ategyn Logstash fecanwaith ailgynnig ceisiadau, ond gyda chau i lawr yn rheolaidd, mae'n well atal y gwasanaeth ei hun. Pan gaiff ei stopio, bydd negeseuon yn cael eu cronni yn y ciw RabbitMQ, felly os yw'r stop am amser hir, yna mae'n well atal Filebeats ar y gweinyddwyr. Mewn cynllun lle nad yw RabbitMQ yn cael ei ddefnyddio (ar y rhwydwaith lleol, mae Filebeat yn anfon logiau yn uniongyrchol i Logstash), mae Filebeats yn gweithio'n eithaf derbyniol ac yn ddiogel, felly ar eu cyfer mae'r ffaith nad yw allbwn ar gael yn mynd heibio heb ganlyniadau.

Mae ffurfweddiad enghreifftiol yn edrych fel hyn:

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"
        }
    }
 
}

piblinellau.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"

clicdy. Storio logiau

Mae logiau ar gyfer pob system yn cael eu storio mewn un tabl (gweler ar ddechrau'r erthygl). Bwriedir storio gwybodaeth am geisiadau: mae'r holl baramedrau yn debyg ar gyfer gwahanol fformatau, megis logiau IIS, apache a logiau nginx. Ar gyfer logiau cais, lle, er enghraifft, gwallau, negeseuon gwybodaeth, rhybuddion yn cael eu cofnodi, bydd tabl ar wahân yn cael ei ddarparu gyda'r strwythur priodol (ar hyn o bryd yn y cam dylunio).

Wrth ddylunio tabl, mae'n bwysig iawn penderfynu ar yr allwedd gynradd (ar gyfer didoli'r data wrth ei storio). Mae graddau cywasgu data a chyflymder ymholiad yn dibynnu ar hyn. Yn ein hesiampl, yr allwedd yw
GORCHYMYN GAN (fld_app_name, fld_app_module, logdatetime)
Hynny yw, yn ôl enw'r system, enw cydran y system a dyddiad y digwyddiad. I ddechrau, daeth dyddiad y digwyddiad yn gyntaf. Ar ôl ei symud i'r lle olaf, dechreuodd ymholiadau weithio tua dwywaith mor gyflym. Bydd newid y bysell gynradd yn gofyn am ail-greu'r tabl ac ail-lwytho'r data fel bod ClickHouse yn ail-drefnu'r data ar ddisg. Mae hwn yn weithrediad trwm, felly mae'n syniad da meddwl llawer am yr hyn y dylid ei gynnwys yn yr allwedd didoli.

Dylid nodi hefyd bod y math o ddata IselCardinality wedi ymddangos mewn fersiynau cymharol ddiweddar. Wrth ei ddefnyddio, mae maint y data cywasgedig yn cael ei leihau'n sylweddol ar gyfer y meysydd hynny sydd â cardinality isel (ychydig o opsiynau).

Mae fersiwn 19.6 yn cael ei defnyddio ar hyn o bryd a bwriadwn geisio diweddaru i'r fersiwn diweddaraf. Mae ganddyn nhw nodweddion mor wych â Adaptive Granularity, Mynegeion Sgipio a'r codec DoubleDelta, er enghraifft.

Yn ddiofyn, yn ystod y gosodiad, mae'r lefel logio wedi'i gosod i olrhain. Mae'r logiau'n cael eu cylchdroi a'u harchifo, ond ar yr un pryd maen nhw'n ehangu hyd at gigabeit. Os nad oes angen, yna gallwch chi osod y lefel rhybudd, yna mae maint y log yn cael ei leihau'n sylweddol. Mae'r gosodiad logio wedi'i osod yn y ffeil config.xml:

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

Rhai gorchmynion defnyddiol

Поскольку оригинальные пакеты установки собираются по 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

boncyff. Logio llwybrydd o FileBeat i giw RabbitMQ

Defnyddir y gydran hon i gyfeirio logiau sy'n dod o FileBeat i'r ciw RabbitMQ. Mae dau bwynt yma:

  1. Yn anffodus, nid oes gan FileBeat ategyn allbwn i ysgrifennu'n uniongyrchol i RabbitMQ. Ac nid yw ymarferoldeb o'r fath, a barnu yn ôl y mater ar eu github, wedi'i gynllunio i'w weithredu. Mae yna ategyn ar gyfer Kafka, ond am ryw reswm ni allwn ei ddefnyddio gartref.
  2. Mae gofynion ar gyfer casglu boncyffion yn y DMZ. Yn seiliedig arnynt, rhaid ychwanegu'r logiau i'r ciw yn gyntaf ac yna mae LogStash yn darllen y cofnodion o'r ciw o'r tu allan.

Felly, pan fo gweinyddwyr wedi'u lleoli yn y DMZ, mae'n rhaid i chi ddefnyddio cynllun sydd ychydig yn gymhleth. Mae ffurfweddiad enghreifftiol yn edrych fel hyn:

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. ciw neges

Defnyddir y gydran hon i glustogi cofnodion log yn y DMZ. Gwneir recordiad trwy griw o Filebeat → LogStash. Gwneir darllen o'r tu allan i'r DMZ trwy LogStash. Wrth weithredu trwy RabboitMQ, mae tua 4 mil o negeseuon yr eiliad yn cael eu prosesu.

Mae llwybro neges wedi'i ffurfweddu yn ôl enw'r system, h.y. yn seiliedig ar ddata ffurfweddu FileBeat. Mae pob neges yn mynd i un ciw. Os caiff y gwasanaeth ciwio ei atal am ryw reswm, ni fydd hyn yn arwain at golli negeseuon: bydd FileBeats yn derbyn gwallau cysylltu ac yn atal anfon dros dro. A bydd LogStash sy'n darllen o'r ciw hefyd yn derbyn gwallau rhwydwaith ac yn aros i'r cysylltiad gael ei adfer. Yn yr achos hwn, ni fydd y data, wrth gwrs, yn cael ei ysgrifennu i'r gronfa ddata mwyach.

Defnyddir y cyfarwyddiadau canlynol i greu a ffurfweddu ciwiau:

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

Defnyddir y gydran hon i ddelweddu data monitro. Yn yr achos hwn, mae angen i chi osod y ffynhonnell ddata ClickHouse ar gyfer ategyn Grafana 4.6+. Roedd yn rhaid i ni ei addasu ychydig i wella effeithlonrwydd prosesu hidlwyr SQL ar y dangosfwrdd.

Er enghraifft, rydym yn defnyddio newidynnau, ac os nad ydynt wedi'u gosod yn y maes hidlo, yna hoffem iddynt beidio â chynhyrchu amod yn BLE y ffurflen ( uriStem = » A uriStem ! = » ). Yn yr achos hwn, bydd ClickHouse yn darllen y golofn uriStem. Yn gyffredinol, fe wnaethon ni roi cynnig ar wahanol opsiynau ac yn y diwedd cywiro'r ategyn (y macro $valueIfEmpty) fel ei fod yn dychwelyd 1 yn achos gwerth gwag, heb sôn am y golofn ei hun.

A nawr gallwch chi ddefnyddio'r ymholiad hwn ar gyfer y 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')

sy'n cyfieithu i'r SQL hwn (sylwch fod y meysydd uriStem gwag wedi'u trosi i 1 yn unig)

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

Casgliad

Mae ymddangosiad cronfa ddata ClickHouse wedi dod yn ddigwyddiad nodedig yn y farchnad. Roedd yn anodd dychmygu ein bod, yn hollol rhad ac am ddim, mewn amrantiad wedi'n harfogi ag arf pwerus ac ymarferol ar gyfer gweithio gyda data mawr. Wrth gwrs, gydag anghenion cynyddol (er enghraifft, rhannu a dyblygu i weinyddion lluosog), bydd y cynllun yn dod yn fwy cymhleth. Ond ar argraffiadau cyntaf, mae gweithio gyda'r gronfa ddata hon yn ddymunol iawn. Gellir gweld bod y cynnyrch yn cael ei wneud "ar gyfer pobl."

O'i gymharu ag ElasticSearch, amcangyfrifir y bydd cost storio a phrosesu boncyffion yn cael ei leihau bump i ddeg gwaith. Mewn geiriau eraill, os byddai'n rhaid i ni sefydlu clwstwr o nifer o beiriannau ar gyfer y swm presennol o ddata, yna wrth ddefnyddio ClickHouse, mae un peiriant pŵer isel yn ddigon i ni. Oes, wrth gwrs, mae gan ElasticSearch hefyd fecanweithiau cywasgu data ar-ddisg a nodweddion eraill a all leihau'r defnydd o adnoddau yn sylweddol, ond o'i gymharu â ClickHouse, bydd hyn yn ddrutach.

Heb unrhyw optimeiddiadau arbennig ar ein rhan ni, ar osodiadau diofyn, mae llwytho data a dewis o'r gronfa ddata yn gweithio ar gyflymder anhygoel. Nid oes gennym lawer o ddata eto (tua 200 miliwn o gofnodion), ond mae'r gweinydd ei hun yn wan. Gallwn ddefnyddio'r offeryn hwn yn y dyfodol at ddibenion eraill nad ydynt yn ymwneud â storio logiau. Er enghraifft, ar gyfer dadansoddeg pen-i-ben, ym maes diogelwch, dysgu peiriannau.

Ar y diwedd, ychydig am y manteision a'r anfanteision.

Cons

  1. Llwytho cofnodion mewn sypiau mawr. Ar y naill law, mae hon yn nodwedd, ond mae'n rhaid i chi ddefnyddio cydrannau ychwanegol o hyd i glustogi cofnodion. Nid yw'r dasg hon bob amser yn hawdd, ond yn dal i fod yn solvable. A hoffwn symleiddio'r cynllun.
  2. Mae rhai swyddogaethau egsotig neu nodweddion newydd yn aml yn torri mewn fersiynau newydd. Mae hyn yn achosi pryder, gan leihau'r awydd i uwchraddio i fersiwn newydd. Er enghraifft, mae injan bwrdd Kafka yn nodwedd ddefnyddiol iawn sy'n eich galluogi i ddarllen digwyddiadau Kafka yn uniongyrchol, heb weithredu defnyddwyr. Ond a barnu yn ôl nifer y Materion ar y github, rydym yn dal yn ofalus i beidio â defnyddio'r injan hon wrth gynhyrchu. Fodd bynnag, os na fyddwch yn gwneud ystumiau sydyn i'r ochr ac yn defnyddio'r prif swyddogaeth, yna mae'n gweithio'n sefydlog.

Manteision

  1. Nid yw'n arafu.
  2. Trothwy mynediad isel.
  3. Ffynhonnell agor.
  4. Rhad ac am ddim.
  5. Graddio'n dda (rhwygo/dyblygu allan o'r bocs)
  6. Wedi'i gynnwys yn y gofrestr o feddalwedd Rwsia a argymhellir gan y Weinyddiaeth Gyfathrebu.
  7. Presenoldeb cefnogaeth swyddogol gan Yandex.

Ffynhonnell: hab.com

Ychwanegu sylw