Stòr-dàta ClickHouse airson Daoine, no Alien Technologies

Aleksey Lizunov, Ceannard an Ionad Comais airson Sianalan Seirbheis Iomallach de Bhuidheann-stiùiridh Teicneòlas Fiosrachaidh an MKB

Stòr-dàta ClickHouse airson Daoine, no Alien Technologies

Mar roghainn eile an àite stac ELK (ElasticSearch, Logstash, Kibana), tha sinn a’ dèanamh rannsachadh air a bhith a’ cleachdadh stòr-dàta ClickHouse mar stòr dàta airson logaichean.

San artaigil seo, bu mhath leinn bruidhinn mun eòlas a th’ againn air a bhith a’ cleachdadh stòr-dàta ClickHouse agus toraidhean tòiseachaidh na h-obrach pìleat. Bu chòir a thoirt fa-near sa bhad gun robh na toraidhean drùidhteach.


Stòr-dàta ClickHouse airson Daoine, no Alien Technologies

An ath rud, bheir sinn cunntas nas mionaidiche air mar a tha an siostam againn air a rèiteachadh, agus dè na pàirtean a th’ ann. Ach a-nis bu mhath leam bruidhinn beagan mun stòr-dàta seo gu h-iomlan, agus carson as fhiach aire a thoirt dha. Tha an stòr-dàta ClickHouse na stòr-dàta colbhan anailis àrd-choileanaidh bho Yandex. Tha e air a chleachdadh ann an seirbheisean Yandex, an toiseach is e am prìomh stòradh dàta airson Yandex.Metrica. Siostam còd fosgailte, saor an-asgaidh. Bho shealladh leasaiche, bha mi a-riamh a’ faighneachd ciamar a chuir iad an gnìomh e, leis gu bheil dàta air leth mòr ann. Agus tha eadar-aghaidh cleachdaiche Metrica fhèin gu math sùbailte agus luath. Aig a’ chiad eòlas air an stòr-dàta seo, is e a’ bheachd: “Uill, mu dheireadh! Air a dhèanamh dha na daoine! A 'tòiseachadh bhon phròiseas stàlaidh agus a' crìochnachadh le bhith a 'cur iarrtasan.

Tha stairsneach inntrigidh glè ìosal aig an stòr-dàta seo. Faodaidh eadhon leasaiche le sgilean cuibheasach an stòr-dàta seo a chuir a-steach ann am beagan mhionaidean agus tòiseachadh air a chleachdadh. Bidh a h-uile dad ag obair gu soilleir. Faodaidh eadhon daoine a tha ùr do Linux an stàladh a làimhseachadh gu sgiobalta agus na h-obraichean as sìmplidh a dhèanamh. Nam biodh na bu thràithe, leis na faclan Big Data, Hadoop, Google BigTable, HDFS, bha beachdan aig leasaiche àbhaisteach gur ann mu dheidhinn cuid de terabytes, petabytes, a bha cuid de superhumans an sàs ann an suidheachaidhean agus leasachadh nan siostaman sin, an uairsin nuair a thàinig an ClickHouse stòr-dàta, fhuair sinn inneal sìmplidh, so-thuigsinn leis an urrainn dhut raon de ghnìomhan nach deach a choileanadh roimhe fhuasgladh. Cha toir e ach aon inneal meadhanach cuibheasach agus còig mionaidean airson a chuir a-steach. Is e sin, fhuair sinn stòr-dàta mar, mar eisimpleir, MySql, ach a-mhàin airson billeanan de chlàran a stòradh! Sàr-thasglann sònraichte leis a’ chànan SQL. Tha e mar gum biodh buill-airm nan coigreach air an toirt seachad do dhaoine.

Mun t-siostam clàraidh againn

Gus fiosrachadh a chruinneachadh, thathas a’ cleachdadh faidhlichean log IIS de thagraidhean lìn cruth àbhaisteach (tha sinn an-dràsta a’ parsadh logaichean tagraidh, ach is e am prìomh amas aig an ìre pìleat logaichean IIS a chruinneachadh).

Airson diofar adhbharan, cha b’ urrainn dhuinn stac ELK a thrèigsinn gu tur, agus tha sinn a’ leantainn air adhart a’ cleachdadh nam pàirtean LogStash agus Filebeat, a tha air iad fhèin a dhearbhadh gu math agus ag obair gu math earbsach agus ro-innseach.

Tha an sgeama logaidh coitcheann air a shealltainn anns an fhigear gu h-ìosal:

Stòr-dàta ClickHouse airson Daoine, no Alien Technologies

Is e feart de sgrìobhadh dàta gu stòr-dàta ClickHouse gu math tric (aon uair san diog) de chlàran a chuir a-steach ann an baidsean mòra. Is e seo, a rèir coltais, am pàirt as “trioblaideach” a choinnicheas tu nuair a gheibh thu eòlas air a bhith ag obair le stòr-dàta ClickHouse an-toiseach: bidh an sgeama a’ fàs beagan nas iom-fhillte.
Chuidich am plugan airson LogStash, a chuireas a-steach dàta gu dìreach ann an ClickHouse, gu mòr an seo. Tha am pàirt seo air a chleachdadh air an aon fhrithealaiche ris an stòr-dàta fhèin. Mar sin, san fharsaingeachd, chan eilear a’ moladh a dhèanamh, ach bho shealladh practaigeach, gus nach cuir thu a-mach frithealaichean fa leth fhad ‘s a tha e air a chleachdadh air an aon fhrithealaiche. Chan fhaca sinn fàilligidhean no còmhstri ghoireasan sam bith leis an stòr-dàta. A bharrachd air an sin, bu chòir a thoirt fa-near gu bheil inneal ath-chuairteachaidh aig a ’plugan gun fhios nach bi mearachdan ann. Agus ma tha mearachdan ann, bidh am plugan a’ sgrìobhadh gu diosc baidse de dhàta nach gabhadh a chuir a-steach (tha cruth an fhaidhle goireasach: às deidh deasachadh, is urrainn dhut am baidse ceartaichte a chuir a-steach gu furasta le bhith a’ cleachdadh clickhouse-client).

Tha liosta iomlan de bhathar-bog a chaidh a chleachdadh san sgeama air a thaisbeanadh sa chlàr:

Liosta de bhathar-bog a chaidh a chleachdadh

Tiotal

Tuairisgeul

Ceangal sgaoilidh

NGINX

Reverse-proxy gus ruigsinneachd le puirt a chuingealachadh agus ùghdarras a chuir air dòigh

An-dràsta nach eil air a chleachdadh san sgeama

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

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

FileBeat

Gluasad logaichean faidhle.

https://www.elastic.co/downloads/beats/filebeat (inneal cuairteachaidh airson Windows 64bit).

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

logstash

Neach-cruinneachaidh logaichean.

Air a chleachdadh airson logaichean a chruinneachadh bho FileBeat, a bharrachd air a bhith a’ tional logaichean bhon ciudha RabbitMQ (airson frithealaichean a tha san DMZ.)

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

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

Logstash-toradh-clickhouse

Plugin Loagstash airson logaichean a ghluasad gu stòr-dàta ClickHouse ann an baidsean

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

/usr/share/logstash/bin/logstash-plugin stàladh logstash-output-clickhouse

/usr/share/logstash/bin/logstash-plugin stàlaich logstash-filter-prune

/usr/share/logstash/bin/logstash-plugin stàlaich logstash-filter-multiline

Cliog Taigh

Stòradh log https://clickhouse.yandex/docs/ru/

https://packagecloud.io/Altinity/clickhouse/packages/el/7/clickhouse-server-19.5.3.8-1.el7.x86_64.rpm

https://packagecloud.io/Altinity/clickhouse/packages/el/7/clickhouse-client-19.5.3.8-1.el7.x86_64.rpm

Thoir an aire. A’ tòiseachadh bhon Lùnastal 2018, nochd togalaichean rpm “àbhaisteach” airson RHEL ann an stòr Yandex, gus an urrainn dhut feuchainn rin cleachdadh. Aig àm an stàlaidh, bha sinn a’ cleachdadh phasganan a thog Altinity.

grafana

Lèirsinn log. A 'suidheachadh clàran-bùird

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos (64 Bit) - an tionndadh as ùire

Stòr-dàta ClickHouse airson Grafana 4.6+

Plugin airson Grafana le stòr dàta ClickHouse

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

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

logstash

Log router bho FileBeat gu ciudha RabbitMQ.

Thoir an aire. Gu mì-fhortanach, chan eil toradh dìreach aig FileBeat gu RabbitMQ, agus mar sin tha feum air ceangal eadar-mheadhanach ann an cruth Logstash

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

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

CoineanachMQ

ciudha teachdaireachd. Is e seo am bufair log anns an 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 (riatanach airson RabbitMQ)

Erlang ùine ruith. Riatanach airson RabbitMQ a bhith ag obair

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

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

Tha rèiteachadh an fhrithealaiche leis an stòr-dàta ClickHouse air a thaisbeanadh sa chlàr a leanas:

Tiotal

luach

thuirt

Rèiteachadh

HDD: 40GB
RAM: 8GB
Pròiseasar: Core 2 2Ghz

Feumar aire a thoirt do na molaidhean airson a bhith ag obrachadh stòr-dàta ClickHouse (https://clickhouse.yandex/docs/ru/operations/tips/)

Coitcheann bathar-bog siostam

OS: Frithealaiche Red Hat Enterprise Linux (Maipo)

JRE (Java 8)

 

Mar a chì thu, is e stèisean-obrach àbhaisteach a tha seo.

Tha structar a 'bhùird airson logaichean a stòradh mar a leanas:

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;

Bidh sinn a’ cleachdadh sgaradh bunaiteach (a rèir mìos) agus granularity clàr-amais. Tha a h-uile raon gu ìre mhòr a’ freagairt ri inntrigidhean log IIS airson iarrtasan http logadh. Air leth, tha sinn a 'toirt fa-near gu bheil raointean fa leth ann airson utm-tags a stòradh (tha iad air am parsadh aig ìre cuir a-steach don bhòrd bhon raon sreang ceiste).

Cuideachd, chaidh grunn raointean siostam a chuir ris a’ chlàr gus fiosrachadh a stòradh mu shiostaman, co-phàirtean, frithealaichean. Faic an clàr gu h-ìosal airson tuairisgeul air na raointean sin. Ann an aon chlàr, bidh sinn a 'stòradh logaichean airson grunn shiostaman.

Tiotal

Tuairisgeul

Eisimpleir:

fld_app_name

Ainm an tagraidh / an t-siostaim
Luachan dligheach:

  • site1.domain.com Làrach a-muigh 1
  • site2.domain.com Làrach a-muigh 2
  • internal-site1.domain.local Làrach a-staigh 1

làrach1.domain.com

fld_app_modal

Modal siostam
Luachan dligheach:

  • lìn - Làrach-lìn
  • svc - seirbheis làrach-lìn
  • intgr - Seirbheis Lìn Amalachaidh
  • bo - Rianachd (BackOffice)

-lìn

fld_website_name

Ainm na làraich ann an IIS

Faodar grunn shiostaman a chleachdadh air aon fhrithealaiche, no eadhon grunn shuidheachaidhean de aon mhodal siostam

prìomh-lìn

fld_server_name

Ainm an fhrithealaiche

lìn1.domain.com

fld_log_file_name

Slighe chun an fhaidhle log air an fhrithealaiche

C: inetpublogsLogFiles
W3SVC1u_ex190711.log

Leigidh seo leat grafaichean a thogail gu h-èifeachdach ann an Grafana. Mar eisimpleir, faic iarrtasan bho aghaidh siostam sònraichte. Tha seo coltach ris a 'chunntair làraich ann an Yandex.Metrica.

Seo beagan staitistig air cleachdadh an stòr-dàta airson dà mhìos.

An àireamh de chlàran air am briseadh sìos le siostaman agus na co-phàirtean aca

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

An uiread de dhàta air an diosg

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.

An ìre de dhlùthadh dàta ann an colbhan

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.

Tuairisgeul air na co-phàirtean a chaidh a chleachdadh

FileBeat. A 'gluasad logaichean faidhle

Bidh am pàirt seo a’ cumail sùil air atharrachaidhean air faidhlichean loga air diosc agus a’ dol seachad air an fhiosrachadh gu LogStash. Air a chuir a-steach air a h-uile frithealaiche far a bheil faidhlichean log air an sgrìobhadh (mar as trice IIS). Ag obair ann am modh earbaill (ie a’ gluasad dìreach na clàran a bharrachd ris an fhaidhle). Ach fa leth faodar a rèiteachadh gus faidhlichean slàn a ghluasad. Tha seo feumail nuair a dh'fheumas tu dàta a luchdachadh sìos bho mhìosan roimhe. Dìreach cuir am faidhle log ann am pasgan agus leughaidh e e gu h-iomlan.

Nuair a thèid an t-seirbheis a stad, chan eil an dàta air a ghluasad nas fhaide chun stòradh.

Tha suidheachadh eisimpleir a 'coimhead mar seo:

faidhlebeat.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. Neach-cruinneachaidh Logaichean

Tha am pàirt seo air a dhealbhadh gus inntrigidhean log fhaighinn bho FileBeat (no tro ciudha RabbitMQ), a’ parsadh agus a’ cuir a-steach batches a-steach do stòr-dàta ClickHouse.

Airson a chuir a-steach do ClickHouse, thèid am plugan Logstash-output-clickhouse a chleachdadh. Tha inneal ath-iarrtais aig plugan Logstash, ach le dùnadh cunbhalach, tha e nas fheàrr stad a chuir air an t-seirbheis fhèin. Nuair a thèid stad a chuir air, thèid teachdaireachdan a chruinneachadh ann an ciudha RabbitMQ, mar sin ma tha an stad airson ùine mhòr, tha e nas fheàrr stad a chuir air Filebeats air na frithealaichean. Ann an sgeama far nach eilear a’ cleachdadh RabbitMQ (air an lìonra ionadail, bidh Filebeat a’ cur logaichean gu Logstash gu dìreach), bidh Filebeats ag obair gu math iomchaidh agus gu tèarainte, agus mar sin dhaibhsan chan eil an toradh ri fhaighinn a’ dol seachad gun bhuilean.

Tha suidheachadh eisimpleir a 'coimhead mar seo:

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

pìoban.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"

taigh-cliog. Stòradh log

Tha logaichean airson a h-uile siostam air an stòradh ann an aon chlàr (faic aig toiseach an artaigil). Thathas an dùil fiosrachadh a stòradh mu iarrtasan: tha a h-uile paramadair coltach ri diofar chruthan, leithid logaichean IIS, logaichean apache agus nginx. Airson logaichean tagraidh, anns a bheil, mar eisimpleir, mearachdan, teachdaireachdan fiosrachaidh, rabhaidhean air an clàradh, thèid clàr air leth a thoirt seachad leis an structar iomchaidh (aig an ìre dealbhaidh an-dràsta).

Nuair a bhios tu a 'dealbhadh clàr, tha e glè chudromach co-dhùnadh a dhèanamh air a' phrìomh iuchair (leis an tèid an dàta a rèiteachadh aig àm stòraidh). Tha an ìre de dhlùthadh dàta agus astar ceiste an urra ri seo. Anns an eisimpleir againn, is e am prìomh rud
ORDER BY (fld_app_name, fld_app_module, logdatetime)
Is e sin, le ainm an t-siostaim, ainm co-phàirt an t-siostaim agus ceann-latha an tachartais. An toiseach, thàinig ceann-latha an tachartais an toiseach. An dèidh a ghluasad chun an àite mu dheireadh, thòisich fiosan ag obair mu dhà uair cho luath. Gus am prìomh iuchair atharrachadh feumaidh tu an clàr ath-chruthachadh agus an dàta ath-luchdachadh gus an ath-sheòrsaich ClickHouse an dàta air diosc. Is e obair throm a tha seo, agus mar sin is e deagh bheachd a th’ ann smaoineachadh tòrr mu na bu chòir a bhith air a ghabhail a-steach san iuchair seòrsa.

Bu chòir a thoirt fa-near cuideachd gu bheil an seòrsa dàta LowCardinality air nochdadh gu ìre mhath ann an dreachan o chionn ghoirid. Nuair a bhios tu ga chleachdadh, tha meud an dàta teannachaidh air a lughdachadh gu mòr airson na raointean sin aig a bheil cardinality ìosal (glè bheag de roghainnean).

Tha tionndadh 19.6 ga chleachdadh an-dràsta agus tha sinn an dùil feuchainn ri ùrachadh chun dreach as ùire. Tha feartan cho iongantach aca ri Adaptive Granularity, Skipping clàran-amais agus an codec DoubleDelta, mar eisimpleir.

Gu gnàthach, rè an stàlaidh, tha an ìre logaidh air a shuidheachadh gus lorg. Tha na logaichean air an cuairteachadh agus air an tasgadh, ach aig an aon àm leudaichidh iad suas gu gigabyte. Mura h-eil feum air, faodaidh tu an ìre rabhaidh a shuidheachadh, an uairsin tha meud an loga air a lughdachadh gu mòr. Tha an suidheachadh logaidh air a shuidheachadh anns an fhaidhle config.xml:

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

Cuid de òrdughan feumail

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

Tha am pàirt seo air a chleachdadh gus logaichean a ghluasad bho FileBeat gu ciudha RabbitMQ. Tha dà phuing an seo:

  1. Gu mì-fhortanach, chan eil plugan toraidh aig FileBeat airson sgrìobhadh gu dìreach gu RabbitMQ. Agus chan eil an leithid de ghnìomhachd, a’ breithneachadh leis a’ chùis air an github, air a phlanadh airson a bhuileachadh. Tha plugan ann airson Kafka, ach airson adhbhar air choireigin chan urrainn dhuinn a chleachdadh aig an taigh.
  2. Tha riatanasan ann airson logaichean a chruinneachadh anns an DMZ. Stèidhichte orra, feumar na logaichean a chuir ris a’ chiudha an toiseach agus an uairsin leugh LogStash na h-inntrigidhean bhon ciudha bhon taobh a-muigh.

Mar sin, is ann airson a ’chùis far a bheil frithealaichean suidhichte anns an DMZ a dh’ fheumas aon sgeama a tha beagan iom-fhillte a chleachdadh. Tha eisimpleir de rèiteachadh a 'coimhead mar seo:

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

CoineanachMQ. ciudha teachdaireachd

Tha am pàirt seo air a chleachdadh gus inntrigidhean logaichean bufair anns an DMZ. Tha clàradh air a dhèanamh tro ghrunn Filebeat → LogStash. Tha leughadh air a dhèanamh bho thaobh a-muigh an DMZ tro LogStash. Nuair a bhios tu ag obair tro RabboitMQ, bidh timcheall air 4 mìle teachdaireachd gach diog air an giullachd.

Tha slighe teachdaireachd air a rèiteachadh a rèir ainm an t-siostaim, i.e. stèidhichte air dàta rèiteachaidh FileBeat. Bidh a h-uile brath a’ dol gu aon ciudha. Ma thèid an t-seirbheis ciudha a stad airson adhbhar air choireigin, cha lean seo gu call teachdaireachdan: gheibh FileBeats mearachdan ceangail agus cuiridh e stad air cur air falbh airson ùine. Agus gheibh LogStash a leughas bhon ciudha cuideachd mearachdan lìonra agus feitheamh gus an tèid an ceangal ath-nuadhachadh. Anns a 'chùis seo, cha tèid an dàta, gu dearbh, a sgrìobhadh chun stòr-dàta tuilleadh.

Tha an stiùireadh a leanas air a chleachdadh gus ciudha a chruthachadh agus a rèiteachadh:

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

Tha am pàirt seo air a chleachdadh gus dàta sgrùdaidh fhaicinn. Anns a ’chùis seo, feumaidh tu an stòr-dàta ClickHouse a stàladh airson plugan Grafana 4.6+. Bha againn ri beagan tweak a dhèanamh air gus èifeachdas giollachd sìoltachain SQL air an deas-bhòrd a leasachadh.

Mar eisimpleir, bidh sinn a’ cleachdadh caochladairean, agus mura h-eil iad air an suidheachadh anns an raon sìoltachain, bu mhath leinn gun a bhith a’ gineadh suidheachadh ann an WHERE of the form ( uriStem = » AGUS uriStem ! = » ). Anns a’ chùis seo, leughaidh ClickHouse an colbh uriStem. San fharsaingeachd, dh’ fheuch sinn ri diofar roghainnean agus mu dheireadh cheartaich sinn am plugan (am macro $valueIfEmpty) gus an till e 1 a thaobh luach falamh, gun luaidh air a’ cholbh fhèin.

Agus a-nis faodaidh tu a’ cheist seo a chleachdadh airson a’ ghraf

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

a tha ag eadar-theangachadh don SQL seo (thoir an aire gu bheil na raointean uriStem falamh air an atharrachadh gu dìreach 1)

SELECT
t,
groupArray((response, c)) AS groupArr
FROM (
SELECT
(intDiv(toUInt32(logdatetime), 60) * 60) * 1000 AS t, response,
count(*) AS c FROM default.log_web
WHERE (logdate >= toDate(1565061982)) AND (logdatetime >= toDateTime(1565061982)) AND 1 AND (fld_app_name = 'site1.domain.ru') AND (fld_app_module = 'web') AND 1 AND 1 AND 1
GROUP BY
t, response
ORDER BY
t ASC,
response ASC
)
GROUP BY t ORDER BY t ASC

co-dhùnadh

Tha coltas stòr-dàta ClickHouse air a thighinn gu bhith na thachartas sònraichte sa mhargaidh. Bha e duilich a shamhlachadh, gu tur an-asgaidh, gun robh sinn sa bhad armaichte le inneal cumhachdach agus practaigeach airson a bhith ag obair le dàta mòr. Gu dearbh, le feumalachdan a tha a 'sìor fhàs (mar eisimpleir, sgoltadh agus ath-riochdachadh gu iomadh seirbheisiche), bidh an sgeama a' fàs nas iom-fhillte. Ach air a 'chiad bheachdan, tha e glè thlachdmhor a bhith ag obair leis an stòr-dàta seo. Chìthear gu bheil an toradh air a dhèanamh "airson daoine."

An coimeas ri ElasticSearch, thathas a’ meas gun tèid cosgais stòradh agus giullachd logaichean a lughdachadh còig gu deich tursan. Ann am faclan eile, ma dh’ fheumadh sinn grunn innealan a stèidheachadh airson an ìre dàta a th ’ann an-dràsta, an uairsin nuair a bhios sinn a’ cleachdadh ClickHouse, tha aon inneal cumhachd ìosal gu leòr dhuinn. Tha, gu dearbh, tha innealan teannachaidh dàta air-diosg agus feartan eile aig ElasticSearch a dh’ fhaodadh caitheamh ghoireasan a lughdachadh gu mòr, ach an taca ri ClickHouse, bidh seo nas daoire.

Às aonais optimizations sònraichte sam bith air ar taobh, air na roghainnean bunaiteach, bidh luchdachadh dàta agus taghadh bhon stòr-dàta ag obair aig astar iongantach. Chan eil mòran dàta againn fhathast (mu 200 millean clàr), ach tha am frithealaiche fhèin lag. Faodaidh sinn an inneal seo a chleachdadh san àm ri teachd airson adhbharan eile nach eil co-cheangailte ri bhith a’ stòradh logaichean. Mar eisimpleir, airson mion-sgrùdadh deireadh-gu-deireadh, ann an raon tèarainteachd, ionnsachadh innealan.

Aig a 'cheann thall, beagan mu na buannachdan agus na cunntasan.

Минусы

  1. A luchdachadh a-nuas clàr ann am buidhnean mòra. Air an aon làimh, is e feart a tha seo, ach feumaidh tu fhathast co-phàirtean a bharrachd a chleachdadh airson clàran buffering. Chan eil an obair seo an-còmhnaidh furasta, ach tha e fhathast ri fhuasgladh. Agus bu mhath leam an sgeama a dhèanamh nas sìmplidhe.
  2. Bidh cuid de ghnìomhachd exotic no feartan ùra gu tric a’ briseadh ann an dreachan ùra. Tha seo ag adhbhrachadh dragh, a 'lùghdachadh a' mhiann airson ùrachadh gu dreach ùr. Mar eisimpleir, tha einnsean clàr Kafka na fheart glè fheumail a leigeas leat tachartasan Kafka a leughadh gu dìreach, gun a bhith a’ cur an gnìomh luchd-cleachdaidh. Ach a 'breithneachadh leis an àireamh de chùisean air an github, tha sinn fhathast faiceallach gun a bhith a' cleachdadh an einnsean seo ann an riochdachadh. Ach, mura dèan thu gluasadan gu h-obann air an taobh agus a 'cleachdadh a' phrìomh dhleastanas, bidh e ag obair gu seasmhach.

Плюсы

  1. Chan eil e nas slaodaiche.
  2. Ìre inntrigidh ìosal.
  3. Stòr fosgailte.
  4. Saor.
  5. Sgèile gu math (sgrìobadh / ath-riochdachadh a-mach às a’ bhogsa)
  6. Air a ghabhail a-steach sa chlàr de bhathar-bog Ruiseanach a mhol Ministrealachd a’ Chonaltraidh.
  7. Tha làthaireachd oifigeil taic bho Yandex.

Source: www.habr.com

Cuir beachd ann