Database ClickHouse ji bo Mirovan, an Teknolojiyên Alien

Alexey Lizunov, serokê navenda jêhatî ya kanalên karûbarê dûr a Midûriyeta Teknolojiya Agahdariyê ya ICB

Database ClickHouse ji bo Mirovan, an Teknolojiyên Alien

Wekî alternatîfek ji stûna ELK (ElasticSearch, Logstash, Kibana), em lêkolînê li ser karanîna databasa ClickHouse wekî hilanîna daneya têketinê dikin.

Di vê gotarê de em dixwazin li ser ezmûna xwe ya karanîna databasa ClickHouse û encamên pêşîn ên ji operasyona pîlotê biaxivin. Hêjayî gotinê ye ku di cih de encam balkêş bûn.


Database ClickHouse ji bo Mirovan, an Teknolojiyên Alien

Dûv re em ê bi hûrgulî diyar bikin ka pergala me çawa tê mîheng kirin û ji kîjan pêkhateyan pêk tê. Lê naha ez dixwazim hinekî li ser vê databasê bi tevahî biaxivim, û çima hêja ye ku bala xwe bide ser. Databasa ClickHouse ji Yandex databasek analîtîkî ya bi performansa bilind e. Di karûbarên Yandex de tê bikar anîn, di destpêkê de ev hilanîna daneya sereke ya Yandex.Metrica ye. Pergala çavkaniya vekirî, belaş. Ji nihêrîna pêşdebirek, min her gav meraq dikir ka wan çawa ev yek pêk anî, ji ber ku daneyên pir mezin hene. Û navgîniya bikarhênerê ya Metrica bixwe pir maqûl e û zû dixebite. Dema ku hûn yekem car bi vê databasê re nas dikin, hûn têgihiştinê distînin: "Belê, di dawiyê de! "Ji bo gel" hatiye çêkirin! Ji pêvajoya sazkirinê heya şandina daxwazan.”

Vê databasê astengiyek têketinê pir kêm e. Tewra pêşdebirek navîn dikare di çend hûrdeman de vê databasê saz bike û dest bi karanîna wê bike. Her tişt bi lez dixebite. Tewra kesên ku nû li Linux-ê ne jî dikarin zû bi sazkirinê re mijûl bibin û karûbarên hêsan bikin. Heger berê, dema ku peyvên Big Data, Hadoop, Google BigTable, HDFS dibihîstin, pêşdebirên navînî difikirîn ku ew qala hin terabytes, petabytes dikin, ku hin supermirov beşdarî sazkirin û pêşvebirina van pergalan bûne, wê hingê bi hatina databasa ClickHouse me amûrek hêsan û têgihîştî ya ku hûn dikarin rêzek pirsgirêkên berê yên negihîştî çareser bikin bi dest xistin. Tişta ku hewce dike yek makîneyek pir navîn û pênc hûrdeman e ku were saz kirin. Ango, me databasek mîna, mînakî, MySql, peyda kir, lê tenê ji bo hilanîna bi mîlyaran tomar! Cûreyek superarchiver bi zimanê SQL. Mîna ku çekên biyaniyan dane mirovan.

Der barê pergala berhevkirina têketinê de

Ji bo berhevkirina agahdarî, pelên têketinê yên IIS-ê yên serîlêdanên webê yên bi formata standard têne bikar anîn (em niha jî bi parvekirina têketinên serîlêdanê re mijûl in, lê armanca meya sereke di qonaxa pîlot de berhevkirina têketinên IIS ye).

Me ji ber sedemên cihêreng nikarîbû bi tevahî dev ji stacka ELK berde, û em berdewam dikin ku hêmanên LogStash û Filebeat bikar bînin, yên ku xwe baş îsbat kirine û pir pêbawer û pêşbînîkirî dixebitin.

Pîlana têketinê ya giştî di wêneya jêrîn de tê xuyang kirin:

Database ClickHouse ji bo Mirovan, an Teknolojiyên Alien

Taybetmendiyek tomarkirina daneyan di databasa ClickHouse de kêmkirina (di çirkeyek de) tomarkirina tomaran de di komikên mezin de ye. Ev, dixuye, beşa herî "pirsgirêk" e ku hûn gava yekem car bi databasa ClickHouse re dixebitin pê re rû bi rû dimînin: pîlan hinekî tevlihevtir dibe.
Pêveka ji bo LogStash, ku rasterast daneyan têxe ClickHouse, li vir gelek alîkarî kir. Ev hêman li ser heman serverê wekî databasê bixwe tê bicîh kirin. Ji ber vê yekê, bi gelemperî, ev nayê pêşniyar kirin ku meriv vê yekê bike, lê ji hêla pratîkî ve, da ku dema ku ew li ser heman serverê tête belav kirin, serverên cûda neafirînin. Me tu têkçûn an nakokiyên çavkaniyê bi databasê re nedît. Digel vê yekê, divê were zanîn ku pêvek di bûyera xeletiyan de mekanîzmayek vegerê heye. Û di bûyera xeletiyan de, pêvek komek daneya ku nekare were danîn li ser dîskê dinivîse (forma pelê hêsan e: piştî guherandinê, hûn dikarin bi hêsanî bi karanîna clickhouse-client koma rastkirî têxin nav xwe).

Navnîşek bêkêmasî ya nermalava ku di nexşeyê de hatî bikar anîn di tabloyê de tê pêşkêş kirin:

Lîsteya nermalava ku tê bikar anîn

Sernav

description

Girêdana belavkirinê

NGINX

Reverse-proxy ji bo sînorkirina gihîştina ji hêla portê û destûrnameya organîzekirinê

Niha di planê de nayê bikaranîn

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

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

FileBeat

Veguheztina pelên pelan.

https://www.elastic.co/downloads/beats/filebeat (belavkirin ji bo Windows 64bit).

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

LogStash

Berhevkarê têketinê.

Ji bo berhevkirina têketinên ji FileBeat, û hem jî ji bo berhevkirina têketinên ji rêza RabbitMQ (ji bo serverên ku di DMZ de ne.) tê bikar anîn.

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

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

Logstash- encam- klîkhouse

Pêveka Loagstash ji bo veguheztina têketinên li databasa ClickHouse bi koman

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

/usr/share/logstash/bin/logstash-plugin logstash-output-clickhouse saz bike

/usr/share/logstash/bin/logstash-plugin logstash-filter-prune saz bike

/usr/share/logstash/bin/logstash-plugin logstash-filter-multiline saz bike

clickhouse

embara têketinê 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

Not. Ji Tebaxa 2018-an pê ve, avahiyên rpm "normal" ji bo RHEL di depoya Yandex de xuya bûn, ji ber vê yekê hûn dikarin wan biceribînin. Di dema sazkirinê de me pakêtên ku ji hêla Altinity ve hatî berhev kirin bikar tînin.

Grafana

Visualization of têketin. Sazkirina dashboardan

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos (64 Bit) - guhertoya herî dawî

Çavkaniya daneyên ClickHouse ji bo Grafana 4.6+

Plugin ji bo Grafana bi çavkaniya daneya ClickHouse

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

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

LogStash

Routerê ji FileBeat berbi rêza RabbitMQ têketin.

Not. Mixabin FileBeat rasterast ji RabbitMQ re dernakeve, ji ber vê yekê girêdanek navîn di forma Logstash de hewce ye

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

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

Rabbit MQ

Dora peyamê. Ev tamponek têketinên di DMZ de ye

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 (Ji bo RabbitMQ Pêdivî ye)

Erlang runtime. Pêdivî ye ku RabbitMQ bixebite

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

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

Veavakirina serverê bi databasa ClickHouse re di tabloya jêrîn de tê pêşkêş kirin:

Sernav

nirxê

bingotin

Guhertin

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

Divê hûn bala xwe bidin serişteyên ji bo karanîna databasa ClickHouse (https://clickhouse.yandex/docs/ru/operations/tips/)

software-wide System

OS: Servera Linux ya Red Hat Enterprise (Maipo)

JRE (Java 8)

 

Wekî ku hûn dikarin bibînin, ev kargehek birêkûpêk e.

Struktura tabloya ji bo hilanîna têketin wiha ye:

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;

Em nirxên xwerû ji bo dabeşkirin (mehane) û granularbûna îndeksê bikar tînin. Hemî zevî bi pratîkî bi têketinên IIS-ê re têkildar in ji bo tomarkirina daxwazên http. Ji hev veqetandî, em destnîşan dikin ku ji bo hilanîna tagên utm qadên cihê hene (ew di qonaxa xistina tabloyê de ji qada rêza pirsê têne pars kirin).

Di heman demê de, gelek qadên pergalê li ser sifrê hatine zêdekirin da ku agahdariya li ser pergal, pêkhate û pêşkêşkeran hilînin. Ji bo ravekirina van qadan, li tabloya jêrîn binêrin. Di yek tabloyê de em têketinên çend pergalan hilînin.

Sernav

description

Nimûne:

fld_app_name

Navê serîlêdanê / pergalê
Nirxên derbasdar:

  • site1.domain.com Malpera derve 1
  • site2.domain.com Malpera derve 2
  • interior-site1.domain.local Malpera navxweyî 1

site1.domain.com

fld_app_module

Modula pergalê
Nirxên derbasdar:

  • web - Malper
  • svc - Karûbarê malpera malperê
  • intgr - Karûbarê yekbûna malperê
  • bo - Rêveber (BackOffice)

tevn

fld_website_name

Navê malperê di IIS de

Gelek pergal dikarin li ser yek serverek, an tewra çend mînakên yek modulek pergalê werin bicîh kirin

web-sereke

fld_server_name

Navê serverê

web1.domain.com

fld_log_file_name

Rêya pelê têketinê li ser serverê

Ji:inetpublogsLogFiles
W3SVC1u_ex190711.log

Ev dihêle hûn di Grafana de grafikên bi bandor ava bikin. Mînakî, daxwazên ji dawiya pêşîn a pergalek taybetî bibînin. Ev di Yandex.Metrica de dişibihe malper counter.

Li vir çend statîstîkên li ser karanîna databasê ji bo du mehan hene.

Hejmara tomar ji hêla pergal û pêkhatê ve

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

Hêjmara daneya dîskê

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.

Rêjeya berhevkirina daneya stûnê

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.

Danasîna pêkhateyên ku hatine bikar anîn

FileBeat. Veguheztina têketinên pelan

Ev pêkhate guheztinên pelên têketinê yên li ser dîskê dişopîne û agahiyê ji LogStash re derbas dike. Li ser hemî serverên ku pelên têketinê têne nivîsandin (bi gelemperî IIS) têne saz kirin. Di moda dûvikê de dixebite (ango, ew tenê tomarên lêzêdekirî vediguhezîne pelê). Lê hûn dikarin wê ji hev veqetînin ku pelên tevahî veguherîne. Dema ku hûn hewce ne ku daneyên mehên berê dakêşin ev hêsan e. Tenê pelê têketinê têxin peldankek û ew ê bi tevahî bixwîne.

Dema ku karûbar disekine, daneyan ji hilanînê bêtir têne veguheztin.

Mîhengek mînakek weha xuya dike:

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. Têketin berhevkar

Ev hêman hatiye sêwirandin ku tomarên têketinê ji FileBeat (an jî bi riya rêzek RabbitMQ) werbigire, parsek bike û wan bi koman bike nav databasa ClickHouse.

Ji bo ku têxin nav ClickHouse, pêveka Logstash-output-clickhouse bikar bînin. Pêveka Logstash mekanîzmayek ji bo vegerandina daxwazan heye, lê di dema sekinandinek birêkûpêk de, çêtir e ku hûn karûbarê bixwe rawestînin. Dema ku were sekinandin, dê peyam di rêza RabbitMQ de kom bibin, ji ber vê yekê heke rawestgeh ji bo demek dirêj be, wê hingê çêtir e ku hûn Filebeats li ser serveran rawestînin. Di pileyek ku RabbitMQ nayê bikar anîn (li ser tora herêmî Filebeat rasterast têketinan ji Logstash re dişîne), Filebeats pir meqbûl û ewledar dixebitin, ji ber vê yekê ji bo wan tunebûna derketinê ti encam nîne.

Mîhengek mînakek weha xuya dike:

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. embara têketinê

Têketinên hemî pergalan di yek tabloyê de têne tomar kirin (li destpêka gotarê binêre). Ew ji bo hilanîna agahdariya li ser daxwazan hatî çêkirin: hemî parametre ji bo formên cihêreng dişibin hev, mînakî têketinên IIS, apache û têketinên nginx. Ji bo têketinên serîlêdanê yên ku, mînakî, xeletî, peyamên agahdarî, hişyarî têne tomar kirin, dê tabloyek cihêreng bi avahiyek guncan were peyda kirin (niha di qonaxa sêwiranê de).

Dema sêwirana tabloyek, pir girîng e ku meriv li ser mifteya bingehîn biryar bide (bi kîjan daneyan dê di hilanînê de werin rêz kirin). Asta berhevkirina daneyê û leza pirsê bi vê yekê ve girêdayî ye. Di mînaka me de, kilît e
SIPARÊZIN BY (fld_app_name, fld_app_module, logdatetime)
Ango bi navê pergalê, navê pêkhateya pergalê û dîroka bûyerê. Di destpêkê de, roja bûyerê yekem bû. Piştî ku ew birin cîhê paşîn, lêpirsînan bi qasî du caran zûtir dest bi xebatê kirin. Guhertina mifteya bingehîn dê ji nû ve çêkirina tabloyê û ji nû ve barkirina daneyan hewce bike da ku ClickHouse dê daneyên li ser dîskê ji nû ve rêz bike. Ev operasyonek dijwar e, ji ber vê yekê tê pêşniyar kirin ku meriv berê bi baldarî li ser tiştê ku divê di bişkojka celebê de tê de were fikirîn.

Di heman demê de divê were zanîn ku celebê daneya LowCardinality di guhertoyên bi nisbeten dawî de xuya bû. Dema ku wê bikar tînin, mezinahiya daneya pêçandî ji bo wan zeviyên ku xwedan kardinalîteya kêm in (çend vebijark) bi tundî kêm dibe.

Em niha guhertoya 19.6 bikar tînin û em plan dikin ku hewl bidin ku guhertoya herî dawî nûve bikin. Mînakî, wan taybetmendiyên ecêb ên wekî Granularity Adaptive, Skipping indeks û kodek DoubleDelta hene.

Bi xwerû, di dema sazkirinê de asta têketinê ya veavakirinê ji bo şopandinê tê danîn. Têketin têne zivirandin û arşîv kirin, lê di heman demê de ew heta gigabyte berfireh dibin. Ger hewce nebe, wê hingê hûn dikarin astê hişyariyê bicîh bikin, wê hingê mezinahiya têketinê pir kêm dibe. Mîhengên têketinê di pelê config.xml de têne destnîşan kirin:

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

Hin fermanên kêrhatî

Поскольку оригинальные пакеты установки собираются по 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. Routerê ji FileBeat berbi rêza RabbitMQ têketin

Ev hêman ji bo rêgirtina têketinên ku ji FileBeat berbi rêza RabbitMQ ve têne bikar anîn. Li vir du xal hene:

  1. Mixabin, FileBeat ji bo nivîsandina rasterast ji RabbitMQ re pêvekek derketinê tune. Û fonksiyonek wusa, ji hêla posta li ser github-a wan ve tête darizandin, ji bo bicîhkirinê nayê plan kirin. Ji bo Kafka pêvekek heye, lê ji ber hin sedeman em bi xwe nikarin wê bikar bînin.
  2. Ji bo berhevkirina têketin di DMZ de hewcedarî hene. Li ser bingeha wan, divê pêşî têketin werin rêz kirin û dûv re LogStash tomarên ji rêzê ji derve dixwîne.

Ji ber vê yekê, bi taybetî ji bo doza serverên ku di DMZ de cih digirin, pêdivî ye ku meriv nexşeyek wusa piçûktir bikar bîne. Mîhengek mînakek weha xuya dike:

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. Dora peyamê

Ev pêkhate ji bo tamponkirina têketinên di DMZ de tê bikar anîn. Tomarkirin bi girêdana Filebeat → LogStash tê kirin. Xwendin ji derveyî DMZ bi rêya LogStash ve tê kirin. Dema ku bi RabbitMQ ve tê xebitandin, di çirkeyê de nêzî 4 hezar peyam têne pêvajoyê.

Rêvekirina peyamê ji hêla navê pergalê ve hatî mîheng kirin, ango, li ser bingeha daneyên veavakirina FileBeat. Hemî peyam diçin yek dorê. Ger ji ber hin sedeman karûbarê rêzgirtinê were sekinandin, ev ê bibe sedema windabûna peyamê: FileBeats dê xeletiyên pêwendiyê werbigire û dê şandina demkî bide sekinandin. Û LogStash, ku ji rêzê dixwîne, dê xeletiyên torê jî werbigire û li benda vegerandina girêdanê bimîne. Di vê rewşê de, bê guman, dê data êdî li ser databasê neyê nivîsandin.

Rêzikên jêrîn ji bo çêkirin û mîhengkirina rêzan têne bikar anîn:

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

Ev hêman ji bo dîtina daneyên çavdêriyê tê bikar anîn. Di vê rewşê de, hûn hewce ne ku çavkaniya daneya ClickHouse ji bo pêveka Grafana 4.6+ saz bikin. Me neçar ma ku wê piçek bişopînin da ku karbidestiya hilanîna fîlterên SQL li ser dashboardê baştir bikin.

Mînakî, em guhêrbaran bikar tînin, û heke ew di qada parzûnê de neyên diyar kirin, wê hingê em dixwazin ku ew şertek di forma WHERE ya formê de çênebe ( uriStem = "AND uriStem != "). Di vê rewşê de, ClickHouse dê stûna uriStem bixwîne. Ji ber vê yekê, me vebijarkên cihêreng ceriband û di dawiyê de pêvek (makroya $valueIfEmpty) rast kir ku di rewşek nirxek vala de 1 vegerîne, bêyî ku behsa stûnê bixwe bike.

Û niha hûn dikarin vê pirsê ji bo grafikê bikar bînin

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

ya ku bi vî rengî li SQL-ê tê veguheztin (bala xwe bidin ku qadên uriStem ên vala bi tenê 1 têne veguheztin)

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

encamê

Xuyabûna databasa ClickHouse di sûkê de bûye bûyerek berbiçav. Zehmet bû ku meriv bifikire ku di yek gavê de, bi tevahî belaş, em bi amûrek hêzdar û pratîkî ya ji bo xebata bi daneyên mezin re çekdar bûn. Bê guman, her ku hewcedarî zêde dibin (mînakî, parvekirin û dubarekirina li ser gelek serveran), dê pilan tevlihevtir bibe. Lê li gorî dîtinên pêşîn, xebata bi vê databasê re pir xweş e. Eşkere ye ku hilber "ji bo mirovan" hatiye çêkirin.

Li gorî ElasticSearch-ê, lêçûna hilanîn û hilanînê, li gorî texmînên pêşîn, pênc û deh carî kêm dibe. Bi gotinek din, heke ji bo hêjeya heyî ya daneyê pêdivî ye ku em komek ji çend makîneyan saz bikin, wê hingê dema ku ClickHouse bikar bînin em tenê hewceyê yek makîneyek kêm-hêza me ne. Erê, bê guman, ElasticSearch di heman demê de mekanîzmayên berhevkirina daneya ser-dîskê û taybetmendiyên din jî hene ku dikarin xerckirina çavkaniyê bi girîngî kêm bikin, lê li gorî ClickHouse ev ê hewceyê lêçûnên mezintir bike.

Bêyî xweşbîniyên taybetî ji hêla me ve, bi mîhengên xwerû, barkirina daneyan û derxistina daneyan ji databasê bi leza ecêb dixebite. Hîn gelek daneya me tune (nêzîkî 200 mîlyon tomar), lê server bixwe qels e. Dibe ku em di pêşerojê de vê amûrê ji bo mebestên din ên ku bi hilanîna têketin re ne têkildar bikar bînin. Mînakî, ji bo analîtîkên dawî-bi-dawî, di warê ewlehiyê de, fêrbûna makîneyê.

Di dawiyê de, hinekî li ser erênî û neyînî.

Минусы

  1. Barkirina tomaran di beşên mezin de. Ji aliyek ve, ev taybetmendiyek e, lê dîsa jî hûn neçar in ku hêmanên zêde bikar bînin da ku tomarên tampon bikin. Ev kar her gav ne hêsan e, lê dîsa jî çareser dibe. Û ez dixwazim planê hêsan bikim.
  2. Hin fonksiyonên biyanî an taybetmendiyên nû bi gelemperî di guhertoyên nû de têk diçin. Ev fikaran zêde dike, daxwaza nûvekirina guhertoyek nû kêm dike. Mînakî, motora tabloya Kafka taybetmendiyek pir bikêr e ku dihêle hûn rasterast bûyeran ji Kafka bixwînin, bêyî ku xerîdar bicîh bînin. Lê li gorî hejmara Pirsgirêkên li ser Github dadbar, em hîn jî ji karanîna vê motorê di hilberînê de hişyar in. Lêbelê, heke hûn tevgerên nişkêve li alîkî nekin û fonksiyona bingehîn bikar bînin, wê hingê ew bi domdarî dixebite.

Плюсы

  1. Hêdî nake.
  2. Rêjeya têketina kêm.
  3. Çavkaniya vekirî.
  4. Belaş.
  5. Scalable (parvekirin / berbelavkirina derveyî qutiyê)
  6. Di nav qeydkirina nermalava rûsî de ku ji hêla Wezareta Ragihandinê ve hatî pêşniyar kirin.
  7. Hebûna piştgiriya fermî ji Yandex.

Source: www.habr.com

Add a comment